diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.classpath b/bundles/org.eclipse.wst.jsdt.debug.crossfire/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.options b/bundles/org.eclipse.wst.jsdt.debug.crossfire/.options
deleted file mode 100644
index d2ba021..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.options
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-#option file for tracing options for Crossfire debugger port
-org.eclipse.wst.jsdt.debug.crossfire/debug=true
-
-#option to trace packets being sent / received
-org.eclipse.wst.jsdt.debug.crossfire/packets=false
-
-#option to trace the event queue
-org.eclipse.wst.jsdt.debug.crossfire/eventqueue=false
-
-#option to trace the jsdi impl* elements
-org.eclipse.wst.jsdt.debug.crossfire/jsdi=false
-
-#option to trace the JSON parser
-org.eclipse.wst.jsdt.debug.crossfire/json=false
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.project b/bundles/org.eclipse.wst.jsdt.debug.crossfire/.project
deleted file mode 100644
index 243de54..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.internal.crossfire</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.crossfire/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.crossfire/META-INF/MANIFEST.MF
deleted file mode 100644
index aba89eb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.crossfire;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.crossfire.CrossFirePlugin
-Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.wst.jsdt.debug.core;bundle-version="1.0.0",
- org.eclipse.wst.jsdt.debug.transport;bundle-version="1.0.0",
- org.eclipse.wst.jsdt.core;bundle-version="1.0.0",
- org.eclipse.debug.core
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.internal.crossfire;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.crossfire.connect;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.crossfire.event;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.crossfire.request;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.crossfire.transport;x-internal:=true
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.crossfire/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 85bd94b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Bundle-Vendor = Eclipse Web Tools Platform
-Bundle-Name = Crossfire JavaScript Debug
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/build.properties b/bundles/org.eclipse.wst.jsdt.debug.crossfire/build.properties
deleted file mode 100644
index bbeeaf1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               OSGI-INF/l10n/bundle.properties
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.crossfire/plugin.xml
deleted file mode 100644
index e232ba6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/plugin.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.crossfire.connect.CrossfireListeningConnector"
-            id="crossfire.remote.listen.connector">
-      </connector>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.crossfire.connect.CrossfireAttachingConnector"
-            id="crossfire.remote.attach.connector">
-      </connector>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Constants.java
deleted file mode 100644
index cd50734..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Constants.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire;
-
-/**
- * Constants for the bundle
- * 
- * @since 1.0
- */
-public interface Constants {
-
-	/**
-	 * Constant representing a space
-	 */
-	public static final String SPACE = " "; //$NON-NLS-1$
-	/**
-	 * Constant representing a colon.<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant representing the empty string
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant <br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-	public static String URI_FILE_SCHEME = "file"; //$NON-NLS-1$
-	public static final String UNKNOWN = "unknown"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/CrossFirePlugin.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/CrossFirePlugin.java
deleted file mode 100644
index 025357d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/CrossFirePlugin.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.eclipse.wst.jsdt.debug.internal.crossfire;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.event.CFEventQueue;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFMirror;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFPacket;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-/**
- * Crossfire {@link BundleActivator}
- * 
- * @since 1.0
- */
-public class CrossFirePlugin extends Plugin {
-
-	/**
-	 * Id of the bundle
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.crossfire"; //$NON-NLS-1$
-	/**
-	 * CFPacket tracing option name
-	 */
-	public static final String TRC_PACKETS = PLUGIN_ID + "/packets"; //$NON-NLS-1$
-	/**
-	 * CFEventPacket queue tracing option name
-	 */
-	public static final String TRC_EVENTQUEUE = PLUGIN_ID + "/eventqueue"; //$NON-NLS-1$
-	/**
-	 * JSDI implementation tracing option name
-	 */
-	public static final String TRC_JSDI = PLUGIN_ID + "/jsdi"; //$NON-NLS-1$
-	/**
-	 * JSON parser tracing option
-	 */
-	public static final String TRC_JSON = PLUGIN_ID + "/json"; //$NON-NLS-1$
-	
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	
-	private static CrossFirePlugin plugin = null;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext bundleContext) throws Exception {
-		super.start(bundleContext);
-		plugin = this;
-		configureTracing();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext bundleContext) throws Exception {
-		try {
-			plugin = null;
-		}
-		finally {
-			super.stop(bundleContext);
-		}
-	}
-	
-	/**
-	 * @return the singleton instance
-	 */
-	public static CrossFirePlugin getDefault() {
-		return plugin;
-	}
-	
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Crossfire Debug: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from Crossfire Debug: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-
-	/**
-	 * Turns on / off any tracing options
-	 */
-	public void configureTracing() {
-		if(CrossFirePlugin.getDefault().isDebugging()) {
-			String option = Platform.getDebugOption(TRC_PACKETS);
-			if(option != null) {
-				CFPacket.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_EVENTQUEUE);
-			if(option != null) {
-				CFEventQueue.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_JSDI);
-			if(option != null) {
-				CFMirror.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_JSON);
-			if(option != null) {
-				JSON.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-		}
-	}
-	
-	/**
-	 * Creates a new {@link URI} with the <code>file</code> scheme
-	 * @param path
-	 * @return a new {@link URI}
-	 * @throws URISyntaxException
-	 */
-	public static URI fileURI(IPath path) throws URISyntaxException {
-		return new URI(Constants.URI_FILE_SCHEME, null, path.makeAbsolute().toString(), null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Tracing.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Tracing.java
deleted file mode 100644
index 5bbb1c0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Tracing.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire;
-
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-
-/**
- * Helper class for common tracing functions
- * 
- * @since 1.0
- */
-public class Tracing {
-
-	public static final String PRINTABLE_LINE_FEED = "\\\\r\\\\n"; //$NON-NLS-1$
-	
-	/**
-	 * Writes the string to system out cleaning it of control chars before printing it
-	 * 
-	 * @param string
-	 */
-	public static void writeString(String string) {
-		String s = string.replaceAll(JSON.LINE_FEED, PRINTABLE_LINE_FEED);
-		s = s.replaceAll("\r", "\\\\r");  //$NON-NLS-1$//$NON-NLS-2$
-		s = s.replaceAll("\n", "\\\\n");  //$NON-NLS-1$//$NON-NLS-2$
-		System.out.println("[CROSSFIRE]" + s); //$NON-NLS-1$
-	}
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/BrowserArgument.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/BrowserArgument.java
deleted file mode 100644
index 63e4915..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/BrowserArgument.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument;
-
-/**
- * Option to automatically launch the browser and connect to it
- * 
- * @since 1.0
- */
-public class BrowserArgument implements BooleanArgument {
-
-	/**
-	 * name of the argument
-	 */
-	public static final String BROWSER = "browser"; //$NON-NLS-1$
-	
-	private boolean doit = false; 
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.auto_attach_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.auto_attach_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return BROWSER;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		doit = Boolean.valueOf(value).booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Boolean.toString(doit);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return doit;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#setValue(boolean)
-	 */
-	public void setValue(boolean booleanValue) {
-		doit = booleanValue;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CompatArgument.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CompatArgument.java
deleted file mode 100644
index e995ab1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CompatArgument.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument;
-
-/**
- * Launch option to support pre-0.3 packet forms
- * 
- * @since 1.0
- */
-public class CompatArgument implements BooleanArgument {
-
-	public static final String PRE03 = "pre03"; //$NON-NLS-1$
-	
-	private boolean doit =  false;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.pre_3_support_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.pre_3_support_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PRE03;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		doit = Boolean.valueOf(value).booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Boolean.toString(doit);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return doit;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#setValue(boolean)
-	 */
-	public void setValue(boolean booleanValue) {
-		doit = booleanValue;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CrossfireAttachingConnector.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CrossfireAttachingConnector.java
deleted file mode 100644
index bba1d82..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CrossfireAttachingConnector.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.connect;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFVirtualMachine;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFTransportService;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-/**
- * Attaching connector for Crossfire
- * 
- * @since 1.0
- */
-public class CrossfireAttachingConnector implements AttachingConnector {
-
-	public static final String CROSSFIRE_REMOTE_ATTACH_CONNECTOR_ID = "crossfire.remote.attach.connector"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public CrossfireAttachingConnector() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		HashMap args = new HashMap(5);
-		args.put(HostArgument.HOST, new HostArgument(null));
-		args.put(PortArgument.PORT, new PortArgument(5000));
-		args.put(TimeoutArgument.TIMEOUT, new TimeoutArgument());
-		args.put(CompatArgument.PRE03, new CompatArgument());
-		//XXX hack because there is no good way to find the Firefox executable on Win
-		if(!Platform.OS_WIN32.equals(Platform.getOS())) {
-			args.put(BrowserArgument.BROWSER, new BrowserArgument());
-		}
-		return args;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.attach_connector_desc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.crossfire_remote_attach;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return CROSSFIRE_REMOTE_ATTACH_CONNECTOR_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector#attach
-	 * (java.util.Map)
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException {
-		String str = (String) arguments.get(BrowserArgument.BROWSER);
-		//XXX hack because there is no good way to find the Firefox executable on Win
-		boolean browser = Boolean.valueOf(str).booleanValue() && !Platform.OS_WIN32.equals(Platform.getOS());
-		if (browser && !HostArgument.isLocalhost((String) arguments.get(HostArgument.HOST))) {
-			// we cannot auto launch the browser on a different host
-			throw new IOException(Messages.cannot_launch_browser_not_localhost);
-		}
-		Connection c = null;
-		if (browser) {
-			c = launchForBrowser(arguments);
-		} else {
-			c = launch(arguments);
-		}
-		DebugSession session = new DebugSession(c);
-		String pre03 = (String) arguments.get(CompatArgument.PRE03);
-		if(pre03 != null) {
-			JSON.setPre03Compat(Boolean.valueOf(pre03).booleanValue());
-		}
-		return new CFVirtualMachine(session);
-	}
-
-	/**
-	 * Launches the browser and connects to it. This method will poll for the
-	 * browser to be launched but only for a fixed timeout.
-	 * 
-	 * @param arguments
-	 * @return the created connection or <code>null</code> if the attempt to
-	 *         connect times out, the browser process terminates before we can
-	 *         connect
-	 * @throws IOException
-	 */
-	Connection launchForBrowser(final Map arguments) throws IOException {
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		StringBuffer buffer = new StringBuffer("firefox -ProfileManager -load-fb-modules -crossfire-server-port ").append(port); //$NON-NLS-1$
-		Process p = Runtime.getRuntime().exec(buffer.toString());
-		TransportService service = new CFTransportService();
-		String timeoutstr = (String) arguments.get(TimeoutArgument.TIMEOUT);
-		int timeout = Integer.parseInt(timeoutstr);
-		buffer = new StringBuffer();
-		buffer.append(host).append(':').append(Integer.parseInt(port));
-		long timer = System.currentTimeMillis() + 20000;
-		Connection c = null;
-		while (p != null && System.currentTimeMillis() < timer && c == null) {
-			try {
-				c = service.attach(buffer.toString(), timeout,timeout);
-			} catch (IOException ioe) {
-				// ignore while pinging to connect
-				try {
-					Thread.sleep(200);
-				} catch (InterruptedException e) {
-					//do nothing
-				}
-			}
-		}
-		if (c == null) {
-			throw new IOException(NLS.bind(Messages.failed_to_attach_to_auto_browser, new String[] {host, port }));
-		}
-		return c;
-	}
-
-	/**
-	 * Tries to connect to the given
-	 * 
-	 * @param arguments
-	 * @return the {@link Connection} or throws an exception
-	 * @throws IOException
-	 */
-	Connection launch(Map arguments) throws IOException {
-		TransportService service = new CFTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		String timeoutstr = (String) arguments.get(TimeoutArgument.TIMEOUT);
-		int timeout = Integer.parseInt(timeoutstr);
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(host).append(':').append(Integer.parseInt(port));
-		return service.attach(buffer.toString(), timeout, timeout);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CrossfireListeningConnector.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CrossfireListeningConnector.java
deleted file mode 100644
index ee0d8a8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/CrossfireListeningConnector.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.connect;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFVirtualMachine;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFTransportService;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-/**
- * Default launching connector for CrossFire
- * 
- * @since 1.0
- */
-public class CrossfireListeningConnector implements ListeningConnector {
-	
-	/**
-	 * The id of the connector
-	 */
-	public static final String CROSSFIRE_REMOTE_ATTACH_CONNECTOR_ID = "crossfire.remote.listen.connector"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public CrossfireListeningConnector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		HashMap args = new HashMap(5);
-		args.put(HostArgument.HOST, new HostArgument(null));
-		args.put(PortArgument.PORT, new PortArgument(5000));
-		args.put(TimeoutArgument.TIMEOUT, new TimeoutArgument());
-		args.put(CompatArgument.PRE03, new CompatArgument());
-		return args;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.attach_connector_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.attach_connector_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return CROSSFIRE_REMOTE_ATTACH_CONNECTOR_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector#accept(java.util.Map)
-	 */
-	public VirtualMachine accept(Map arguments) throws IOException {
-		TransportService service = new CFTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		String timeoutstr = (String) arguments.get(TimeoutArgument.TIMEOUT);
-		int timeout = Integer.parseInt(timeoutstr);
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(host).append(':').append(Integer.parseInt(port));
-		Connection c = service.accept(service.startListening(buffer.toString()), timeout, timeout);
-		DebugSession session = new DebugSession(c);
-		String pre03 = (String) arguments.get(CompatArgument.PRE03);
-		if(pre03 != null) {
-			JSON.setPre03Compat(Boolean.valueOf(pre03).booleanValue());
-		}
-		return new CFVirtualMachine(session);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/HostArgument.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/HostArgument.java
deleted file mode 100644
index e188a79..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/HostArgument.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-import org.eclipse.wst.jsdt.debug.transport.Constants;
-
-/**
- * Implementation of a string argument that describes the host argument
- * 
- * @since 1.0
- */
-public class HostArgument implements StringArgument {
-
-	private static final long serialVersionUID = 3057403815318177030L;
-	private String host;
-
-	/**
-	 * Host attribute name
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param host
-	 */
-	public HostArgument(String host) {
-		setValue(host);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.host_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.host_arg_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return HOST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String host) {
-		if(host == null) {
-			this.host = Constants.LOCALHOST;
-		}
-		else {
-			if (!isValid(host)) {
-				throw new IllegalArgumentException();
-			}
-			this.host = host;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return host;
-	}
-
-	/**
-	 * Returns if the given host is <code>localhost</code> or <code>127.0.0.1</code>
-	 * @param host
-	 * @return true if the given host it localhost (127.0.0.1) false otherwise
-	 */
-	public static boolean isLocalhost(String host) {
-		return host.equals(Constants.LOCALHOST) || host.equals(Constants.LOCALHOST_IP);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/Messages.java
deleted file mode 100644
index 39fc4d5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.crossfire.connect.messages"; //$NON-NLS-1$
-	public static String attach_connector_desc;
-	public static String attach_connector_name;
-	public static String auto_attach_desc;
-	public static String auto_attach_label;
-	public static String cannot_launch_browser_not_localhost;
-	public static String crossfire_remote_attach;
-	public static String failed_to_attach_to_auto_browser;
-	public static String host_arg_desc;
-	public static String host_arg_name;
-	public static String port_arg_desc;
-	public static String port_arg_name;
-	public static String pre_3_support_desc;
-	public static String pre_3_support_name;
-	public static String timeout;
-	public static String timeout_desc;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/PortArgument.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/PortArgument.java
deleted file mode 100644
index ced215f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.port_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.port_arg_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/TimeoutArgument.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/TimeoutArgument.java
deleted file mode 100644
index c622e8b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/TimeoutArgument.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Argument used to specify a timeout (in ms)
- * 
- * @since 1.1
- */
-public class TimeoutArgument implements IntegerArgument {
-	
-	/**
-	 * Argument to specify a timeout
-	 */
-	public static final String TIMEOUT = "timeout"; //$NON-NLS-1$
-	/**
-	 * default connecting timeout
-	 */
-	public static final Integer CONNECT_TIMEOUT = new Integer(30000);
-	
-	/**
-	 * The timeout
-	 */
-	private int timeout = 0;
-	
-	/**
-	 * Constructor
-	 */
-	public TimeoutArgument() {
-		setValue(CONNECT_TIMEOUT.intValue());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.timeout_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.timeout;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return TIMEOUT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			timeout = Integer.parseInt(value);
-		}
-		catch(NumberFormatException nfe) {
-			//do nothing the new value will not be set
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(timeout);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return timeout;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			return Integer.parseInt(value) > 0;
-		}
-		catch(NumberFormatException bfe) {
-			//do nothing, just not valid
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int intValue) {
-		timeout = intValue;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/messages.properties
deleted file mode 100644
index dbfca1e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/messages.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-attach_connector_desc=Allows you to connect to a Mozilla-based browser with the CrossFire extension installed
-attach_connector_name=CrossFire - Remote Listen
-auto_attach_desc=Automatically launch Firefox and attach to it
-auto_attach_label=Auto&matically launch Firefox and attach to it (extremely experimental)
-cannot_launch_browser_not_localhost=You cannot launch a browser on a different host than localhost (127.0.0.1)
-crossfire_remote_attach=Crossfire - Remote Attach
-failed_to_attach_to_auto_browser=Failed to attach to debugger at {0} on port {1}
-host_arg_desc=The name of the host address to try attaching to.
-host_arg_name=&Host:
-port_arg_desc=The port on the host machine to try attaching to.
-port_arg_name=&Port:
-pre_3_support_desc=Enables support for Crossfire versions less than 0.3
-pre_3_support_name=&Enable support for Crossfire versions less than 0.3
-timeout=&Timeout (ms):
-timeout_desc=A timeout value in milliseconds to wait for a debugger to connect
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFBreakpointEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFBreakpointEvent.java
deleted file mode 100644
index 0b6c55d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFBreakpointEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link BreakpointEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFBreakpointEvent extends CFLocatableEvent implements BreakpointEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 */
-	public CFBreakpointEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request, thread, location);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFDebuggerStatementEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFDebuggerStatementEvent.java
deleted file mode 100644
index 463bcf9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFDebuggerStatementEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link DebuggerStatementEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFDebuggerStatementEvent extends CFLocatableEvent implements DebuggerStatementEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 */
-	public CFDebuggerStatementEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request, thread, location);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEvent.java
deleted file mode 100644
index 1e9d2f5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEvent.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of an {@link CFEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFEvent implements Event {
-
-	private VirtualMachine vm = null;
-	private EventRequest request = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param request
-	 */
-	public CFEvent(VirtualMachine vm, EventRequest request) {
-		this.vm = vm;
-		this.request = request;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.Event#request()
-	 */
-	public EventRequest request() {
-		return request;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventQueue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventQueue.java
deleted file mode 100644
index e6c9641..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventQueue.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.CrossFirePlugin;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFLocation;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFMirror;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFScriptReference;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFThreadReference;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFVirtualMachine;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFEventPacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Default {@link EventQueue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFEventQueue extends CFMirror implements EventQueue {
-
-	private static boolean TRACE = false;
-	
-	private EventRequestManager eventmgr = null;
-	private boolean disposed = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param manager
-	 */
-	public CFEventQueue(CFVirtualMachine vm, EventRequestManager manager) {
-		super(vm);
-		this.eventmgr = manager;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove()
-	 */
-	public EventSet remove() {
-		return remove(-1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove(int)
-	 */
-	public EventSet remove(int timeout) {
-		try {
-			while(true && !disposed) {
-				CFEventPacket event = crossfire().receiveEvent(timeout);
-				String name = event.getEvent();
-				CFEventSet set = new CFEventSet(crossfire());
-				if(CFEventPacket.CLOSED.equals(name)) {
-					List deaths = eventmgr.vmDeathRequests();
-					for (Iterator iter = deaths.iterator(); iter.hasNext();) {
-						VMDeathRequest request = (VMDeathRequest) iter.next();
-						set.add(new CFVMDeathEvent(crossfire(), request));
-					}
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.CLOSED+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-				else if(CFEventPacket.ON_BREAK.equals(name)) {
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_BREAK+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					String threadid = event.getContextId();
-					if(threadid != null) {
-						CFThreadReference thread = crossfire().findThread(threadid);
-						set.setThread(thread);
-						if(thread != null && !thread.isSuspended()) {
-							List suspends = eventmgr.suspendRequests();
-							for (Iterator iter = suspends.iterator(); iter.hasNext();) {
-								SuspendRequest request = (SuspendRequest) iter.next();
-								String url = (String) event.getBody().get(Attributes.URL);
-								Number line = (Number) event.getBody().get(Attributes.LINE);
-								CFScriptReference script = crossfire().findScript(url);
-								if(script != null) {
-									CFLocation loc = new CFLocation(crossfire(), script, null, line.intValue());
-									set.add(new CFSuspendEvent(crossfire(), request, thread, loc));
-								}
-							}
-							thread.markSuspended(true);
-						}
-						else {
-							return null;
-						}
-					}
-					else {
-						return null;
-					}
-				}
-				else if(CFEventPacket.ON_RESUME.equals(name)) {
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_RESUME+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					String threadid = event.getContextId();
-					if(threadid != null) {
-						CFThreadReference thread = crossfire().findThread(threadid);
-						if(thread != null) {
-							set.setThread(thread);
-							List resumes = eventmgr.resumeRequests();
-							for (Iterator iter = resumes.iterator(); iter.hasNext();) {
-								ResumeRequest request = (ResumeRequest) iter.next();
-								if(request.thread().equals(thread)) {
-									CFLocation loc = new CFLocation(crossfire(), null, null, 0);
-									set.add(new CFResumeEvent(crossfire(), request, thread, loc));
-								}
-							}
-						}
-						else {
-							return null;
-						}
-					}
-					else {
-						return null;
-					}
-				}
-				else if(CFEventPacket.ON_SCRIPT.equals(name)) {
-					ThreadReference thread = crossfire().findThread(event.getContextId());
-					if(thread != null) {
-						set.setThread(thread);
-						Map json = (Map) event.getBody().get(Attributes.SCRIPT);
-						if(json != null) {
-							CFScriptReference script = crossfire().addScript(event.getContextId(), json);
-							List scripts = eventmgr.scriptLoadRequests();
-							for (Iterator iter = scripts.iterator(); iter.hasNext();) {
-								ScriptLoadRequest request = (ScriptLoadRequest) iter.next();
-								set.add(new CFScriptLoadEvent(crossfire(), request, thread, script));
-							}
-						}
-						else {
-							return null;
-						}
-					}
-					else {
-						return null;
-					}
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_SCRIPT+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-				else if(CFEventPacket.ON_CONTEXT_CREATED.equals(name)) {
-					handleContext(set, event, false);
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONTEXT_CREATED+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-				else if(CFEventPacket.ON_CONTEXT_CHANGED.equals(name)) {
-					handleContext(set, event, true);
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONTEXT_CHANGED+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-				else if(CFEventPacket.ON_CONTEXT_LOADED.equals(name)) {
-					handleContext(set, event, true);
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONTEXT_LOADED+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-				else if(CFEventPacket.ON_CONTEXT_DESTROYED.equals(name)) {
-					ThreadReference thread = crossfire().findThread(event.getContextId());
-					crossfire().removeThread(event.getContextId());
-					crossfire().removeScriptsForContext(event.getContextId());
-					if(thread != null) {
-						List threads = eventmgr.threadExitRequests();
-						for (Iterator iter = threads.iterator(); iter.hasNext();) {
-							ThreadExitRequest request = (ThreadExitRequest) iter.next();
-							set.add(new CFThreadExitEvent(crossfire(), request, thread));
-						}
-					}
-					else {
-						return null;
-					}
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONTEXT_DESTROYED+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-				else if(CFEventPacket.ON_CONSOLE_DEBUG.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.DATA);
-					if(info != null) {
-						log(IStatus.INFO, info);
-					}
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONSOLE_DEBUG+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return null;
-				}
-				else if(CFEventPacket.ON_CONSOLE_ERROR.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.VALUE);
-					if(info != null) {
-						log(IStatus.ERROR, info);
-					}
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONSOLE_ERROR+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return null;
-				}
-				else if(CFEventPacket.ON_CONSOLE_INFO.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.DATA);
-					if(info != null) {
-						log(IStatus.INFO, info);
-					}
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONSOLE_INFO+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return null;
-				}
-				else if(CFEventPacket.ON_CONSOLE_LOG.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.DATA);
-					if(info != null) {
-						log(IStatus.INFO, info);
-					}
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONSOLE_LOG+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return null;
-				}
-				else if(CFEventPacket.ON_CONSOLE_WARN.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.DATA);
-					if(info != null) {
-						log(IStatus.WARNING, info);
-					}
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONSOLE_WARN+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return null;
-				}
-				else if(CFEventPacket.ON_INSPECT_NODE.equals(name)) {
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_INSPECT_NODE+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return null;
-				}
-				else if(CFEventPacket.ON_TOGGLE_BREAKPOINT.equals(name)) {
-					/*Map body = event.getBody();
-					String url = (String) body.get(Attributes.URL);
-					if(url != null) {
-						String path = JavaScriptDebugPlugin.findExternalScriptPathFromURI(url);
-						if(path != null) {
-							IFile file = (IFile) JavaScriptDebugPlugin.getExternalSourceProject(false).findMember(new Path(path));
-							if(file != null && file.isAccessible()) {
-								boolean isset = ((Boolean)body.get(Attributes.SET)).booleanValue();
-								if(!isset) {
-									
-								}
-								else {
-									int line = -1;
-									Number lineno = (Number) body.get(Attributes.LINE);
-									if(lineno != null) {
-										line = lineno.intValue();
-									}
-									if(line > -1) { 
-										Map attribs = new HashMap();
-										attribs.put(IJavaScriptBreakpoint.SCRIPT_PATH, body.get(Attributes.URL));
-										try {
-											JavaScriptDebugModel.createLineBreakpoint(file, line, -1, -1, attribs, true);
-										}
-										catch(DebugException de) {}
-									}
-								}
-							}
-						}
-					}*/
-					if(TRACE) {
-						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_TOGGLE_BREAKPOINT+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return null;
-				}
-				else {
-					if(TRACE) {
-						Tracing.writeString("QUEUE [unknown event - "+name+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-				if (set.isEmpty()) {
-					set.resume();
-					continue;
-				}
-				return set;
-			}
-		}
-		catch(DisconnectedException de) {
-			if(TRACE) {
-				Tracing.writeString("QUEUE [disconnect exception]: "+de.getMessage()); //$NON-NLS-1$
-			}
-			crossfire().disconnectVM();
-			handleException(de.getMessage(), (de.getCause() == null ? de : de.getCause()));
-		}
-		catch(TimeoutException te) {
-			CrossFirePlugin.log(te);
-		}
-		return null;
-	}
-	
-	/**
-	 * Logs the entry from the queue
-	 * 
-	 * @param kind
-	 * @param objects
-	 */
-	void log(int kind, List objects) {
-		IStatus status = null;
-		if(objects.size() > 1) {
-			MultiStatus mstatus = new MultiStatus(CrossFirePlugin.PLUGIN_ID, kind, "Messages logged from Crossfire", null); //$NON-NLS-1$
-			for (Iterator i = objects.iterator(); i.hasNext();) {
-				mstatus.add(new Status(kind, CrossFirePlugin.PLUGIN_ID, i.next().toString()));
-			}
-			status = mstatus;
-		}
-		else if(objects.size() == 1) {
-			status = new Status(kind, CrossFirePlugin.PLUGIN_ID, objects.iterator().next().toString());
-		}
-		if(status != null) {
-			CrossFirePlugin.log(status);
-		}
-	}
-	
-	/**
-	 * Handles a context created, loaded, and changed event
-	 * @param set the {@link EventSet} to add to
-	 * @param event the {@link CFEventPacket} received
-	 * @param lookup if we should try to lookup the {@link ThreadReference} before creating a new one
-	 */
-	void handleContext(CFEventSet set, CFEventPacket event, boolean lookup) {
-		List threads = eventmgr.threadEnterRequests();
-		CFThreadReference thread = null;
-		if(lookup) {
-			thread = crossfire().findThread(event.getContextId());
-		}
-		if(thread == null) {
-			thread = crossfire().addThread(event.getContextId(), (String) event.getBody().get(Attributes.HREF));
-		}
-		set.setThread(thread);
-		for (Iterator iter = threads.iterator(); iter.hasNext();) {
-			ThreadEnterRequest request = (ThreadEnterRequest) iter.next();
-			set.add(new CFThreadEnterEvent(crossfire(), request, thread));
-		}
-	}
-	
-	/**
-	 * Flushes and cleans up the queue
-	 */
-	public void dispose() {
-		disposed = true;
-	}
-	
-	/**
-	 * Turns on / off tracing in the event queue
-	 * @param tracing
-	 */
-	public static void setTracing(boolean tracing) {
-		TRACE = tracing;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventSet.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventSet.java
deleted file mode 100644
index f1d2a90..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventSet.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import java.util.HashSet;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-
-/**
- * Default implementation of {@link EventSet} for Crossfire
- *  
- *  @since 1.0
- */
-public class CFEventSet extends HashSet implements EventSet {
-
-	private VirtualMachine vm = null;
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFEventSet(VirtualMachine vm) {
-		this.vm = vm;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#suspended()
-	 */
-	public boolean suspended() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#resume()
-	 */
-	public void resume() {
-		if(thread != null) {
-			thread.resume();
-		}
-		else {
-			vm.resume();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-	 
-	/**
-	 * Sets the thread context for the set
-	 * @param thread
-	 */
-	public void setThread(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFExceptionEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFExceptionEvent.java
deleted file mode 100644
index 411eec9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFExceptionEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link ExceptionEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFExceptionEvent extends CFLocatableEvent implements ExceptionEvent {
-
-	private String message = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 * @param message
-	 */
-	public CFExceptionEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location, String message) {
-		super(vm, request, thread, location);
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent#message()
-	 */
-	public String message() {
-		return message;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFLocatableEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFLocatableEvent.java
deleted file mode 100644
index 4299cf9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFLocatableEvent.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link LocatableEvent} for Crossfire
- * 
- * @sicne 1.0
- */
-public class CFLocatableEvent extends CFEvent implements LocatableEvent {
-
-	private ThreadReference thread = null;
-	private Location location = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public CFLocatableEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request);
-		this.thread = thread;
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFResumeEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFResumeEvent.java
deleted file mode 100644
index 4be5160..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFResumeEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ResumeEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Crossfire implementation of {@link ResumeEvent}
- * 
- * @since 1.0
- */
-public class CFResumeEvent extends CFLocatableEvent implements ResumeEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 */
-	public CFResumeEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request, thread, location);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFScriptLoadEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFScriptLoadEvent.java
deleted file mode 100644
index ada21e5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFScriptLoadEvent.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link ScriptLoadEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFScriptLoadEvent extends CFLocatableEvent implements ScriptLoadEvent {
-
-	private ScriptReference script = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public CFScriptLoadEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, ScriptReference script) {
-		super(vm, request, thread, null);
-		this.script = script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent#script()
-	 */
-	public ScriptReference script() {
-		return script;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFSuspendEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFSuspendEvent.java
deleted file mode 100644
index 898102f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFSuspendEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link SuspendEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFSuspendEvent extends CFLocatableEvent implements SuspendEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 */
-	public CFSuspendEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request, thread, location);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadEnterEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadEnterEvent.java
deleted file mode 100644
index 9ba26c9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadEnterEvent.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link ThreadEnterEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadEnterEvent extends CFLocatableEvent implements ThreadEnterEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 */
-	public CFThreadEnterEvent(VirtualMachine vm, EventRequest request, ThreadReference thread) {
-		super(vm, request, thread, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadExitEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadExitEvent.java
deleted file mode 100644
index e0052fb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadExitEvent.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link ThreadExitEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadExitEvent extends CFLocatableEvent implements ThreadExitEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 */
-	public CFThreadExitEvent(VirtualMachine vm, EventRequest request, ThreadReference thread) {
-		super(vm, request, thread, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFVMDeathEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFVMDeathEvent.java
deleted file mode 100644
index feef5ef..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFVMDeathEvent.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of a {@link VMDeathEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFVMDeathEvent extends CFEvent implements VMDeathEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public CFVMDeathEvent(VirtualMachine vm, EventRequest request) {
-		super(vm, request);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFArrayReference.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFArrayReference.java
deleted file mode 100644
index 7d67887..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFArrayReference.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Default implementation of {@link ArrayReference} for Crossfire
- * 
- * @since 1.0
- */
-public class CFArrayReference extends CFObjectReference implements ArrayReference {
-
-	/**
-	 * The "array" value type
-	 */
-	public static final String ARRAY = "array"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param frame
-	 * @param body
-	 */
-	public CFArrayReference(CFVirtualMachine vm, CFStackFrame frame, Map body) {
-		super(vm, frame, body);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#length()
-	 */
-	public int length() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValue(int)
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValues()
-	 */
-	public List getValues() {
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFBooleanValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFBooleanValue.java
deleted file mode 100644
index e27ea20..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFBooleanValue.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of a {@link BooleanValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFBooleanValue extends CFMirror implements BooleanValue {
-
-	private boolean bool = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param bool the underlying boolean value
-	 */
-	public CFBooleanValue(VirtualMachine vm, boolean bool) {
-		super(vm);
-		this.bool = bool;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return (bool ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return (bool ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return bool;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return Boolean.toString(bool);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFEventRequestManager.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFEventRequestManager.java
deleted file mode 100644
index 5671cb3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFEventRequestManager.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFBreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFDebuggerRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFResumeRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFStepRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFSuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFThreadExitRequest;
-
-/**
- * Default {@link EventRequestManager} for Crossfire
- * 
- * @since 1.0
- */
-public class CFEventRequestManager implements EventRequestManager {
-
-	private List threadexits = Collections.synchronizedList(new ArrayList(4));
-	private List threadenters = Collections.synchronizedList(new ArrayList(4));
-	private List breakpoints = Collections.synchronizedList(new ArrayList(4));
-	private List debuggers = Collections.synchronizedList(new ArrayList(4));
-	private List exceptions = Collections.synchronizedList(new ArrayList(4));
-	private List loads = Collections.synchronizedList(new ArrayList(4));
-	private List steps = Collections.synchronizedList(new ArrayList(4));
-	private List suspends = Collections.synchronizedList(new ArrayList(4));
-	private List resumes = Collections.synchronizedList(new ArrayList(4));
-	private List disconnects = Collections.synchronizedList(new ArrayList(4));
-	private List deaths = Collections.synchronizedList(new ArrayList(4));
-	
-	private HashMap kind = new HashMap(10);
-	
-	private VirtualMachine vm = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public CFEventRequestManager(VirtualMachine vm) {
-		this.vm = vm;
-		kind.put(CFBreakpointRequest.class, breakpoints);
-		kind.put(CFDebuggerRequest.class, debuggers);
-		kind.put(CFExceptionRequest.class, exceptions);
-		kind.put(CFScriptLoadRequest.class, loads);
-		kind.put(CFStepRequest.class, steps);
-		kind.put(CFSuspendRequest.class, suspends);
-		kind.put(CFResumeRequest.class, resumes);
-		kind.put(CFThreadEnterRequest.class, threadenters);
-		kind.put(CFThreadExitRequest.class, threadexits);
-		kind.put(CFDisconnectRequest.class, disconnects);
-		kind.put(CFDeathRequest.class, deaths);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createBreakpointRequest(org.eclipse.wst.jsdt.debug.core.jsdi.Location)
-	 */
-	public BreakpointRequest createBreakpointRequest(Location location) {
-		CFBreakpointRequest request = new CFBreakpointRequest(vm, location);
-		breakpoints.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#breakpointRequests()
-	 */
-	public List breakpointRequests() {
-		return Collections.unmodifiableList(breakpoints);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createDebuggerStatementRequest()
-	 */
-	public DebuggerStatementRequest createDebuggerStatementRequest() {
-		CFDebuggerRequest request = new CFDebuggerRequest(vm);
-		debuggers.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#debuggerStatementRequests()
-	 */
-	public List debuggerStatementRequests() {
-		return Collections.unmodifiableList(debuggers);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createExceptionRequest()
-	 */
-	public ExceptionRequest createExceptionRequest() {
-		CFExceptionRequest request = new CFExceptionRequest(vm);
-		exceptions.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#exceptionRequests()
-	 */
-	public List exceptionRequests() {
-		return Collections.unmodifiableList(exceptions);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createScriptLoadRequest()
-	 */
-	public ScriptLoadRequest createScriptLoadRequest() {
-		CFScriptLoadRequest request = new CFScriptLoadRequest(vm);
-		loads.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#scriptLoadRequests()
-	 */
-	public List scriptLoadRequests() {
-		return Collections.unmodifiableList(loads);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createStepRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference, int)
-	 */
-	public StepRequest createStepRequest(ThreadReference thread, int step) {
-		CFStepRequest request = new CFStepRequest(vm, thread, step);
-		steps.add(request);
-		return request; 
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#stepRequests()
-	 */
-	public List stepRequests() {
-		return Collections.unmodifiableList(steps);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createSuspendRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public SuspendRequest createSuspendRequest(ThreadReference thread) {
-		CFSuspendRequest request = new CFSuspendRequest(vm, thread);
-		suspends.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#suspendRequests()
-	 */
-	public List suspendRequests() {
-		return Collections.unmodifiableList(suspends);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createResumeRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public ResumeRequest createResumeRequest(ThreadReference thread) {
-		CFResumeRequest request = new CFResumeRequest(vm, thread);
-		resumes.add(request);
-		return request;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#resumeRequests()
-	 */
-	public List resumeRequests() {
-		return Collections.unmodifiableList(resumes);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadEnterRequest()
-	 */
-	public ThreadEnterRequest createThreadEnterRequest() {
-		CFThreadEnterRequest request = new CFThreadEnterRequest(vm);
-		threadenters.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadEnterRequests()
-	 */
-	public List threadEnterRequests() {
-		return Collections.unmodifiableList(threadenters);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadExitRequest()
-	 */
-	public ThreadExitRequest createThreadExitRequest() {
-		CFThreadExitRequest request = new CFThreadExitRequest(vm);
-		threadexits.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadExitRequests()
-	 */
-	public List threadExitRequests() {
-		return Collections.unmodifiableList(threadexits);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	public void deleteEventRequest(EventRequest eventRequest) {
-		List requests = (List) kind.get(eventRequest.getClass());
-		if(requests != null) {
-			requests.remove(eventRequest);
-			eventRequest.setEnabled(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(java.util.List)
-	 */
-	public void deleteEventRequest(List eventRequests) {
-		for (Iterator iter = eventRequests.iterator(); iter.hasNext();) {
-			deleteEventRequest((EventRequest) iter.next());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDeathRequest()
-	 */
-	public VMDeathRequest createVMDeathRequest() {
-		CFDeathRequest request = new CFDeathRequest(vm);
-		deaths.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDeathRequests()
-	 */
-	public List vmDeathRequests() {
-		return Collections.unmodifiableList(deaths);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDisconnectRequest()
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest() {
-		CFDisconnectRequest request = new CFDisconnectRequest(vm);
-		disconnects.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDisconnectRequests()
-	 */
-	public List vmDisconnectRequests() {
-		return Collections.unmodifiableList(disconnects);
-	}
-
-	/**
-	 * Cleans up all requests
-	 */
-	public void dispose() {
-		for (Iterator iter = kind.keySet().iterator(); iter.hasNext();) {
-			List list = (List) kind.get(iter.next());
-			list.clear();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFFunctionReference.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFFunctionReference.java
deleted file mode 100644
index 80a8d99..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFFunctionReference.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Default implementation of {@link FunctionReference} for Crossfire
- * 
- * @since 1.0
- */
-public class CFFunctionReference extends CFObjectReference implements FunctionReference {
-
-	/**
-	 * The "function" type
-	 */
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-	
-	private String funcname = null;
-	
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param frame
-	 * @param body
-	 */
-	public CFFunctionReference(CFVirtualMachine vm, CFStackFrame frame, Map body) {
-		super(vm, frame, body);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionName()
-	 */
-	public String functionName() {
-		synchronized (frame()) {
-			if(funcname == null) {
-				Value val = frame().lookup(id());
-				System.out.println(val);
-			}
-		}
-		return funcname;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionBody()
-	 */
-	public String functionBody() {
-		return source();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFObjectReference#valueString()
-	 */
-	public String valueString() {
-		if(source() != null) {
-			return source();
-		}
-		return FUNCTION;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFLocation.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFLocation.java
deleted file mode 100644
index e783e98..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFLocation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link Location} for Crossfire
- * 
- * @since 1.0
- */
-public class CFLocation extends CFMirror implements Location {
-
-	private CFScriptReference script = null;
-	private String function = null;
-	private int line = -1;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param script
-	 * @param function
-	 * @param line
-	 */
-	public CFLocation(VirtualMachine vm, CFScriptReference script, String function, int line) {
-		super(vm);
-		this.script = script;
-		this.function = function;
-		this.line = line;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#scriptReference()
-	 */
-	public ScriptReference scriptReference() {
-		return script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#lineNumber()
-	 */
-	public int lineNumber() {
-		return line;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#functionName()
-	 */
-	public String functionName() {
-		return function;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("LocationImpl: "); //$NON-NLS-1$
-		buffer.append("[script - ").append(script.sourceURI()).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[function - ").append(function).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[line - ").append(line).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFMirror.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFMirror.java
deleted file mode 100644
index dc6ceb7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFMirror.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation for a {@link Mirror} for Crossfire
- * 
- * @since 1.0
- */
-public class CFMirror implements Mirror {
-
-	static boolean TRACE = false;
-	
-	private VirtualMachine vm = null;
-	
-	/**
-	 * Constructor
-	 * For use by the {@link CFVirtualMachine} only
-	 * @noreference This constructor is not intended to be referenced by clients.
-	 */
-	public CFMirror() {
-		vm = (VirtualMachine) this;
-	}
-	
-	/**
-	 * Constructor
-	 */
-	public CFMirror(VirtualMachine vm) {
-		this.vm = vm;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-	
-	/**
-	 * Re-throws the given exception as a {@link RuntimeException} with the given message
-	 * @param message
-	 * @param t
-	 */
-	protected void handleException(String message, Throwable t) {
-		throw new RuntimeException(message, t);
-	}
-	
-	/**
-	 * Returns the handle to the {@link CFVirtualMachine}
-	 * 
-	 * @return the {@link CFVirtualMachine} handle
-	 */
-	protected CFVirtualMachine crossfire() {
-		return (CFVirtualMachine) vm;
-	}
-	
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNullValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNullValue.java
deleted file mode 100644
index 1ffc40c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNullValue.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of the {@link NullValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFNullValue extends CFMirror implements NullValue {
-
-	public static final String NULL = "null"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public CFNullValue(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return CFNullValue.NULL;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNumberValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNumberValue.java
deleted file mode 100644
index 09e08ce..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNumberValue.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link NumberValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFNumberValue extends CFMirror implements NumberValue {
-
-	private Number number = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param number
-	 */
-	public CFNumberValue(VirtualMachine vm, Number number) {
-		super(vm);
-		this.number = number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return number.intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return number.doubleValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return number.intValue() > 0 ? true : false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return number.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#value()
-	 */
-	public Number value() {
-		return number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#isNaN()
-	 */
-	public boolean isNaN() {
-		return number == null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFObjectReference.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFObjectReference.java
deleted file mode 100644
index 92b9d9b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFObjectReference.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
-
-/**
- * Default implementation of {@link ObjectReference} for Crossfire
- * 
- * @since 1.0
- */
-public class CFObjectReference extends CFMirror implements ObjectReference {
-	
-	/**
-	 * The "type" of this mirror element
-	 */
-	public static final String OBJECT = "object"; //$NON-NLS-1$
-	
-	private CFStackFrame frame = null;
-	private String classname = null;
-	private Number handle = null;
-	private Number constref = null;
-	private Number protoref = null;
-	private Value constructor = null;
-	private Value prototype = null;
-	private List properties = null;
-	private String source = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param frame
-	 * @param body
-	 */
-	public CFObjectReference(CFVirtualMachine vm, CFStackFrame frame, Map body) {
-		super(vm);
-		this.frame = frame;
-		handle = (Number) body.get(Attributes.HANDLE);
-		source = (String) body.get(Attributes.SOURCE);
-		//init properties - we are dealing with evaluation results
-		Map props = (Map) body.get(Attributes.RESULT);
-		if(props == null) {
-			Object o = body.get(Attributes.VALUE);
-			if(o instanceof Map) {
-				props = (Map) body.get(Attributes.VALUE);
-			}
-			else if(this.handle == null) {
-				props = body;
-			}
-		}
-		if(props != null) {
-			if(properties == null) {
-				properties = new ArrayList(props.size());
-			}
-			Entry entry = null;
-			String name = null;
-			Map json = null;
-			Number ref = null;
-			for(Iterator i = props.entrySet().iterator(); i.hasNext();) {
-				entry = (Entry) i.next();
-				name = (String)entry.getKey();
-				if(entry.getValue() instanceof Map) {
-					json = (Map) entry.getValue();
-					ref = (Number) json.get(Attributes.HANDLE);
-					//don't add constructor and proto to the properties heap
-					//they are requested specially
-					if(Attributes.CONSTRUCTOR.equals(name)) {
-						constref = ref;
-						continue;
-					}
-					else if(Attributes.PROTO.equals(name)) {
-						protoref = ref;
-						continue;
-					}
-				}
-				properties.add(new CFVariable(crossfire(), frame, name, ref, json));
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		if(source != null) {
-			return source;
-		}
-		return OBJECT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#className()
-	 */
-	public String className() {
-		return classname;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#constructor()
-	 */
-	public Value constructor() {
-		synchronized (frame) {
-			if(constructor == null) {
-				if(constref == null) {
-					constructor = crossfire().mirrorOfUndefined();
-				}
-				constructor = frame.lookup(constref);
-			}
-		}
-		return constructor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#prototype()
-	 */
-	public Value prototype() {
-		synchronized (frame) {
-			if(prototype == null) {
-				if(protoref == null) {
-					prototype = crossfire().mirrorOfUndefined();
-				}
-				prototype = frame.lookup(protoref);
-			}
-		}
-		return prototype;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#properties()
-	 */
-	public List properties() {
-		return properties;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#id()
-	 */
-	public Number id() {
-		return handle;
-	}
-	
-	/**
-	 * @return the backing {@link StackFrame}
-	 */
-	protected CFStackFrame frame() {
-		return this.frame;
-	}
-	
-	/**
-	 * @return the source for the body of the object, or <code>null</code>
-	 */
-	protected String source() {
-		return this.source;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFProperty.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFProperty.java
deleted file mode 100644
index 90ba96f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFProperty.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Default implementation of {@link Property} for Crossfire
- * 
- * @since 1.0
- */
-public class CFProperty extends CFMirror implements Property {
-
-	private String name = null;
-	private Number ref = null;
-	private CFStackFrame frame = null;
-	private Value value = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param frame
-	 * @param name
-	 * @param ref
-	 */
-	public CFProperty(CFVirtualMachine vm, CFStackFrame frame, String name, Number ref) {
-		super(vm);
-		this.frame = frame;
-		this.name = name;
-		this.ref = ref;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#name()
-	 */
-	public String name() {
-		return this.name;
-	}
-	
-	/**
-	 * Allows the value to be set. Passing in <code>null</code> for <code>newvalue</code> will result
-	 * in {@link #value} being set to {@link NullValue}
-	 * 
-	 * @param newvalue
-	 */
-	protected void setValue(Value newvalue) {
-		if(newvalue == null) {
-			this.value = crossfire().mirrorOfNull();
-		}
-		else {
-			this.value = newvalue;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#value()
-	 */
-	public synchronized Value value() {
-		if(this.value == null) {
-			this.value = frame.lookup(this.ref);
-			if(this.value == null) {
-				this.value = crossfire().mirrorOfUndefined();
-			}
-		}
-		if(this.value == null) {
-			return crossfire().mirrorOfUndefined();
-		}
-		return this.value;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFScriptReference.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFScriptReference.java
deleted file mode 100644
index d46c1c3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFScriptReference.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.CrossFirePlugin;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Commands;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFRequestPacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFResponsePacket;
-
-/**
- * Default implementation of {@link ScriptReference} for Crossfire
- * 
- * @since 1.0
- */
-public class CFScriptReference extends CFMirror implements ScriptReference {
-	
-	private String context_id = null;
-	private String context_href = null;
-	private String id = null;
-	private int srclength = 0;
-	private int linecount = 0;
-	private int coloffset = 0;
-	private int lineoffset = 0;
-	private String source = null;
-	private URI sourceuri = null;
-	
-	private List linelocs = new ArrayList();
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param context_id
-	 * @param json
-	 */
-	public CFScriptReference(VirtualMachine vm, String context_id, Map json) {
-		super(vm);
-		this.context_id = context_id;
-		this.id = (String) json.get(Attributes.ID);
-		this.context_href = (String) json.get(Attributes.CONTEXT_HREF);
-		initializeScript(json);
-	}
-
-	/**
-	 * Initialize the script from the given JSON map
-	 * 
-	 * @param json
-	 */
-	void initializeScript(Map json) {
-		Number value = (Number) json.get(Attributes.SOURCE_LENGTH);
-		if(value != null) {
-			this.srclength = value.intValue();
-		}
-		value = (Number) json.get(Attributes.LINE_COUNT);
-		if(value != null) {
-			this.linecount = value.intValue();
-		}
-		value = (Number) json.get(Attributes.LINE_OFFSET);
-		if(value != null) {
-			this.lineoffset = value.intValue();
-		}
-		value = (Number) json.get(Attributes.COLUMN_OFFSET);
-		if(value != null) {
-			this.coloffset = value.intValue();
-		}
-		source = (String) json.get(Attributes.SOURCE);
-		prepareLocations(linecount);
-	}
-	
-	/**
-	 * Creates the line locations
-	 * 
-	 * @param lines
-	 */
-	void prepareLocations(int lines) {
-		linelocs.clear();  //remove old line infos
-		for (int i = 1; i <= lines; i++) {
-			linelocs.add(new CFLocation(virtualMachine(), this, null, i));
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allLineLocations()
-	 */
-	public List allLineLocations() {
-		return Collections.unmodifiableList(linelocs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#lineLocation(int)
-	 */
-	public Location lineLocation(int lineNumber) {
-		if(lineNumber <= linelocs.size()) {
-			return (Location) linelocs.get(lineNumber-1);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allFunctionLocations()
-	 */
-	public List allFunctionLocations() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#functionLocation(java.lang.String)
-	 */
-	public Location functionLocation(String functionName) {
-		return null;
-	}
-
-	/**
-	 * The id of the script
-	 * @return the id
-	 */
-	public String id() {
-		return id;
-	}
-	
-	/**
-	 * The HTTP context of the script, if any.
-	 * <br><br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the HTTP context of the script or null
-	 */
-	public String hrefContext() {
-		return context_href;
-	}
-	
-	/**
-	 * Returns the context id of this script - this represents the id of the owning thread
-	 * <br><br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the context id for the owning thread or <code>null</code>
-	 */
-	public String context() {
-		return context_id;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#source()
-	 */
-	public synchronized String source() {
-		if(source == null) {
-			CFRequestPacket request = new CFRequestPacket(Commands.SCRIPT, context_id);
-			request.setArgument(Attributes.INCLUDE_SOURCE, Boolean.TRUE);
-			request.setArgument(Attributes.URL, id);
-			CFResponsePacket response = crossfire().sendRequest(request);
-			if(response.isSuccess()) {
-				initializeScript((Map) response.getBody().get(Attributes.SCRIPT));
-			}
-			else if(TRACE) {
-				Tracing.writeString("SCRIPTREF [failed source request]: "+JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-		return source;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#sourceURI()
-	 */
-	public synchronized URI sourceURI() {
-		if(sourceuri == null) {
-			try {
-				sourceuri = URIUtil.fromString(id);
-			}
-			catch(IllegalArgumentException iae) {
-				try {
-					sourceuri = CrossFirePlugin.fileURI(new Path(id));
-				} catch (URISyntaxException e) {
-					CrossFirePlugin.log(e);
-				}
-			}
-			catch(URISyntaxException urise) {
-				CrossFirePlugin.log(urise);
-			}
-		}
-		return sourceuri;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ScriptReference: [context_id - ").append(context_id).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append(" [context_href - ").append(context_href).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append(" [id - ").append(id).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append(" [srclength - ").append(srclength).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append(" [linecount - ").append(linecount).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append(" [lineoffset - ").append(lineoffset).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append(" [coloffset - ").append(coloffset).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("\nSource: \n").append(source); //$NON-NLS-1$
-		return super.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStackFrame.java
deleted file mode 100644
index 0a37fee..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStackFrame.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFRequestPacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFResponsePacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Commands;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-
-/**
- * Default implementation of {@link StackFrame} for Crossfire
- * 
- * @since 1.0
- */
-public class CFStackFrame extends CFMirror implements StackFrame {
-
-	/**
-	 * Describes a scope
-	 */
-	class Scope {
-		Number idx = null;
-		Number fidx = null;
-		Number ref = null;
-		public Scope(Number idx, Number fidx, Number ref) {
-			this.idx = idx;
-			this.fidx = fidx;
-			this.ref = ref;
-		}
-		/* (non-Javadoc)
-		 * @see java.lang.Object#hashCode()
-		 */
-		public int hashCode() {
-			return idx.hashCode() + fidx.hashCode() + ref.hashCode();
-		}
-		
-		/* (non-Javadoc)
-		 * @see java.lang.Object#equals(java.lang.Object)
-		 */
-		public boolean equals(Object obj) {
-			if(obj instanceof Scope) {
-				Scope s = (Scope) obj;
-				return idx.equals(s.idx) && fidx.equals(s.fidx) && ref.equals(s.ref);
-			}
-			return false;
-		}
-	}
-	
-	HashSet scopes = new HashSet();
-	
-	private int index = -1;
-	private String scriptid = null;
-	private String funcname = null;
-	private int linenumber = -1;
-	private List vars = null;
-	private Variable thisvar = null;
-	private CFLocation loc = null;
-	private CFThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param json
-	 */
-	public CFStackFrame(VirtualMachine vm, CFThreadReference thread, Map json) {
-		super(vm);
-		this.thread = thread;
-		Number value = (Number) json.get(Attributes.INDEX);
-		if(value != null) {
-			index = value.intValue();
-		}
-		value = (Number) json.get(Attributes.LINE);
-		if(value != null) {
-			linenumber = value.intValue();
-		}
-		scriptid = (String) json.get(Attributes.SCRIPT);
-		funcname = (String) json.get(Attributes.FUNC);
-		
-		parseScopes((List) json.get(Attributes.SCOPES));
-		parseLocals((Map) json.get(Attributes.LOCALS));
-		//scope();
-		//allScopes();
-	}
-
-	/**
-	 * Parses the scopes object node, if there is one
-	 * 
-	 * @param list the list of scopes
-	 */
-	void parseScopes(List list) {
-		if(list != null) {
-			for (Iterator i = list.iterator(); i.hasNext();) {
-				Map map = (Map) i.next();
-				Scope s = new Scope(
-						(Number)map.get(Attributes.INDEX), 
-						(Number)map.get(Attributes.FRAME_INDEX), 
-						(Number) ((Map)map.get(Attributes.OBJECT)).get(Attributes.HANDLE));
-				scopes.add(s);
-			}
-		}
-	}
-	
-	/**
-	 * Read the local variable information from the json mapping
-	 * 
-	 * @param json
-	 */
-	void parseLocals(Map json) {
-		if(json != null) {
-			Object val = json.get(Attributes.VALUE);
-			if(val instanceof Map) {
-				Map locals = (Map) json.get(Attributes.VALUE); 
-				if(locals != null) {
-					vars = new ArrayList(locals.size());
-					parseVariables(locals, vars);
-				}
-			}
-			else {
-				vars = new ArrayList();
-			}
-			Map thismap = (Map) json.get(Attributes.THIS); 
-			thisvar = new CFVariable(crossfire(), this, Attributes.THIS, null, (thismap == null ? new HashMap(0) : thismap));
-		}
-	}
-	
-	void parseVariables(Map map, List varcollector) {
-		Entry entry = null;
-		for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) {
-			entry = (Entry) iter.next();
-			if(entry.getValue() instanceof Map) {
-				Map info  = (Map) entry.getValue();
-				varcollector.add(
-						new CFVariable(
-								crossfire(), 
-								this, 
-								(String) entry.getKey(), 
-								(Number) info.get(Attributes.HANDLE), 
-								info));
-			}
-			else {
-				varcollector.add(
-						new CFVariable(
-								crossfire(), 
-								this, 
-								(String) entry.getKey(), 
-								null, 
-								null));
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#thisObject()
-	 */
-	public Variable thisObject() {
-		return thisvar;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#variables()
-	 */
-	public synchronized List variables() {
-		if(vars != null) {
-			return vars;
-		}
-		return Collections.EMPTY_LIST; 
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#location()
-	 */
-	public synchronized Location location() {
-		if(loc == null) {
-			CFScriptReference script = crossfire().findScript(scriptid); 
-			if(script != null) {
-				loc = new CFLocation(crossfire(), script, funcname, linenumber);
-			}
-		}
-		return loc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#evaluate(java.lang.String)
-	 */
-	public Value evaluate(String expression) {
-		CFRequestPacket request = new CFRequestPacket(Commands.EVALUATE, thread.id());
-		request.setArgument(Attributes.FRAME, new Integer(index));
-		request.setArgument(Attributes.EXPRESSION, expression);
-		CFResponsePacket response = crossfire().sendRequest(request);
-		if(response.isSuccess()) {
-			return createValue(response.getBody());
-		}
-		else if(TRACE) {
-			Tracing.writeString("STACKFRAME [failed evaluate request]: "+JSON.serialize(request)); //$NON-NLS-1$
-		}
-		return virtualMachine().mirrorOfNull();
-	}
-	
-	/**
-	 * Returns the index of the frame in the stack
-	 * 
-	 * @return the frame index
-	 */
-	public int frameindex() {
-		return index;
-	}
-	
-	/**
-	 * Looks up the value given its handle ref
-	 * 
-	 * @param ref
-	 * @return the {@link Value} or <code>null</code>
-	 */
-	public Value lookup(Number ref) {
-		if(ref != null) {
-			CFRequestPacket request = new CFRequestPacket(Commands.LOOKUP, thread.id());
-			request.setArgument(Attributes.HANDLE, ref);
-			request.setArgument(Attributes.INCLUDE_SOURCE, Boolean.TRUE);
-			CFResponsePacket response = crossfire().sendRequest(request);
-			if(response.isSuccess()) {
-				return createValue(response.getBody());
-			}
-			else if(TRACE) {
-				Tracing.writeString("STACKFRAME [request for value lookup failed]: "+JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-		return crossfire().mirrorOfNull();
-	}
-	
-	/**
-	 * Creates the correct type if {@link Value} from the given json mapping
-	 * @param json
-	 * @return the new {@link Value} or <code>null</code> if one could not be created
-	 */
-	Value createValue(Object val) {
-		//resolve the smallest type from the crossfire insanity
-		if(val instanceof Map) {
-			Map values = (Map) val;
-			Object o = values.get(Attributes.RESULT);
-			if(o == null) {
-				String type = (String) values.get(Attributes.TYPE);
-				if(type != null) {
-					return createTypeValue(type, values);
-				}
-			}
-			if(o instanceof Map){
-				return new CFObjectReference(crossfire(), this, (Map) o);
-			}
-			if(o instanceof String) {
-				return crossfire().mirrorOf(o.toString());
-			}
-			else if(o instanceof Number) {
-				return crossfire().mirrorOf((Number)o);
-			}
-		}
-		else if(val instanceof Map) {
-			return new CFObjectReference(crossfire(), this, (Map) val);
-		}
-		else if(val instanceof String) {
-			String str = (String) val;
-			if(CFUndefinedValue.UNDEFINED.equals(str)) {
-				return crossfire().mirrorOfUndefined();
-			}
-			return crossfire().mirrorOf((String) val); 
-		}
-		else if(val instanceof Number) {
-			return crossfire().mirrorOf((Number) val);
-		}
-		return crossfire().mirrorOfNull();
-	}
-	
-	/**
-	 * Create a new {@link Value} based on the given type
-	 * 
-	 * @param type the type
-	 * @param map the map of value information
-	 * @return the new {@link Value} for the given type or {@link NullValue} if a value cannot be computed
-	 */
-	Value createTypeValue(String type, Map map) {
-		if(CFUndefinedValue.UNDEFINED.equals(type)) {
-			return crossfire().mirrorOfUndefined();
-		}
-		if(CFStringValue.STRING.equals(type)) {
-			return crossfire().mirrorOf(map.get(Attributes.VALUE).toString());
-		}
-		if(CFObjectReference.OBJECT.equals(type) || Attributes.REF.equals(type)) {
-			return new CFObjectReference(crossfire(), this, map);
-		}
-		if(CFArrayReference.ARRAY.equals(type)) {
-			return new CFArrayReference(crossfire(), this, map);
-		}
-		if(CFFunctionReference.FUNCTION.equals(type)) {
-			return new CFFunctionReference(crossfire(), this, map);
-		}
-		return crossfire().mirrorOfNull();
-	}
-	
-	/**
-	 * Returns if this stack frame is visible
-	 * 
-	 * @param variable
-	 * @return true if this frame is visible, false otherwise
-	 */
-	public synchronized boolean isVisible(CFVariable variable) {
-		return vars != null && (thisvar == variable || vars.contains(variable));
-	}
-	
-	/**
-	 * Gets all of the scopes from Firebug
-	 */
-	void allScopes() {
-		CFRequestPacket request = new CFRequestPacket(Commands.SCOPES, thread.id());
-		request.setArgument(Attributes.FRAME_NUMBER, new Integer(index));
-		CFResponsePacket response = crossfire().sendRequest(request);
-		if(response.isSuccess()) {
-			List list = (List) response.getBody().get(Attributes.SCOPES);
-			if(list != null) {
-				parseScopes(list);
-			}
-		}
-		else if(TRACE) {
-			Tracing.writeString("VM [failed scopes request]: "+JSON.serialize(request)); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Gets the scope for this frame
-	 */
-	void scope() {
-		CFRequestPacket request = new CFRequestPacket(Commands.SCOPE, thread.id());
-		request.setArgument(Attributes.FRAME_NUMBER, new Integer(index));
-		request.setArgument(Attributes.NUMBER, new Integer(0));
-		CFResponsePacket response = crossfire().sendRequest(request);
-		if(response.isSuccess()) {
-			Scope s = new Scope(
-					(Number)response.getBody().get(Attributes.INDEX), 
-					(Number)response.getBody().get(Attributes.FRAME_INDEX),
-					(Number) ((Map)response.getBody().get(Attributes.OBJECT)).get(Attributes.HANDLE));
-			scopes.add(s);
-		}
-		else if(TRACE) {
-			Tracing.writeString("VM [failed scopes request]: "+JSON.serialize(request)); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStringValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStringValue.java
deleted file mode 100644
index 5e61009..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStringValue.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link StringValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFStringValue extends CFMirror implements StringValue {
-
-	/**
-	 * The "type" of this value
-	 */
-	public static final String STRING = "string"; //$NON-NLS-1$
-	
-	private String string = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param string
-	 */
-	public CFStringValue(VirtualMachine vm, String string) {
-		super(vm);
-		this.string = string;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return string;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return string;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return string;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFThreadReference.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFThreadReference.java
deleted file mode 100644
index a2413de..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFThreadReference.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFRequestPacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFResponsePacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Commands;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-
-/**
- * Default implementation of {@link ThreadReference} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadReference extends CFMirror implements ThreadReference {
-	
-	static final int RUNNING = 0;
-	static final int SUSPENDED = 1;
-	static final int TERMINATED = 2;
-	
-	private String id = null;
-	private String href = null;
-	private int state = RUNNING;
-	private ArrayList frames = null;
-	private int stepkind = -1;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param id
-	 * @param href
-	 */
-	public CFThreadReference(VirtualMachine vm, String id, String href) {
-		super(vm);
-		this.id = id;
-		this.href = href;
-	}
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param json
-	 */
-	public CFThreadReference(VirtualMachine vm, Map json) {
-		super(vm);
-		this.id = (String) json.get(Attributes.CROSSFIRE_ID);
-		if(this.id == null) {
-			this.id = (String) json.get(Attributes.CONTEXT_ID);
-		}
-		this.href = (String) json.get(Attributes.HREF);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frameCount()
-	 */
-	public int frameCount() {
-		return frames == null ? 0 : frames.size();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frame(int)
-	 */
-	public synchronized StackFrame frame(int index) {
-		if(frames == null || index < 0 || index > frames.size()) {
-			return null;
-		}
-		return (StackFrame) frames.get(index);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frames()
-	 */
-	public synchronized List frames() {
-		//TODO we require some way to batch retrieve the frames from a given context
-		//unless there is only ever one frame?
-		if(frames == null) {
-			CFRequestPacket request = new CFRequestPacket(Commands.BACKTRACE, id);
-			request.setArgument(Attributes.FROM_FRAME, new Integer(0));
-			request.setArgument(Attributes.INCLUDE_SCOPES, Boolean.TRUE);
-			CFResponsePacket response = crossfire().sendRequest(request);
-			if(response.isSuccess()) {
-				frames = new ArrayList();
-				ArrayList frms = (ArrayList) response.getBody().get(Attributes.FRAMES);
-				if(frms != null) {
-					Map fmap = null;
-					for (int i = 0; i < frms.size(); i++) {
-						fmap = (Map) frms.get(i);
-						//XXX hack to prevent http://code.google.com/p/fbug/issues/detail?id=4203
-						if(fmap.containsKey(Attributes.SCRIPT)) {
-							frames.add(new CFStackFrame(virtualMachine(), this, fmap));
-						}
-						else if(TRACE) {
-							Tracing.writeString("STACKFRAME [got bogus stackframe infos]: "+fmap.values().toString()); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-			else {
-				if(TRACE) {
-					Tracing.writeString("STACKFRAME [backtrace request failed]: "+JSON.serialize(request)); //$NON-NLS-1$
-				}
-				return Collections.EMPTY_LIST;
-			}
-		}
-		return frames;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#interrupt()
-	 */
-	public void interrupt() {
-		try {
-			resume();
-		}
-		finally {
-			state = TERMINATED;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#resume()
-	 */
-	public void resume() {
-		if(isSuspended()) {
-			CFRequestPacket request = new CFRequestPacket(Commands.CONTINUE, id);
-			String step = resolveStepKind();
-			if(step != null) {
-				request.setArgument(Attributes.STEPACTION, step);
-			}
-			try {
-				CFResponsePacket response = crossfire().sendRequest(request);
-				if(response.isSuccess()) {
-					state = RUNNING;
-				}
-				else if(TRACE) {
-					Tracing.writeString("THREAD [failed continue request] "+JSON.serialize(request)); //$NON-NLS-1$
-				}
-			}
-			finally {
-				clearFrames();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#suspend()
-	 */
-	public void suspend() {
-		if(isRunning()) {
-			CFRequestPacket request = new CFRequestPacket(Commands.SUSPEND, id);
-			try {
-				CFResponsePacket response = crossfire().sendRequest(request);
-				if(response.isSuccess()) {
-					//XXX catch in case the last resume failed
-					state = SUSPENDED;
-				}
-				else if(TRACE) {
-					Tracing.writeString("THREAD [failed suspend request]: "+JSON.serialize(request)); //$NON-NLS-1$
-				}
-			}
-			finally {
-				clearFrames();
-			}
-		}
-	}
-
-	/**
-	 * Clears out any stale stack frames
-	 */
-	void clearFrames() {
-		if(frames != null) {
-			frames.clear();
-			frames = null;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#status()
-	 */
-	public int status() {
-		return THREAD_STATUS_RUNNING;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isAtBreakpoint()
-	 */
-	public boolean isAtBreakpoint() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isSuspended()
-	 */
-	public boolean isSuspended() {
-		return state == SUSPENDED;
-	}
-
-	/**
-	 * @return if the thread is in a running state
-	 */
-	public boolean isRunning() {
-		return state == RUNNING;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#name()
-	 */
-	public String name() {
-		return NLS.bind(Messages.thread_name, new Object[] {id, href});
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ThreadReference: [crossfire_id - ").append(id).append("] [href - ").append(href).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return buffer.toString();
-	}
-	
-	/**
-	 * Returns the Crossfire id for this thread
-	 * 
-	 * @return the id
-	 */
-	public String id() {
-		return id;
-	}
-	
-	/**
-	 * Returns the href context for this thread
-	 * 
-	 * return the href context
-	 */
-	public String href() {
-		return href;
-	}
-	
-	/**
-	 * Marks the thread as suspended or not. This is a call-back from the 
-	 * VM when suspending a VM.
-	 * 
-	 * @param suspended
-	 */
-	public void markSuspended(boolean suspended) {
-		//XXX catch - this causes a state change
-		clearFrames();
-		state = suspended ? SUSPENDED : RUNNING;
-	}
-	
-	/**
-	 * Sets the current step kind kind to perform, or -1 to remove the kind
-	 * @param stepkind
-	 */
-	public void setStep(int step) {
-		this.stepkind = step;
-	}
-	
-	/**
-	 * @return the step kind to use in the continue request or <code>null</code>
-	 */
-	String resolveStepKind() {
-		if(stepkind != -1) {
-			switch(stepkind) {
-				case StepRequest.STEP_INTO: return Commands.STEP_IN;
-				case StepRequest.STEP_OUT: return Commands.STEP_OUT;
-				case StepRequest.STEP_OVER: return Commands.STEP_NEXT;
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFUndefinedValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFUndefinedValue.java
deleted file mode 100644
index 945102c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFUndefinedValue.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation for an {@link UndefinedValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFUndefinedValue extends CFMirror implements UndefinedValue {
-
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public CFUndefinedValue(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return UNDEFINED;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFVariable.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFVariable.java
deleted file mode 100644
index 2eb3133..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFVariable.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
-
-/**
- * Default implementation of a {@link Variable} for Crossfire
- * 
- * @since 1.0
- */
-public class CFVariable extends CFProperty implements Variable {
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param frame
-	 * @param name
-	 * @param ref
-	 * @param values
-	 */
-	public CFVariable(CFVirtualMachine vm, CFStackFrame frame, String name, Number ref, Map values) {
-		super(vm, frame, name, ref);
-		Value value = null;
-		if(values != null) {
-			String kind = (String) values.get(Attributes.TYPE);
-			//if we have a primitive type create it value now
-			if(kind != null) {
-				if(kind.equals(Attributes.STRING)) {
-					value = new CFStringValue(vm, (String) values.get(Attributes.VALUE));
-				}
-				else if(kind.equals(Attributes.NUMBER)) {
-					value = new CFNumberValue(vm, (Number) values.get(Attributes.VALUE));
-				}
-				else if(kind.equals(Attributes.BOOLEAN)) {
-					value = new CFBooleanValue(vm, ((Boolean)values.get(Attributes.VALUE)).booleanValue());
-				}
-				if(Attributes.THIS.equals(name)) {
-					//special object that has no lookup so we have to pre-populate the properties
-					value = new CFObjectReference(crossfire(), frame, values);
-				}
-			}
-		}
-		else {
-			value = crossfire().mirrorOfNull();
-		}
-		if(value != null) {
-			setValue(value);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isArgument()
-	 */
-	public boolean isArgument() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isVisible(org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame)
-	 */
-	public boolean isVisible(StackFrame frame) {
-		if(frame instanceof CFStackFrame) {
-			return ((CFStackFrame)frame).isVisible(this);
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFVirtualMachine.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFVirtualMachine.java
deleted file mode 100644
index 0ce9e86..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFVirtualMachine.java
+++ /dev/null
@@ -1,713 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointListener;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.core.JavaScriptCore;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.Constants;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.CrossFirePlugin;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.event.CFEventQueue;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFEventPacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFRequestPacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFResponsePacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Commands;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.JSON;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Default CrossFire implementation of {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public class CFVirtualMachine extends CFMirror implements VirtualMachine, IBreakpointListener {
-
-	private final NullValue nullvalue = new CFNullValue(this);
-	private final UndefinedValue undefinedvalue = new CFUndefinedValue(this);
-	
-	private final DebugSession session;
-	private final CFEventRequestManager ermanager = new CFEventRequestManager(this);
-	private final CFEventQueue queue = new CFEventQueue(this, ermanager);
-	private boolean disconnected = false;
-	
-	private Map threads = null;
-	private Map scripts = null;
-	private Map breakpointHandles = new HashMap();
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param session
-	 */
-	public CFVirtualMachine(DebugSession session) {
-		super();
-		this.session = session;
-		IBreakpointManager bpManager = DebugPlugin.getDefault().getBreakpointManager();
-		bpManager.addBreakpointListener(this);
-		initializeBreakpoints();
-	}
-
-	/**
-	 * Collects all of the breakpoints 
-	 */
-	void initializeBreakpoints() {
-		List threads = allThreads();
-		for (Iterator i = threads.iterator(); i.hasNext();) {
-			CFThreadReference thread = (CFThreadReference) i.next();
-			CFRequestPacket request = new CFRequestPacket(Commands.GET_BREAKPOINTS, thread.id());
-			CFResponsePacket response = sendRequest(request);
-			if(response.isSuccess()) {
-				//TODO sync breakpoints
-			}
-			else if(TRACE) {
-				Tracing.writeString("VM [failed getbreakpoints request]: "+JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	/**
-	 * @return the 'readiness' of the VM - i.e. is it in a state to process requests, etc
-	 */
-	boolean ready() {
-		return !disconnected;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#resume()
-	 */
-	public void resume() {
-		if(ready()) {
-			if(threads != null) {
-				Entry entry = null;
-				for (Iterator iter = threads.entrySet().iterator(); iter.hasNext();) {
-					entry = (Entry) iter.next();
-					CFThreadReference thread = (CFThreadReference) entry.getValue();
-					if(thread.isSuspended()) {
-						CFRequestPacket request = new CFRequestPacket(Commands.CONTINUE, thread.id());
-						CFResponsePacket response = sendRequest(request);
-						if(response.isSuccess()) {
-							if(thread.isSuspended()) {
-								thread.markSuspended(false);
-							}
-						}
-						else if(TRACE) {
-							Tracing.writeString("VM [failed continue request][context: "+thread.id()+"]: "+JSON.serialize(request)); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#suspend()
-	 */
-	public void suspend() {
-		if(ready()) {
-			if(threads != null) {
-				Entry entry = null;
-				for (Iterator iter = threads.entrySet().iterator(); iter.hasNext();) {
-					entry = (Entry) iter.next();
-					CFThreadReference thread = (CFThreadReference) entry.getValue();
-					if(thread.isRunning()) {
-						CFRequestPacket request = new CFRequestPacket(Commands.SUSPEND, thread.id());
-						CFResponsePacket response = sendRequest(request);
-						if(response.isSuccess()) {
-							if(!thread.isSuspended()) {
-								thread.markSuspended(true);
-							}
-						}
-						else if(TRACE) {
-							Tracing.writeString("VM [failed suspend request]: "+JSON.serialize(request)); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#terminate()
-	 */
-	public void terminate() {
-		if(ready()) {
-			disconnectVM();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#name()
-	 */
-	public String name() {
-		return Messages.vm_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#description()
-	 */
-	public String description() {
-		return Messages.crossfire_vm;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#version()
-	 */
-	public synchronized String version() {
-		if(ready()) {
-			CFRequestPacket request = new CFRequestPacket(Commands.VERSION, null);
-			CFResponsePacket response = sendRequest(request);
-			if(response.isSuccess()) {
-				Map json = response.getBody();
-				return (String) json.get(Commands.VERSION);
-			}
-			if(TRACE) {
-				Tracing.writeString("VM [failed version request]: "+JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-		return Constants.UNKNOWN;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allThreads()
-	 */
-	public synchronized List allThreads() {
-		if(threads == null) {
-			threads = new HashMap();
-			CFRequestPacket request = new CFRequestPacket(Commands.LISTCONTEXTS, null);
-			CFResponsePacket response = sendRequest(request);
-			if(response.isSuccess()) {
-				List contexts = (List) response.getBody().get(Attributes.CONTEXTS);
-				for (Iterator iter = contexts.iterator(); iter.hasNext();) {
-					Map json = (Map) iter.next();
-					CFThreadReference thread = new CFThreadReference(this, json);
-					threads.put(thread.id(), thread);
-				}
-			}
-			else if(TRACE) {
-				Tracing.writeString("VM [failed allthreads request]: "+JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-		return new ArrayList(threads.values());
-	}
-
-	/**
-	 * Adds a thread to the listing
-	 * 
-	 * @param id
-	 * @param href
-	 * @return the new thread
-	 */
-	public CFThreadReference addThread(String id, String href) {
-		if(threads == null) {
-			allThreads();
-		}
-		CFThreadReference thread  = new CFThreadReference(this, id, href);
-		threads.put(thread.id(), thread);
-		return thread;
-	}
-	
-	/**
-	 * Removes the thread with the given id
-	 * 
-	 * @param id the id of the thread to remove
-	 */
-	public void removeThread(String id) {
-		if(threads != null) {
-			Object obj = threads.remove(id);
-			if(TRACE && obj == null) {
-				Tracing.writeString("VM [failed to remove thread]: "+id); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	/**
-	 * Returns the thread with the given id or <code>null</code>
-	 * 
-	 * @param id
-	 * @return the thread or <code>null</code>
-	 */
-	public synchronized CFThreadReference findThread(String id) {
-		if(threads == null) {
-			allThreads();
-		}
-		CFThreadReference thread = (CFThreadReference) threads.get(id);
-		if(TRACE && thread == null) {
-			Tracing.writeString("VM [failed to find thread]: "+id); //$NON-NLS-1$
-		}
-		return thread;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allScripts()
-	 */
-	public synchronized List allScripts() {
-		if(scripts == null) {
-			scripts = new HashMap();
-			List threads = allThreads();
-			for (Iterator iter = threads.iterator(); iter.hasNext();) {
-				CFThreadReference thread = (CFThreadReference) iter.next();
-				CFRequestPacket request = new CFRequestPacket(Commands.SCRIPTS, thread.id());
-				request.setArgument(Attributes.INCLUDE_SOURCE, Boolean.FALSE);
-				CFResponsePacket response = sendRequest(request);
-				if(response.isSuccess()) {
-					List scriptz = (List) response.getBody().get(Commands.SCRIPTS);
-					for (Iterator iter2 = scriptz.iterator(); iter2.hasNext();) {
-						Map smap = (Map) iter2.next();
-						Map scriptjson = (Map) smap.get(Attributes.SCRIPT);
-						if(scriptjson != null) {
-							CFScriptReference script = new CFScriptReference(this, thread.id(), scriptjson); 
-							scripts.put(script.id(), script);
-						}
-					}
-				}
-				else if(TRACE) {
-					Tracing.writeString("VM [failed scripts request]: "+JSON.serialize(request)); //$NON-NLS-1$
-				}
-			}
-			if(scripts.size() < 1) {
-				scripts = null;
-				return Collections.EMPTY_LIST;
-			}
-		}
-		return new ArrayList(scripts.values());
-	}
-
-	/**
-	 * Returns the script with the given id or <code>null</code>
-	 * 
-	 * @param id
-	 * @return the thread or <code>null</code>
-	 */
-	public synchronized CFScriptReference findScript(String id) {
-		if(scripts == null) {
-			allScripts();
-		}
-		CFScriptReference script = null;
-		if(scripts != null) {
-			//the scripts collection can be null after a call to allScripts()
-			//when the remote target had no scripts loaded. In this case
-			//we do not keep the initialized collection so that any successive 
-			//calls the this method or allScripts will cause the remote target 
-			//to be asked for all of its scripts
-			script = (CFScriptReference) scripts.get(id);
-		}
-		//if we find we have a script id that is not cached, we should try a lookup + add in the vm
-		if(script == null) {
-			if(TRACE) {
-				Tracing.writeString("VM [failed to find script]: "+id); //$NON-NLS-1$
-			}
-		}
-		return script;
-	}
-	
-	/**
-	 * Adds the given script to the listing
-	 * 
-	 * @param context_id
-	 * @param json
-	 * 
-	 * @return the new script
-	 */
-	public CFScriptReference addScript(String context_id, Map json) {
-		if(scripts == null) {
-			allScripts();
-		}
-		CFScriptReference script = new CFScriptReference(this, context_id, json);
-		scripts.put(script.id(), script);
-		return script;
-	}
-	
-	/**
-	 * Removes all {@link CFScriptReference}s from the cache when the associated context is destroyed
-	 * 
-	 * @param contextid
-	 */
-	public void removeScriptsForContext(String contextid) {
-		if(scripts != null) {
-			Entry e = null;
-			for(Iterator i = scripts.entrySet().iterator(); i.hasNext();) {
-				e = (Entry) i.next();
-				if(contextid.equals(((CFScriptReference)e.getValue()).context())) {
-					i.remove();
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Removes the script with the given id form the listing
-	 * 
-	 * @param id the script to remove
-	 */
-	public void removeScript(String id) {
-		if(scripts != null) {
-			Object obj = scripts.remove(id);
-			if(TRACE && obj == null) {
-				Tracing.writeString("VM [failed to remove script]: "+id); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#dispose()
-	 */
-	public synchronized void dispose() {
-		try {
-			if(TRACE) {
-				Tracing.writeString("VM [disposing]"); //$NON-NLS-1$
-			}
-			queue.dispose();
-			ermanager.dispose();
-		}
-		finally {
-			//fall-back in case the VM has been disposed but not disconnected
-			disconnectVM();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfUndefined()
-	 */
-	public UndefinedValue mirrorOfUndefined() {
-		return undefinedvalue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfNull()
-	 */
-	public NullValue mirrorOfNull() {
-		return nullvalue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(boolean)
-	 */
-	public BooleanValue mirrorOf(boolean bool) {
-		return new CFBooleanValue(this, bool);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.Number)
-	 */
-	public NumberValue mirrorOf(Number number) {
-		return new CFNumberValue(this, number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.String)
-	 */
-	public StringValue mirrorOf(String string) {
-		return new CFStringValue(this, string);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventRequestManager()
-	 */
-	public synchronized EventRequestManager eventRequestManager() {
-		return ermanager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventQueue()
-	 */
-	public synchronized EventQueue eventQueue() {
-		return queue;
-	}
-	
-	/**
-	 * Receives an {@link CFEventPacket} from the underlying {@link DebugSession}, 
-	 * waiting for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * 
-	 * @return the next {@link CFEventPacket} never <code>null</code>
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public CFEventPacket receiveEvent() throws TimeoutException, DisconnectedException {
-		return (CFEventPacket) session.receive(CFEventPacket.EVENT, DEFAULT_TIMEOUT);
-	}
-
-	/**
-	 * Receives an {@link CFEventPacket} from the underlying {@link DebugSession}, 
-	 * waiting for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * @param timeout
-	 * @return the next {@link CFEventPacket} never <code>null</code>
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public CFEventPacket receiveEvent(int timeout) throws TimeoutException, DisconnectedException {
-		return (CFEventPacket) session.receive(CFEventPacket.EVENT, timeout);
-	}
-	
-	/**
-	 * Sends a request to the underlying {@link DebugSession}, waiting
-	 * for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * 
-	 * @param request
-	 * @return the {@link CFResponsePacket} for the request
-	 */
-	public CFResponsePacket sendRequest(CFRequestPacket request) {
-		try {
-			session.send(request);
-			return (CFResponsePacket) session.receiveResponse(request.getSequence(), 3000);
-		}
-		catch(DisconnectedException de) {
-			disconnectVM();
-			handleException(de.getMessage(), (de.getCause() == null ? de : de.getCause()));
-		}
-		catch(TimeoutException te) {
-			CrossFirePlugin.log(te);
-		}
-		return CFResponsePacket.FAILED;
-	}
-	
-	/**
-	 * disconnects the VM
-	 */
-	public synchronized void disconnectVM() {
-		if (disconnected) {
-			// no-op it is already disconnected
-			if(TRACE) {
-				Tracing.writeString("VM [already disconnected]"); //$NON-NLS-1$
-			}
-			return;
-		}
-		if(TRACE) {
-			Tracing.writeString("VM [disconnecting]"); //$NON-NLS-1$
-		}
-		try {
-			if(threads != null) {
-				threads.clear();
-			}
-			if(scripts != null) {
-				scripts.clear();
-			}
-			this.queue.dispose();
-			this.ermanager.dispose();
-			this.session.dispose();
-		} finally {
-			disconnected = true;
-			DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointListener#breakpointAdded(org.eclipse.debug.core.model.IBreakpoint)
-	 */
-	public void breakpointAdded(IBreakpoint breakpoint) {
-		if (JavaScriptDebugModel.MODEL_ID.equals(breakpoint.getModelIdentifier())) {
-			if (breakpoint instanceof IJavaScriptLineBreakpoint) {
-				//IJavaScriptLineBreakpoint bp = (IJavaScriptLineBreakpoint) breakpoint;
-				/*
-				 * Currently breakpoints are always set on the global context,
-				 * which is applied to subsequent loads of the breakpoint's url.
-				 */
-			//	setLineBreakpoint(bp, true);
-	
-				/* If a live script is found for this breakpoint then set it there too */
-			//	setLineBreakpoint(bp, false);
-			}
-	 	}
-	}
-
-	void setLineBreakpoint(IJavaScriptLineBreakpoint bp, boolean global) {
-		IResource resource = bp.getMarker().getResource();
-		QualifiedName qName = new QualifiedName(JavaScriptCore.PLUGIN_ID, "scriptURL"); //$NON-NLS-1$
-		try {
-			String url = resource.getPersistentProperty(qName);
-			if (url == null) {
-				String path = bp.getScriptPath();
-				url = JavaScriptDebugPlugin.getExternalScriptPath(new Path(path));
-				if (url == null) {
-					return;
-				}
-			}
-
-			String contextId = null;
-			if (!global) {
-				CFScriptReference script = findScript(url);
-				if (script == null) {
-					return;
-				}
-				contextId = script.context();
-			}
-
-			CFRequestPacket request = new CFRequestPacket(Commands.SET_BREAKPOINT, contextId);
-			request.setArgument(Attributes.TYPE, Attributes.LINE);
-			Map location = new HashMap();
-			location.put(Attributes.LINE, new Integer(bp.getLineNumber()));
-			location.put(Attributes.URL, url);
-			request.setArgument(Attributes.LOCATION, location);
-			if (bp.isConditionEnabled() && bp.getCondition() != null) {
-				request.setArgument(Attributes.CONDITION, bp.getCondition());	
-			}
-			request.setArgument(Attributes.ENABLED, bp.isEnabled() ? Boolean.TRUE : Boolean.FALSE);
-			CFResponsePacket response = sendRequest(request);
-			if (response.isSuccess()) {
-				Map bpMap = (Map)response.getBody().get(Attributes.BREAKPOINT);
-				int handle = ((BigDecimal)bpMap.get(Attributes.HANDLE)).intValue();
-				breakpointHandles.put(bp, new Integer(handle));
-			} else if(TRACE) {
-				Tracing.writeString("[failed setbreakpoint request] "+JSON.serialize(request)); //$NON-NLS-1$
-			}
-		} catch(CoreException ce) {
-			CrossFirePlugin.log(ce);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointListener#breakpointRemoved(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
-	 */
-	public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) {
-		if (JavaScriptDebugModel.MODEL_ID.equals(breakpoint.getModelIdentifier())) {
-			if (breakpoint instanceof IJavaScriptLineBreakpoint) {
-			//	IJavaScriptLineBreakpoint bp = (IJavaScriptLineBreakpoint) breakpoint;
-
-				/*
-				 * Currently breakpoints are always cleared from the global context,
-				 * which is applied to subsequent loads of the breakpoint's url.
-				 */
-			//	clearBreakpoint(bp, true);
-
-				/* If a live script is found for this breakpoint then clear it there too */
-			//	clearBreakpoint(bp, false);
-			}
-		}
-	}
-
-	void clearBreakpoint(IJavaScriptLineBreakpoint bp, boolean global) {
-		Integer handle = (Integer)breakpointHandles.get(bp);
-		if (handle == null) {
-			return;
-		}
-
-		try {
-			String contextId = null;
-			if (!global) {
-				IResource resource = bp.getMarker().getResource();
-				QualifiedName qName = new QualifiedName(JavaScriptCore.PLUGIN_ID, "scriptURL"); //$NON-NLS-1$
-				String url = resource.getPersistentProperty(qName);
-				if (url == null) {
-					String path = bp.getScriptPath();
-					url = JavaScriptDebugPlugin.getExternalScriptPath(new Path(path));
-					if (url == null) {
-						return;
-					}
-				}
-
-				CFScriptReference script = findScript(url);
-				if (script == null) {
-					return;
-				}
-				contextId = script.context();
-			}
-
-			CFRequestPacket request = new CFRequestPacket(Commands.CLEAR_BREAKPOINT, contextId);
-			request.setArgument(Attributes.HANDLE, handle);
-			CFResponsePacket response = sendRequest(request);
-			if (!response.isSuccess()) {
-				breakpointHandles.remove(bp);
-			} else if (TRACE) {
-				Tracing.writeString("[failed clearbreakpoint request] "+JSON.serialize(request)); //$NON-NLS-1$
-			}
-		} catch(CoreException ce) {
-			CrossFirePlugin.log(ce);
-		}
-	}			
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointListener#breakpointChanged(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
-	 */
-	public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) {
-		if (delta.getKind() == IResourceDelta.CHANGED && JavaScriptDebugModel.MODEL_ID.equals(breakpoint.getModelIdentifier())) {
-		//	IJavaScriptLineBreakpoint bp = (IJavaScriptLineBreakpoint) breakpoint;
-			/*
-			 * Currently breakpoints are always changed in the global context,
-			 * which is applied to subsequent loads of the breakpoint's url.
-			 */
-		//	changeBreakpoint(bp, true);
-
-			/* If a live script is found for this breakpoint then change it there too */
-		//	changeBreakpoint(bp, false);
-		}
-	}
-
-	void changeBreakpoint(IJavaScriptLineBreakpoint bp, boolean global) {
-		Integer handle = (Integer)breakpointHandles.get(bp);
-		if (handle == null) {
-			return;
-		}
-
-		try {
-			String contextId = null;
-			if (!global) {
-				IResource resource = bp.getMarker().getResource();
-				QualifiedName qName = new QualifiedName(JavaScriptCore.PLUGIN_ID, "scriptURL"); //$NON-NLS-1$
-				String url = resource.getPersistentProperty(qName);
-				if (url == null) {
-					String path = bp.getScriptPath();
-					url = JavaScriptDebugPlugin.getExternalScriptPath(new Path(path));
-					if (url == null) {
-						return;
-					}
-				}
-
-				CFScriptReference script = findScript(url);
-				if (script == null) {
-					return;
-				}
-				contextId = script.context();
-			}
-
-			CFRequestPacket request = new CFRequestPacket(Commands.CHANGE_BREAKPOINT, contextId);
-			request.setArgument(Attributes.HANDLE, handle);
-			request.setArgument(Attributes.ENABLED, bp.isEnabled() ? Boolean.TRUE : Boolean.FALSE);
-			request.setArgument(Attributes.CONDITION, bp.isConditionEnabled() ? bp.getCondition() : null);
-			CFResponsePacket response = sendRequest(request);
-			if (!response.isSuccess() && TRACE) {
-				Tracing.writeString("[failed changebreakpoint request] "+JSON.serialize(request)); //$NON-NLS-1$
-			}
-		} catch(CoreException ce) {
-			CrossFirePlugin.log(ce);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/Messages.java
deleted file mode 100644
index de129f0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/Messages.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.messages"; //$NON-NLS-1$
-	public static String crossfire_vm;
-	public static String thread_name;
-	public static String vm_name;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/messages.properties
deleted file mode 100644
index faa75c2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-crossfire_vm=Crossfire VM
-thread_name={0} - {1}
-vm_name=CrossFire VM
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFBreakpointRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFBreakpointRequest.java
deleted file mode 100644
index 4a33bd0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFBreakpointRequest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFScriptReference;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFVirtualMachine;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFRequestPacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFResponsePacket;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Commands;
-
-/**
- * Default implementation of {@link BreakpointRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFBreakpointRequest extends CFThreadEventRequest implements BreakpointRequest {
-
-	private String condition = null;
-	private int hitcount = 0;
-	private Location location = null;
-	private Long bpid = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param location
-	 */
-	public CFBreakpointRequest(VirtualMachine vm, Location location) {
-		super(vm);
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
-	 */
-	public void addConditionFilter(String condition) {
-		this.condition = condition;
-	}
-
-	/**
-	 * Returns the {@link String} condition set for this request using {@link #addConditionFilter(String)} or <code>null</code>
-	 * 
-	 * @return the condition filter or <code>null</code>
-	 */
-	public String getConditionFilter() {
-		return condition;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
-	 */
-	public void addHitCountFilter(int hitcount) {
-		this.hitcount = hitcount;
-	}
-
-	/**
-	 * Returns the hit count set using {@link #addHitCountFilter(int)} or <code>0</code>
-	 * 
-	 * @return the specified hit count or <code>0</code>
-	 */
-	public int getHitCount() {
-		return hitcount;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFEventRequest#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		super.setEnabled(enabled);
-		if(enabled) {
-			//send setbreakpoint request
-			CFScriptReference script = (CFScriptReference) location.scriptReference();
-			CFRequestPacket request = new CFRequestPacket(Commands.SET_BREAKPOINT, script.context());
-			request.setArgument(Attributes.TYPE, Attributes.LINE);
-			Map loc = new HashMap();
-			loc.put(Attributes.LINE, new Integer(location.lineNumber()));
-			loc.put(Attributes.URL, script.id());
-			request.setArgument(Attributes.LOCATION, loc);
-			if (condition != null) {
-				request.setArgument(Attributes.CONDITION, condition);	
-			}
-			request.setArgument(Attributes.ENABLED, Boolean.TRUE);
-			CFResponsePacket response = ((CFVirtualMachine)virtualMachine()).sendRequest(request);
-			if(response.isSuccess()) {
-				//process the response to get the id of the breakpoint
-				Map bp = (Map) response.getBody().get(Attributes.BREAKPOINT);
-				if(bp != null) {
-					Number id = (Number) bp.get(Attributes.HANDLE);
-					bpid = new Long(id.longValue());
-				}
-			}
-		}
-		else if(bpid != null) {
-			//send clearbreakpoint request
-			CFScriptReference script = (CFScriptReference) location.scriptReference();
-			CFRequestPacket request = new CFRequestPacket(Commands.CLEAR_BREAKPOINT, script.context());
-			request.getArguments().put(Attributes.HANDLE, bpid);
-			CFResponsePacket response = ((CFVirtualMachine)virtualMachine()).sendRequest(request);
-			if(response.isSuccess()) {
-				bpid = null;
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDeathRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDeathRequest.java
deleted file mode 100644
index ab8bc70..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDeathRequest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-
-/**
- * Default implementation of {@link VMDeathRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFDeathRequest extends CFEventRequest implements VMDeathRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFDeathRequest(VirtualMachine vm) {
-		super(vm);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDebuggerRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDebuggerRequest.java
deleted file mode 100644
index 5b65094..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDebuggerRequest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-
-/**
- * Default implementation of {@link DebuggerStatementRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFDebuggerRequest extends CFThreadEventRequest implements DebuggerStatementRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFDebuggerRequest(VirtualMachine vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDisconnectRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDisconnectRequest.java
deleted file mode 100644
index 5cf1913..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDisconnectRequest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-
-/**
- * Default implementation of {@link VMDisconnectRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFDisconnectRequest extends CFEventRequest implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFDisconnectRequest(VirtualMachine vm) {
-		super(vm);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFEventRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFEventRequest.java
deleted file mode 100644
index a3eecc6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFEventRequest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default {@link EventRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFEventRequest implements EventRequest {
-
-	private boolean enabled = false;
-	private VirtualMachine vm = null;
-	
-	/**
-	 * Constructor
-	 */
-	public CFEventRequest(VirtualMachine vm) {
-		this.vm = vm;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFExceptionRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFExceptionRequest.java
deleted file mode 100644
index 9633811..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFExceptionRequest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-
-/**
- * Default implementation of {@link ExceptionRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFExceptionRequest extends CFThreadEventRequest implements ExceptionRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFExceptionRequest(VirtualMachine vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFResumeRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFResumeRequest.java
deleted file mode 100644
index ae9c06c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFResumeRequest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-
-/**
- * Crossfire implementation of {@link ResumeRequest}
- * 
- * @since 1.0
- */
-public class CFResumeRequest extends CFThreadEventRequest implements ResumeRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 */
-	public CFResumeRequest(VirtualMachine vm, ThreadReference thread) {
-		super(vm);
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFScriptLoadRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFScriptLoadRequest.java
deleted file mode 100644
index 6d3bc91..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFScriptLoadRequest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-
-/**
- * Default implementation of {@link ScriptLoadRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFScriptLoadRequest extends CFEventRequest implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFScriptLoadRequest(VirtualMachine vm) {
-		super(vm);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFStepRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFStepRequest.java
deleted file mode 100644
index 7695fff..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFStepRequest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFThreadReference;
-
-/**
- * Default implementation of {@link StepRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFStepRequest extends CFThreadEventRequest implements StepRequest {
-
-	private int stepkind = 0;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFStepRequest(VirtualMachine vm, ThreadReference thread, int step) {
-		super(vm);
-		setThread(thread);
-		this.stepkind = step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#step()
-	 */
-	public int step() {
-		return stepkind;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFEventRequest#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		super.setEnabled(enabled);
-		((CFThreadReference)thread()).setStep((enabled ? stepkind : -1));
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFSuspendRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFSuspendRequest.java
deleted file mode 100644
index 62fd7f6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFSuspendRequest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-
-/**
- * Default implementation of {@link SuspendRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFSuspendRequest extends CFThreadEventRequest implements SuspendRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFSuspendRequest(VirtualMachine vm, ThreadReference thread) {
-		super(vm);
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEnterRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEnterRequest.java
deleted file mode 100644
index 25b3cb5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEnterRequest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-
-/**
- * Default implementation of {@link ThreadEnterRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadEnterRequest extends CFThreadEventRequest implements ThreadEnterRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFThreadEnterRequest(VirtualMachine vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEventRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEventRequest.java
deleted file mode 100644
index c44ce0b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEventRequest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Abstract notion of an event that knows about a thread
- * 
- * @since 1.0
- */
-public class CFThreadEventRequest extends CFEventRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFThreadEventRequest(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/**
-	 * Sets the backing {@link ThreadReference} for the request
-	 * @param thread
-	 */
-	public void setThread(ThreadReference thread) {
-		this.thread = thread;
-	}
-	
-	/**
-	 * Returns the underlying {@link ThreadReference} this request is filtered to.
-	 * @return the thread filter
-	 */
-	public ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadExitRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadExitRequest.java
deleted file mode 100644
index a9434bf..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadExitRequest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-
-/**
- * Default implementation of {@link ThreadExitRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadExitRequest extends CFThreadEventRequest implements ThreadExitRequest {
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFThreadExitRequest(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/Attributes.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/Attributes.java
deleted file mode 100644
index 4fc91aa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/Attributes.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-/**
- * Interface for all the attribute constants
- * 
- * @since 1.0
- */
-public interface Attributes {
-
-	/**
-	 * The "arguments" attribute
-	 */
-	public static final String ARGUMENTS = "arguments"; //$NON-NLS-1$
-	/**
-	 * The "body" attribute
-	 */
-	public static final String BODY = "body"; //$NON-NLS-1$
-	/**
-	 * The type "boolean"
-	 */
-	public static final String BOOLEAN = "boolean"; //$NON-NLS-1$
- 	/**
-	 * The "breakpoint" attribute
-	 */
-	public static final String BREAKPOINT = "breakpoint"; //$NON-NLS-1$
-	/**
-	 * The "breakpoints" attribute
-	 */
-	public static final String BREAKPOINTS = "breakpoints"; //$NON-NLS-1$
-	/**
-	 * The "columnOffset" attribute
-	 */
-	public static final String COLUMN_OFFSET = "columnOffset"; //$NON-NLS-1$
-	/**
-	 * The "command" attribute
-	 */
-	public static final String COMMAND = "command"; //$NON-NLS-1$
-	/**
-	 * The "condition" argument
-	 */
-	public static final String CONDITION = "condition"; //$NON-NLS-1$
-	/**
-	 * the "constructor" attribute
-	 */
-	public static final String CONSTRUCTOR = "constructor"; //$NON-NLS-1$
-	/**
-	 * the "context_href" attribute
-	 */
-	public static final String CONTEXT_HREF = "context_href"; //$NON-NLS-1$
-	/**
-	 * The "context_id" attribute
-	 */
-	public static final String CONTEXT_ID = "context_id"; //$NON-NLS-1$
-	/**
-	 * The "contexts" attribute
-	 */
-	public static final String CONTEXTS = "contexts"; //$NON-NLS-1$
-	/**
-	 * The "crossfire_id" attribute
-	 */
-	public static final String CROSSFIRE_ID = "crossfire_id"; //$NON-NLS-1$
-	/**
-	 * The "data" attribute
-	 */
-	public static final String DATA = "data"; //$NON-NLS-1$
-	/**
-	 * The "enabled" argument
-	 */
-	public static final String ENABLED = "enabled"; //$NON-NLS-1$
-	/**
-	 * The "expression" attribute
-	 */
-	public static final String EXPRESSION = "expression"; //$NON-NLS-1$
-	/**
-	 * The "frame" attribute
-	 */
-	public static final String FRAME = "frame"; //$NON-NLS-1$
-	/**
-	 * The "frameIndex" argument
-	 */
-	public static final String FRAME_INDEX = "frameIndex"; //$NON-NLS-1$
-	/**
-	 * The "frameNumber" argument
-	 */
-	public static final String FRAME_NUMBER = "frameNumber"; //$NON-NLS-1$
-	/**
-	 * The "frames" attribute
-	 */
-	public static final String FRAMES = "frames"; //$NON-NLS-1$
-	/**
-	 * The "fromFrame" attribute
-	 */
-	public static final String FROM_FRAME = "fromFrame"; //$NON-NLS-1$
-	/**
-	 * The "func" attribute
-	 */
-	public static final String FUNC = "func"; //$NON-NLS-1$
-	/**
-	 * The type "function"
-	 */
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-	/**
-	 * The "handle" attribute
-	 */
-	public static final String HANDLE = "handle"; //$NON-NLS-1$
-	/**
-	 * The "handshake" attribute
-	 */
-	public static final String HANDSHAKE = "handshake"; //$NON-NLS-1$
-	/**
-	 * The "href" attribute
-	 */
-	public static final String HREF = "href"; //$NON-NLS-1$
-	/**
-	 * The "id" attribute
-	 */
-	public static final String ID = "id"; //$NON-NLS-1$
-	/**
-	 * The "includeScopes" attribute
-	 */
-	public static final String INCLUDE_SCOPES = "includeScopes"; //$NON-NLS-1$
-	/**
-	 * The "includeSource" attribute
-	 */
-	public static final String INCLUDE_SOURCE = "includeSource"; //$NON-NLS-1$
-	/**
-	 * The "index" attribute
-	 */
-	public static final String INDEX = "index"; //$NON-NLS-1$
-	/**
-	 * The "line" attribute
-	 */
-	public static final String LINE = "line"; //$NON-NLS-1$
-	/**
-	 * The "lineCount" attribute
-	 */
-	public static final String LINE_COUNT = "lineCount"; //$NON-NLS-1$
-	/**
-	 * The "lineOffset" attribute
-	 */
-	public static final String LINE_OFFSET = "lineOffset"; //$NON-NLS-1$
-	/**
-	 * The "locals" attribute
-	 */
-	public static final String LOCALS = "locals"; //$NON-NLS-1$
-	/**
-	* The "location" attribute
-	*/
-	public static final String LOCATION = "location"; //$NON-NLS-1$
-	/**
-	 * The message attribute for this packet
-	 */
-	public static final String MESSAGE = "message"; //$NON-NLS-1$
-	/**
-	 * The type "number"
-	 */
-	public static final String NUMBER = "number"; //$NON-NLS-1$
-	/**
-	 * The type "object"
-	 */
-	public static final String OBJECT = "object"; //$NON-NLS-1$
-	/**
-	 * The type "proto"
-	 */
-	public static final String PROTO = "proto"; //$NON-NLS-1$
-	/**
-	 * The "ref" attribute / type
-	 */
-	public static final String REF = "ref"; //$NON-NLS-1$
-	/**
-	 * The "request_seq" attribute
-	 */
-	public static final String REQUEST_SEQ = "request_seq"; //$NON-NLS-1$
-	/**
-	 * The "result" attribute
-	 */
-	public static final String RESULT = "result"; //$NON-NLS-1$
-	/**
-	 * The running attribute for this packet
-	 */
-	public static final String RUNNING = "running"; //$NON-NLS-1$
-	/**
-	 * The "scopes" attribute
-	 */
-	public static final String SCOPES = "scopes"; //$NON-NLS-1$
-	/**
-	 * The "script" attribute
-	 */
-	public static final String SCRIPT = "script"; //$NON-NLS-1$
-	/**
-	 * The "seq" attribute
-	 */
-	public static final String SEQ = "seq"; //$NON-NLS-1$
-	/**
-	 * The "set" attribute
-	 */
-	public static final String SET = "set"; //$NON-NLS-1$
-	/**
-	 * The "source" attribute
-	 */
-	public static final String SOURCE = "source"; //$NON-NLS-1$
-	/**
-	 * The "sourceLength" attribute
-	 */
-	public static final String SOURCE_LENGTH = "sourceLength"; //$NON-NLS-1$
-	/**
-	 * The "stepaction" attribute
-	 */
-	public static final String STEPACTION = "stepaction"; //$NON-NLS-1$
-	/**
-	 * The type "string"
-	 */
-	public static final String STRING = "string"; //$NON-NLS-1$
-	/**
-	 * The success attribute for this packet
-	 */
-	public static final String SUCCESS = "success"; //$NON-NLS-1$
-	/**
-	 * The "this" attribute
-	 */
-	public static final String THIS = "this"; //$NON-NLS-1$
-	/**
-	 * The "type" attribute
-	 */
-	public static final String TYPE = "type"; //$NON-NLS-1$
-	/**
-	 * The "url" attribute
-	 */
-	public static final String URL = "url"; //$NON-NLS-1$
-	/**
-	 * The "value" attribute
-	 */
-	public static final String VALUE = "value"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFEventPacket.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFEventPacket.java
deleted file mode 100644
index 8135c2e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFEventPacket.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Event;
-
-
-/**
- * An {@link CFEventPacket} is a specialized {@link CFPacket}
- * that only handles <code>event</code> data.
- * 
- * @since 1.0
- */
-public class CFEventPacket extends CFPacket implements Event {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String EVENT = "event"; //$NON-NLS-1$
-	/**
-	 * The "closed" event kind
-	 */
-	public static final String CLOSED = "closed"; //$NON-NLS-1$
-	/**
-	 * The "onScript" event kind
-	 */
-	public static final String ON_SCRIPT = "onScript"; //$NON-NLS-1$
-	/**
-	 * The "onBreak" event kind
-	 */
-	public static final String ON_BREAK = "onBreak"; //$NON-NLS-1$
-	/**
-	 * The "onConsoleDebug" event kind
-	 */
-	public static final String ON_CONSOLE_DEBUG = "onConsoleDebug"; //$NON-NLS-1$
-	/**
-	 * The "onConsoleError" event kind
-	 */
-	public static final String ON_CONSOLE_ERROR = "onConsoleError"; //$NON-NLS-1$
-	/**
-	 * The "onConsoleInfo" event kind
-	 */
-	public static final String ON_CONSOLE_INFO = "onConsoleInfo"; //$NON-NLS-1$
-	/**
-	 * The "onConsoleLog" event kind
-	 */
-	public static final String ON_CONSOLE_LOG = "onConsoleLog"; //$NON-NLS-1$
-	/**
-	 * The "onConsoleWarn" event kind
-	 */
-	public static final String ON_CONSOLE_WARN = "onConsoleWarn"; //$NON-NLS-1$
-	/**
-	 * The "onInspectNode" event kind
-	 */
-	public static final String ON_INSPECT_NODE = "onInspectNode"; //$NON-NLS-1$
-	/**
-	 * The "onResume" event kind
-	 */
-	public static final String ON_RESUME = "onResume"; //$NON-NLS-1$
-	/**
-	 * The "onToggleBreakpoint" event kind
-	 */
-	public static final String ON_TOGGLE_BREAKPOINT = "onToggleBreakpoint"; //$NON-NLS-1$
-	/**
-	 * The "onContextCreated" event kind
-	 */
-	public static final String ON_CONTEXT_CREATED = "onContextCreated"; //$NON-NLS-1$
-	/**
-	 * The "onContextDestroyed" event kind
-	 */
-	public static final String ON_CONTEXT_DESTROYED = "onContextDestroyed"; //$NON-NLS-1$
-	/**
-	 * The "onContextChanged" event kind
-	 */
-	public static final String ON_CONTEXT_CHANGED = "onContextChanged"; //$NON-NLS-1$
-	/**
-	 * The "onContextLoaded" event kind
-	 */
-	public static final String ON_CONTEXT_LOADED = "onContextLoaded"; //$NON-NLS-1$
-	
-	private final String event;
-	private final Map body = Collections.synchronizedMap(new HashMap());
-	
-	/**
-	 * Constructor
-	 * @param event
-	 */
-	public CFEventPacket(String event) {
-		super(EVENT, null);
-		this.event = event.intern();
-	}
-
-	/**
-	 * Constructor
-	 * @param json
-	 */
-	public CFEventPacket(Map json) {
-		super(json);
-		String packetEvent = (String) json.get(EVENT);
-		event = packetEvent.intern();
-		Object data = json.get(Attributes.DATA);
-		if(data instanceof Map) {
-			body.putAll((Map) data);
-		}
-		else if(data instanceof String ||
-				data instanceof List) {
-			body.put(Attributes.DATA, data);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Event#getEvent()
-	 */
-	public String getEvent() {
-		return event;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Event#getBody()
-	 */
-	public Map getBody() {
-		return body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(EVENT, event);
-		if(body.size() > 0) {
-			json.put(Attributes.BODY, body);
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("CFEventPacket: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFPacket.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFPacket.java
deleted file mode 100644
index 14e0343..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFPacket.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Abstract description of a packet for sending / receiving information to the debug client
- * using JSON
- *  
- *  @since 1.0
- */
-public abstract class CFPacket implements org.eclipse.wst.jsdt.debug.transport.packet.Packet {
-
-	/**
-	 * Debugging flag
-	 */
-	public static boolean TRACE = false;
-	
-	private final String type;
-	private final String context_id;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param type the type for the {@link CFPacket} <code>null</code> is not accepted
-	 */
-	protected CFPacket(String type, String context_id) {
-		if(type == null) {
-			throw new IllegalArgumentException("The type for a packet cannot be null"); //$NON-NLS-1$
-		}
-		this.type = type.intern();
-		this.context_id = context_id;
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json the pre-composed map of attributes for the packet, <code>null</code> is not accepted
-	 */
-	protected CFPacket(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException("The JSON map for a packet cannot be null"); //$NON-NLS-1$
-		}
-		String packetType = (String) json.get(Attributes.TYPE);
-		this.type = packetType.intern();
-		this.context_id = (String) json.get(Attributes.CONTEXT_ID);
-	}
-
-	/**
-	 * @return the context id or <code>null</code>
-	 */
-	public String getContextId() {
-		return context_id;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#getType()
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = new HashMap();
-		json.put(Attributes.TYPE, type);
-		if(context_id != null) {
-			json.put(Attributes.CONTEXT_ID, context_id);
-		}
-		return json;
-	}
-
-	/**
-	 * Returns the type from the given JSON map.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the map is not correctly
-	 * formed.
-	 * 
-	 * @param json the JSON map, <code>null</code> is not accepted
-	 * @return the type from the JSON map or <code>null</code>
-	 */
-	public static String getType(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException("A null JSON map is not allowed when trying to get the packet type"); //$NON-NLS-1$
-		}
-		return (String) json.get(Attributes.TYPE);
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("CFPacket: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-	
-	/**
-	 * Sets if packet transfer should be traced
-	 * @param tracing
-	 */
-	public static void setTracing(boolean tracing) {
-		TRACE = tracing;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFRequestPacket.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFRequestPacket.java
deleted file mode 100644
index 06128f6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFRequestPacket.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Request;
-
-/**
- * Default request implementation using JSON
- * 
- * @since 1.0
- */
-public class CFRequestPacket extends CFPacket implements Request {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String REQUEST = "request"; //$NON-NLS-1$
-	
-	private final String command;
-	private final Map arguments = Collections.synchronizedMap(new HashMap());
-	private final Map params = Collections.synchronizedMap(new HashMap());
-	private static int currentSequence = 0;
-	private final int sequence;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param command the command, <code>null</code> is not accepted
-	 * @param context_id the id of the context to scope the request to
-	 * @see http://getfirebug.com/wiki/index.php/Crossfire_Protocol_Reference for 
-	 * requests that do not require a context id.
-	 */
-	public CFRequestPacket(String command, String context_id) {
-		super(REQUEST, context_id);
-		if(command == null) {
-			throw new IllegalArgumentException("The request command kind cannot be null"); //$NON-NLS-1$
-		}
-		this.sequence = nextSequence();
-		this.command = command.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json map of JSON attributes, <code>null</code> is not accepted
-	 */
-	public CFRequestPacket(Map json) {
-		super(json);
-		if(json == null) {
-			throw new IllegalArgumentException("The JSON map for a request packet cannot be null"); //$NON-NLS-1$
-		}
-		String value = (String) json.get(Attributes.COMMAND);
-		this.command = value.intern();
-		Map packetArguments = (Map) json.get(Attributes.ARGUMENTS);
-		arguments.putAll(packetArguments);
-		Number packetSeq = (Number) json.get(Attributes.SEQ);
-		this.sequence = packetSeq.intValue();
-	}
-
-	/**
-	 * @return a next value for the sequence
-	 */
-	private static synchronized int nextSequence() {
-		return ++currentSequence;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getSequence()
-	 */
-	public int getSequence() {
-		return sequence;
-	}
-	
-	/**
-	 * Allows additional parameters to be added to the request
-	 * 
-	 * @param key
-	 * @param value
-	 */
-	public void addAdditionalParam(String key, Object value) {
-		params.put(key, value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getArguments()
-	 */
-	public Map getArguments() {
-		return arguments;
-	}
-
-	/**
-	 * Sets the given argument in the JSON map.
-	 * 
-	 * @param key the key for the attribute, <code>null</code> is not accepted
-	 * @param argument the value for the argument
-	 */
-	public void setArgument(String key, Object argument) {
-		if(key == null) {
-			throw new IllegalArgumentException("The argument key cannot be null"); //$NON-NLS-1$
-		}
-		arguments.put(key, argument);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(Attributes.SEQ, new Integer(sequence));
-		json.put(Attributes.COMMAND, command);
-		if(!arguments.isEmpty()) {
-			json.put(Attributes.ARGUMENTS, arguments);
-		}
-		Entry entry = null;
-		for(Iterator iter = params.entrySet().iterator(); iter.hasNext();) {
-			entry = (Entry) iter.next();
-			json.put(entry.getKey(), entry.getValue());
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("CFRequestPacket: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFResponsePacket.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFResponsePacket.java
deleted file mode 100644
index 9f54cf9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFResponsePacket.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * Default {@link CFResponsePacket} implementation using JSON
- * 
- * @since 1.0
- */
-public class CFResponsePacket extends CFPacket implements Response {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String RESPONSE = "response"; //$NON-NLS-1$
-	
-	static final Map failed_attributes;
-	static {
-		failed_attributes = new HashMap();
-		Integer value = new Integer(-1);
-		failed_attributes.put(Attributes.SEQ, value);
-		failed_attributes.put(Attributes.TYPE, RESPONSE);
-		failed_attributes.put(Attributes.REQUEST_SEQ, value);
-		failed_attributes.put(Attributes.COMMAND, "failed"); //$NON-NLS-1$
-		failed_attributes.put(Attributes.SUCCESS, Boolean.FALSE);
-		failed_attributes.put(Attributes.RUNNING, Boolean.FALSE);
-	}
-	
-	public static final CFResponsePacket FAILED = new CFResponsePacket(failed_attributes);
-	
-	private String command;
-	private int requestSequence;
-	private Map body = Collections.synchronizedMap(new HashMap());
-	private volatile boolean success = true;
-	private volatile boolean running = true;
-	private volatile String message;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param requestSequence the sequence
-	 * @param command the command, <code>null</code> is not accepted
-	 */
-	public CFResponsePacket(int requestSequence, String command) {
-		super(RESPONSE, null);
-		if(command == null) {
-			throw new IllegalArgumentException("The command string for a response packet cannot be null"); //$NON-NLS-1$
-		}
-		this.requestSequence = requestSequence;
-		this.command = command.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json the JSON map for a response, <code>null</code> is not accepted
-	 */
-	public CFResponsePacket(Map json) {
-		super(json);
-		Number packetRequestSeq = (Number) json.get(Attributes.REQUEST_SEQ);
-		requestSequence = packetRequestSeq.intValue();
-
-		String packetCommand = (String) json.get(Attributes.COMMAND);
-		command = packetCommand.intern();
-
-		Object bdy = json.get(Attributes.BODY);
-		if(bdy instanceof Map) {
-			Map packetBody = (Map)bdy; 
-			body.putAll(packetBody);
-		}
-
-		Boolean packetSuccess = (Boolean) json.get(Attributes.SUCCESS);
-		success = packetSuccess.booleanValue();
-
-		Boolean packetRunning = (Boolean) json.get(Attributes.RUNNING);
-		running = packetRunning.booleanValue();
-
-		message = (String) json.get(Attributes.MESSAGE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getRequestSequence()
-	 */
-	public int getRequestSequence() {
-		return requestSequence;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getBody()
-	 */
-	public Map getBody() {
-		return body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isSuccess()
-	 */
-	public boolean isSuccess() {
-		return success;
-	}
-
-	/**
-	 * Set the success flag for the response
-	 * 
-	 * @param success the new success flag
-	 */
-	public void setSuccess(boolean success) {
-		this.success = success;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isRunning()
-	 */
-	public boolean isRunning() {
-		return running;
-	}
-
-	/**
-	 * Sets the running state of the underlying command
-	 * 
-	 * @param running the new running state for the underlying command
-	 */
-	public void setRunning(boolean running) {
-		this.running = running;
-	}
-
-	/**
-	 * Returns the status message for this {@link CFResponsePacket}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the status message for this {@link CFResponsePacket} or <code>null</code>
-	 */
-	public String getMessage() {
-		return message;
-	}
-
-	/**
-	 * Set the status message for this {@link CFResponsePacket}
-	 * 
-	 * @param message the new message, <code>null</code> is accepted
-	 */
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(Attributes.REQUEST_SEQ, new Integer(requestSequence));
-		json.put(Attributes.COMMAND, command);
-		if(body != null && body.size() > 0) {
-			json.put(Attributes.BODY, body);
-		}
-		json.put(Attributes.SUCCESS, new Boolean(success));
-		json.put(Attributes.RUNNING, new Boolean(running));
-		if (message != null) {
-			json.put(Attributes.MESSAGE, message);
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("CFResponsePacket: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFSocketConnection.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFSocketConnection.java
deleted file mode 100644
index 9a7042c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFSocketConnection.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.crossfire.Tracing;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-
-/**
- * A specialized {@link Connection} that communicates using {@link Socket}s
- * 
- * @since 1.0
- */
-public class CFSocketConnection extends SocketConnection {
-
-	/**
-	 * Constructor
-	 * 
-	 * @param socket the underlying {@link Socket}, <code>null</code> is not accepted
-	 * 
-	 * @throws IOException
-	 */
-	public CFSocketConnection(Socket socket) throws IOException {
-		super(socket);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String serialized = JSON.serialize((CFPacket) packet);
-		if(CFPacket.TRACE) {
-			Tracing.writeString("WRITE PACKET: "+serialized); //$NON-NLS-1$
-		}
-		Writer writer = getWriter();
-		writer.write(serialized);
-		writer.flush();
-	}
-
-	/**
-	 * Writes the standard handshake packet to connect
-	 * 
-	 * @param packet
-	 * @throws IOException
-	 */
-	public void writeHandShake() throws IOException {
-		if(CFPacket.TRACE) {
-			Tracing.writeString("WRITE HANDSHAKE: "+HandShakePacket.getHandshake()); //$NON-NLS-1$
-		}
-		Writer writer = getWriter();
-		writer.write(HandShakePacket.getHandshake());
-		writer.flush();
-	}
-	
-	/**
-	 * Reads the {@link HandShakePacket} packet from the the stream
-	 * 
-	 * @return the {@link HandShakePacket}, never <code>null</code>
-	 * @throws IOException
-	 */
-	public CFPacket readHandShake() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		//read the header first
-		int c = 0;
-		boolean r = false;
-		Reader reader = getReader();
-		while((c = reader.read()) > -1) {
-			buffer.append((char)c);
-			if(r) {
-				if(c == '\n') {
-					break;
-				}
-			}
-			r = c == '\r';
-		}
-		//chew up the tool heading if there is one
-		r = false;
-		while(reader.ready() && (c = reader.read()) > -1) {
-			if(r) {
-				if(c == '\n') {
-					break;
-				}
-			}
-			r = c == '\r';
-		}
-		if(buffer.toString().equals(HandShakePacket.getHandshake())) {
-			HandShakePacket ack = new HandShakePacket();
-			if(CFPacket.TRACE) {
-				Tracing.writeString("ACK HANDSHAKE: "+buffer.toString()); //$NON-NLS-1$
-			}
-			return ack;
-		}		
-		throw new IOException("Did not get correct CrossFire handshake"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		StringBuffer raw = new StringBuffer();
-		int c = -1;
-		boolean r = false;
-		String len = null;
-		Reader reader = getReader();
-		while((c = reader.read()) > -1) {
-			if(CFPacket.TRACE) {
-				raw.append((char)c);
-			}
-			if(r) {
-				if(c == '\n') {
-					String str = buffer.toString();
-					if(str.startsWith(JSON.CONTENT_LENGTH)) {
-						len = grabAttrib(str);
-					}
-					else if(str.equals("\r")) { //$NON-NLS-1$
-						break;
-					}
-					buffer = new StringBuffer();
-					r = false;
-				}
-				continue;
-			}
-			buffer.append((char)c);
-			r = c == '\r';
-		}
-		int length = 0;
-		try {
-			length = Integer.parseInt(len);
-		} catch (NumberFormatException e) {
-			if(CFPacket.TRACE) {
-				Tracing.writeString("[SOCKET] failed to read content length: "+raw.toString()); //$NON-NLS-1$
-			}
-			throw new IOException("Failed to parse content length: " + raw.toString()); //$NON-NLS-1$
-		}
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0) {
-				throw new EOFException();
-			}
-			n += count;
-		}
-		if(CFPacket.TRACE) {
-			raw.append(message);
-			Tracing.writeString("READ PACKET: " + raw.toString()); //$NON-NLS-1$
-		}
-		Map json = (Map) JSON.read(new String(message));
-		String type = CFPacket.getType(json);
-		if (CFEventPacket.EVENT.equals(type)) {
-			return new CFEventPacket(json);
-		}
-		if (CFRequestPacket.REQUEST.equals(type)) {
-			return new CFRequestPacket(json);
-		}
-		if (CFResponsePacket.RESPONSE.equals(type)) {
-			return new CFResponsePacket(json);
-		}
-		throw new IOException("Unknown packet type: " + type); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Grabs the attribute from the RHS of the header. Where all headers
-	 * have the form <code>[name]:[value]</code>.
-	 * 
-	 * @param str the string to parse
-	 * @return the <code>[value]</code> from the header
-	 */
-	String grabAttrib(String str) {
-		if(str != null) {
-			int idx = str.indexOf(':');
-			if(idx > -1) {
-				return str.substring(idx+1, str.length()-1);
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFTransportService.java
deleted file mode 100644
index 006584d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/CFTransportService.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService;
-
-
-/**
- * Implementation of a transport service that using a {@link Socket} for communication
- * 
- * @since 1.0
- */
-public class CFTransportService extends SocketTransportService {
-
-	static final Class serverSocketClass = ServerSocket.class; // temporary used to pre-load the ServerSocket.class
-
-	/**
-	 * Map of {@link ListenerKey} to {@link ServerSocket}s
-	 */
-	Map listeners = new HashMap();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#getConnection(java.net.Socket)
-	 */
-	public SocketConnection getConnection(Socket socket) throws IOException {
-		return new CFSocketConnection(socket);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAccept(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAccept(Connection connection) throws IOException {
-		if(connection instanceof CFSocketConnection) {
-			CFSocketConnection cfconn = (CFSocketConnection) connection;
-			Packet packet = cfconn.readHandShake();
-			if (!(packet instanceof HandShakePacket)) {
-				throw new IOException("failure establishing connection"); //$NON-NLS-1$
-			}
-			cfconn.writeHandShake();
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAttach(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAttach(Connection connection) throws IOException {
-		if(connection instanceof CFSocketConnection) {
-			CFSocketConnection cfconn = (CFSocketConnection) connection;
-			cfconn.writeHandShake();
-			Packet packet = cfconn.readHandShake();
-			if (!(packet instanceof HandShakePacket)) {
-				throw new IOException("failure establishing connection"); //$NON-NLS-1$
-			}
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/Commands.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/Commands.java
deleted file mode 100644
index 124c2f7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/Commands.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-/**
- * Interface for all the command constants
- * 
- * @since 1.0
- */
-public interface Commands {
-
-	/**
-	 * The "backtrace" command
-	 */
-	public static final String BACKTRACE = "backtrace"; //$NON-NLS-1$
-	/**
-	 * The "changebreakpoint" command
-	 */
-	public static final String CHANGE_BREAKPOINT = "changebreakpoint"; //$NON-NLS-1$
-	/**
-	 * The "clearbreakpoint" command
-	 */
-	public static final String CLEAR_BREAKPOINT = "clearbreakpoint"; //$NON-NLS-1$
-	/**
-	 * The "continue" command
-	 */
-	public static final String CONTINUE = "continue"; //$NON-NLS-1$
-	/**
-	 * The "evaluate" command
-	 */
-	public static final String EVALUATE = "evaluate"; //$NON-NLS-1$
-	/**
-	 * The "frame" command
-	 */
-	public static final String FRAME = "frame"; //$NON-NLS-1$
-	/**
-	 * The "getbreakpoint" command
-	 */
-	public static final String GET_BREAKPOINT = "getbreakpoint"; //$NON-NLS-1$
-	/**
-	 * The "getbreakpoints" command
-	 */
-	public static final String GET_BREAKPOINTS = "getbreakpoints"; //$NON-NLS-1$
-	/**
-	 * The "inspect" command
-	 */
-	public static final String INSPECT = "inspect"; //$NON-NLS-1$
-	/**
-	 * The "listcontexts" command
-	 */
-	public static final String LISTCONTEXTS = "listcontexts"; //$NON-NLS-1$
-	/**
-	 * The "lookup" command
-	 */
-	public static final String LOOKUP = "lookup"; //$NON-NLS-1$
-	/**
-	 * The "scope" command
-	 */
-	public static final String SCOPE = "scope"; //$NON-NLS-1$
-	/**
-	 * The "scopes" command
-	 */
-	public static final String SCOPES = "scopes"; //$NON-NLS-1$
-	/**
-	 * The "script" command
-	 */
-	public static final String SCRIPT = "script"; //$NON-NLS-1$
-	/**
-	 * The "scripts" command
-	 */
-	public static final String SCRIPTS = "scripts"; //$NON-NLS-1$
-	/**
-	 * The "setbreakpoint" command
-	 */
-	public static final String SET_BREAKPOINT = "setbreakpoint"; //$NON-NLS-1$
-	public static final String STEP_IN = "in"; //$NON-NLS-1$
-	public static final String STEP_NEXT = "next"; //$NON-NLS-1$
-	public static final String STEP_OUT = "out"; //$NON-NLS-1$
-	/**
-	 * The "source" command
-	 */
-	public static final String SOURCE = "source"; //$NON-NLS-1$
-	/**
-	 * The "suspend" command
-	 */
-	public static final String SUSPEND = "suspend"; //$NON-NLS-1$
-	/**
-	 * The "version" command
-	 */
-	public static final String VERSION = "version"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/HandShakePacket.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/HandShakePacket.java
deleted file mode 100644
index 7bc9987..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/HandShakePacket.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-import java.io.UnsupportedEncodingException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Constants;
-
-/**
- * {@link CFPacket} for replying to the Crossfire handshake request
- * 
- * @since 1.0
- */
-public class HandShakePacket extends CFPacket {
-	
-	/**
-	 * handshake
-	 */
-	private static String CROSSFIRE_HANDSHAKE;
-	static {
-		String hs = "CrossfireHandshake\r\n"; //$NON-NLS-1$
-		try {
-			CROSSFIRE_HANDSHAKE = new String(hs.getBytes(), Constants.UTF_8);
-		} catch (UnsupportedEncodingException e) {
-			CROSSFIRE_HANDSHAKE = hs;
-		} 
-	}
-	
-	/**
-	 * Constructor
-	 * @param type
-	 */
-	protected HandShakePacket() {
-		super(CFResponsePacket.RESPONSE, null);
-	}
-
-	/**
-	 * @return the handshake
-	 */
-	public static String getHandshake() {
-		return CROSSFIRE_HANDSHAKE;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFPacket#toString()
-	 */
-	public String toString() {
-		return CROSSFIRE_HANDSHAKE;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = new HashMap(1);
-		json.put(Attributes.HANDSHAKE, CROSSFIRE_HANDSHAKE);
-		return json;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/JSON.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/JSON.java
deleted file mode 100644
index 550a78d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/transport/JSON.java
+++ /dev/null
@@ -1,553 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.crossfire.transport;
-
-import java.math.BigDecimal;
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.crossfire.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFNullValue;
-import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFUndefinedValue;
-
-/**
- * Class for reading / writing JSON objects
- * <br><br>
- * Crossfire has the following types:
- * <ul>
- * 	<li>object</li>
- * 	<li>function</li>
- * 	<li>boolean</li>
- * 	<li>number</li>
- * 	<li>string</li>
- * 	<li>undefined</li>
- * 	<li>ref</li>
- * </ul> 
- * @since 1.0
- */
-public final class JSON {
-
-	static boolean TRACE = false;
-	static boolean PRE03 = false;
-	
-	/**
-	 * Standard line feed / control feed terminus for Crossfire packets
-	 */
-	public static final String LINE_FEED = "\r\n"; //$NON-NLS-1$
-	/**
-	 * The default <code>Content-Length:</code> pre-amble
-	 */
-	public static final String CONTENT_LENGTH = "Content-Length:"; //$NON-NLS-1$
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-	
-	/**
-	 * Enables / disables support for pre-0.3 support for serializing JSON
-	 * 
-	 * @param compat
-	 */
-	public static void setPre03Compat(boolean compat) {
-		PRE03 = compat;
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * No instantiation
-	 */
-	private JSON() {}
-	
-	/**
-	 * Writes the given key / value pair to the buffer in the form: <code>"key":["]value["]</code>
-	 * 
-	 * @param key
-	 * @param value
-	 * @param buffer
-	 */
-	public static void writeKeyValue(String key, Object value, StringBuffer buffer) {
-		writeString(key, buffer);
-		buffer.append(':');
-		writeValue(value, buffer);
-	}
-	
-	/**
-	 * Writes out the given value to the buffer. <br><br>
-	 * Values are written out as:
-	 * <ul>
-	 * 	<li>Boolean / Number: <code>value.toString()</code></li>
-	 * 	<li>String: <code>"value"</code></li>
-	 * 	<li>null: <code>null</code>
-	 * 	<li>Collection: <code>[{@link #writeValue(Object, StringBuffer)},...]</code></li>
-	 * 	<li>Map: <code>{"key":{@link #writeValue(Object, StringBuffer)},...}</code></li>
-	 * </ul>
-	 * 
-	 * @param value
-	 * @param buffer
-	 */
-	public static void writeValue(Object value, StringBuffer buffer) {
-		if (value == null) {
-			buffer.append(CFNullValue.NULL);
-		}
-		else if (value instanceof Boolean || value instanceof Number) {
-			buffer.append(value.toString());
-		}
-		else if (value instanceof String) {
-			writeString((String) value, buffer);
-		}
-		else if(value instanceof Collection) {
-			writeArray((Collection) value, buffer);
-		}
-		else if(value instanceof Map) {
-			writeObject((Map) value, buffer);
-		}
-	}
-	
-	/**
-	 * Writes the given {@link String} into the given {@link StringBuffer} properly escaping
-	 * all control characters
-	 * 
-	 * @param string
-	 * @param buffer
-	 */
-	public static void writeString(String string, StringBuffer buffer) {
-		buffer.append('"');
-		int length = string.length();
-		for (int i = 0; i < length; i++) {
-			char c = string.charAt(i);
-			switch (c) {
-				case '"' :
-				case '\\' :
-				case '/' : {
-					buffer.append('\\');
-					buffer.append(c);
-					break;
-				}
-				case '\b' : {
-					buffer.append("\\b"); //$NON-NLS-1$
-					break;
-				}
-				case '\f' : {
-					buffer.append("\\f"); //$NON-NLS-1$
-					break;
-				}
-				case '\n' : {
-					buffer.append("\\n"); //$NON-NLS-1$
-					break;
-				}
-				case '\r' : {
-					buffer.append("\\r"); //$NON-NLS-1$
-					break;
-				}
-				case '\t' : {
-					buffer.append("\\t"); //$NON-NLS-1$
-					break;
-				}
-				default :
-					if (Character.isISOControl(c)) {
-						buffer.append("\\u"); //$NON-NLS-1$
-						String hexString = Integer.toHexString(c);
-						for (int j = hexString.length(); j < 4; j++) {
-							buffer.append('0');
-						}
-						buffer.append(hexString);
-					} else {
-						buffer.append(c);
-					}
-			}
-		}
-		buffer.append('"');
-	}
-
-	/**
-	 * Writes the given collection into an array string of the form: <code>[{@link #writeValue(Object, StringBuffer)},...]</code>
-	 * 
-	 * @param collection
-	 * @param buffer
-	 */
-	static void writeArray(Collection collection, StringBuffer buffer) {
-		buffer.append('[');
-		for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
-			writeValue(iterator.next(), buffer);
-			if(iterator.hasNext()) {
-				buffer.append(',');
-			}
-		}
-		buffer.append(']');
-	}
-	
-	/**
-	 * Writes an object mapping to the given buffer in the form: <code>{"key":{@link #writeValue(Object, StringBuffer)},...}</code>
-	 * 
-	 * @param map
-	 * @param buffer
-	 */
-	public static void writeObject(Map map, StringBuffer buffer) {
-		buffer.append('{');
-		for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
-			String key = (String) iterator.next();
-			writeString(key, buffer);
-			buffer.append(':');
-			writeValue(map.get(key), buffer);
-			if(iterator.hasNext()) {
-				buffer.append(',');
-			}
-		}
-		buffer.append('}');
-	}
-	
-	/**
-	 * Writes the <code>Content-Length:N</code> pre-amble to the head of the given buffer
-	 * 
-	 * @param buffer
-	 * @param length
-	 */
-	public static void writeContentLength(StringBuffer buffer, int length) {
-		StringBuffer buff = new StringBuffer(18);
-		buff.append(CONTENT_LENGTH).append(length).append(LINE_FEED);
-		if(!PRE03) {
-			buff.append(LINE_FEED);
-		}
-		buffer.insert(0, buff);
-	}
-	
-	/**
-	 * Serializes the given {@link CFPacket} to a {@link String}
-	 * 
-	 * @param packet the packet to serialize
-	 * 
-	 * @return the serialized {@link String}, never <code>null</code>
-	 */
-	public static String serialize(CFPacket packet) {
-		Object json = packet.toJSON();
-		StringBuffer buffer = new StringBuffer();
-		writeValue(json, buffer);
-		int length = buffer.length();
-		buffer.append(LINE_FEED);
-		writeContentLength(buffer, length);
-		if(TRACE) {
-			Tracing.writeString("SERIALIZE: " + packet.getType() +" packet as "+buffer.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Reads and returns a new object from the given json {@link String}. This method
-	 * will throw an {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param jsonString
-	 * @return the object, never <code>null</code>
-	 */
-	public static Object read(String jsonString) {
-		return parse(new StringCharacterIterator(jsonString));
-	}
-	
-	/**
-	 * Reads and returns a new object form the given {@link CharacterIterator} that corresponds to
-	 * a properly formatted json string. This method will throw an {@link IllegalStateException} if
-	 * parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return the object, never <code>null</code>
-	 */
-	public static Object parse(CharacterIterator it) {
-		parseWhitespace(it);
-		Object result = parseValue(it);
-		parseWhitespace(it);
-		if (it.current() != CharacterIterator.DONE) {
-			throw error("should be done", it); //$NON-NLS-1$
-		}
-		return result;
-	}
-	
-	/**
-	 * Creates an {@link IllegalStateException} for the given message and iterator
-	 * 
-	 * @param message the message for the exception
-	 * @param it the {@link CharacterIterator} to parse
-	 * 
-	 * @return a new {@link IllegalStateException} 
-	 */
-	private static RuntimeException error(String message, CharacterIterator it) {
-		return new IllegalStateException("[" + it.getIndex() + "] " + message); //$NON-NLS-1$//$NON-NLS-2$
-	}
-	
-	/**
-	 * Chews up whitespace from the iterator
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 */
-	private static void parseWhitespace(CharacterIterator it) {
-		char c = it.current();
-		while (Character.isWhitespace(c)) {
-			c = it.next();
-		}
-	}
-	
-	/**
-	 * Parses the {@link Object} from the {@link CharacterIterator}. This method 
-	 * delegates to the proper parsing method depending on the current iterator context.
-	 * This method will throw an {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * 
-	 * @return the new object, never <code>null</code>
-	 * @see #parseString(CharacterIterator)
-	 * @see #parseNumber(CharacterIterator)
-	 * @see #parseArray(CharacterIterator)
-	 * @see #parseObject(CharacterIterator)
-	 */
-	private static Object parseValue(CharacterIterator it) {
-		switch (it.current()) {
-			case '{' : {
-				return parseObject(it);
-			}
-			case '[' : {
-				return parseArray(it);
-			}
-			case '"' : {
-				return parseString(it);
-			}
-			case '-' :
-			case '0' :
-			case '1' :
-			case '2' :
-			case '3' :
-			case '4' :
-			case '5' :
-			case '6' :
-			case '7' :
-			case '8' :
-			case '9' : {
-				return parseNumber(it);
-			}
-			case 't' : {
-				parseText(Boolean.TRUE.toString(), it);
-				return Boolean.TRUE;
-			}
-			case 'f' : {
-				parseText(Boolean.FALSE.toString(), it);
-				return Boolean.FALSE;
-			}
-			case 'n' : {
-				parseText(CFNullValue.NULL, it);
-				return null;
-			}
-			case 'u': {
-				parseText(CFUndefinedValue.UNDEFINED, it);
-				return null;
-			}
-		}
-		throw error("Bad JSON starting character '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-	}
-	
-	/**
-	 * Parses the JSON string from the {@link CharacterIterator}
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return the JSON {@link String}, never <code>null</code>
-	 */
-	private static String parseString(CharacterIterator it) {
-		char c = it.next();
-		if (c == '"') {
-			it.next();
-			return ""; //$NON-NLS-1$
-		}
-		StringBuffer buffer = new StringBuffer();
-		while (c != CharacterIterator.DONE && c != '"') {
-			if (Character.isISOControl(c)) {
-				//ignore it and continue
-				c = it.next();
-				continue;
-				//throw error("illegal iso control character: '" + Integer.toHexString(c) + "'", it); //$NON-NLS-1$ //$NON-NLS-2$);
-			}
-			if (c == '\\') {
-				c = it.next();
-				switch (c) {
-					case '"' :
-					case '\\' :
-					case '/' : {
-						buffer.append(c);
-						break;
-					}
-					case 'b' : {
-						buffer.append('\b');
-						break;
-					}
-					case 'f' : {
-						buffer.append('\f');
-						break;
-					}
-					case 'n' : {
-						buffer.append('\n');
-						break;
-					}
-					case 'r' : {
-						buffer.append('\r');
-						break;
-					}
-					case 't' : {
-						buffer.append('\t');
-						break;
-					}
-					case 'u' : {
-						StringBuffer unicode = new StringBuffer(4);
-						for (int i = 0; i < 4; i++) {
-							unicode.append(it.next());
-						}
-						try {
-							buffer.append((char) Integer.parseInt(unicode.toString(), 16));
-						} catch (NumberFormatException e) {
-							throw error("expected a unicode hex number but was '" + unicode.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-						}
-						break;
-					}
-					default : {
-						throw error("illegal escape character '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-					}
-				}
-			} else {
-				buffer.append(c);
-			}
-			c = it.next();
-		}
-		c = it.next();
-		return buffer.toString();
-	}
-	
-	/**
-	 * Parses an {@link Map} object from the iterator or throws an
-	 * {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return a new {@link Map} object, never <code>null</code>
-	 */
-	private static Map parseObject(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == '}') {
-			it.next();
-			return Collections.EMPTY_MAP;
-		}
-
-		Map map = new HashMap();
-		while (it.current() != CharacterIterator.DONE) {
-			if (it.current() != '"') {
-				throw error("expected a string start '\"' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			String key = parseString(it);
-			if (map.containsKey(key)) {
-				throw error("' already defined" + "key '" + key, it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			parseWhitespace(it);
-			if (it.current() != ':') {
-				throw error("expected a pair separator ':' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			it.next();
-			parseWhitespace(it);
-			Object value = parseValue(it);
-			map.put(key, value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-			if (it.current() != '}') {
-				throw error("expected an object close '}' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			break;
-		}
-		it.next();
-		return map;
-	}
-	
-	/**
-	 * Parses an {@link ArrayList} from the given iterator or throws an
-	 * {@link IllegalStateException} if parsing fails
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return a new {@link ArrayList} object never <code>null</code>
-	 */
-	private static List parseArray(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == ']') {
-			it.next();
-			return Collections.EMPTY_LIST;
-		}
-
-		List list = new ArrayList();
-		while (it.current() != CharacterIterator.DONE) {
-			Object value = parseValue(it);
-			list.add(value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-			if (it.current() != ']') {
-				throw error("expected an array close ']' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			break;
-		}
-		it.next();
-		return list;
-	}
-
-	/**
-	 * @param string
-	 * @param it
-	 */
-	private static void parseText(String string, CharacterIterator it) {
-		int length = string.length();
-		char c = it.current();
-		for (int i = 0; i < length; i++) {
-			if (c != string.charAt(i)) {
-				throw error("expected to parse '" + string + "' but character " + (i + 1) + " was '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$;
-			}
-			c = it.next();
-		}
-	}
-
-	/**
-	 * Parses a {@link Number} object from the given {@link CharacterIterator}
-	 * 
-	 * @param it
-	 * @return a new {@link Number}, never <code>null</code>
-	 */
-	private static Object parseNumber(CharacterIterator it) {
-		StringBuffer buffer = new StringBuffer();
-		char c = it.current();
-		while (Character.isDigit(c) || c == '-' || c == '+' || c == '.' || c == 'e' || c == 'E') {
-			buffer.append(c);
-			c = it.next();
-		}
-		try {
-			return new BigDecimal(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw error("expected a number but was '" + buffer.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project
deleted file mode 100644
index edf6952..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.rhino.debugger</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index b76afaa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Sun Feb 28 13:50:08 EST 2010
-eclipse.preferences.version=1
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF
deleted file mode 100644
index 3f8486b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-Vendor: %providerName
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.rhino.debugger
-Bundle-Version: 1.0.200.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Export-Package: org.eclipse.wst.jsdt.debug.internal.rhino.debugger;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.transport;x-friends:="org.eclipse.wst.jsdt.debug.rhino",
- org.eclipse.wst.jsdt.debug.rhino.debugger,
- org.eclipse.wst.jsdt.debug.rhino.debugger.shell
-Import-Package: org.mozilla.javascript;resolution:=optional,
- org.mozilla.javascript.debug;resolution:=optional,
- org.mozilla.javascript.tools;resolution:=optional,
- org.mozilla.javascript.tools.shell;resolution:=optional
-Require-Bundle: org.eclipse.wst.jsdt.debug.transport;bundle-version="1.0.0"
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 1508f4d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName = Eclipse Web Tools Platform
-Bundle-Name = Rhino Debugger
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties
deleted file mode 100644
index 04fa2df..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties
-src.includes = about.html
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java
deleted file mode 100644
index 3ebb1bb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.HashMap;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-
-/**
- * Implementation of a breakpoint wrt Rhino debugging
- * 
- * @since 1.0
- */
-public class Breakpoint {
-
-	final Long breakpointId;
-	final ScriptSource script;
-	final Integer lineNumber;
-	final Object functionName;
-	final String condition;
-	final Long threadId;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param breakpointId the id for the breakpoint
-	 * @param script the script the breakpoint applies to, <code>null</code> is not accepted
-	 * @param lineNumber the line number for the breakpoint
-	 * @param functionName the name of the function the breakpoint is set on, <code>null</code> is accepted
-	 * @param condition the condition for the breakpoint, <code>null</code> is accepted
-	 * @param threadId the id of the thread the breakpoint is for
-	 */
-	public Breakpoint(Long breakpointId, ScriptSource script, Integer lineNumber, String functionName, String condition, Long threadId) {
-		if (script == null) {
-			throw new IllegalArgumentException("The parent script cannot be null"); //$NON-NLS-1$
-		}
-		this.breakpointId = breakpointId;
-		this.script = script;
-		this.lineNumber = lineNumber;
-		this.functionName = functionName;
-		this.condition = condition;
-		this.threadId = threadId;
-	}
-
-	/**
-	 * @return the breakpoint as a JSON entry
-	 */
-	public Object toJSON() {
-		HashMap result = new HashMap();
-		result.put(JSONConstants.BREAKPOINT_ID, breakpointId);
-		result.put(JSONConstants.SCRIPT_ID, script.getId());
-		if (lineNumber != null) {
-			result.put(JSONConstants.LINE, lineNumber);
-		}
-		if (functionName != null) {
-			result.put(JSONConstants.FUNCTION, functionName);
-		}
-		if (condition != null) {
-			result.put(JSONConstants.CONDITION, condition);
-		}
-		if (threadId != null) {
-			result.put(JSONConstants.THREAD_ID, threadId);
-		}
-		return result;
-	}
-
-	/**
-	 * Deletes the breakpoint from the script it is associated with. Does
-	 * not clear any of the handle information so the deleted breakpoint can be 
-	 * returned as an event if required.
-	 */
-	public void delete() {
-		this.script.removeBreakpoint(this);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java
deleted file mode 100644
index e8e1570..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link ContextData}
- * 
- * @since 1.0
- */
-public class ContextData {
-	private static final int CONTEXT_RUNNING = 0;
-	private static final int CONTEXT_SUSPENDED = 1;
-
-	private static final int STEP_CONTINUE = 0;
-	private static final int STEP_IN = 1;
-	private static final int STEP_NEXT = 2;
-	private static final int STEP_OUT = 4;
-
-	private final Long threadId;
-	private final Long contextId;
-	private final RhinoDebuggerImpl debugger;
-
-	private final LinkedList frames = new LinkedList();
-
-	private int contextState = CONTEXT_RUNNING;
-	private int stepState = STEP_CONTINUE;
-	private StackFrame stepFrame;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param threadId
-	 * @param contextId
-	 * @param debugger
-	 */
-	public ContextData(Long threadId, Long contextId, RhinoDebuggerImpl debugger) {
-		this.threadId = threadId;
-		this.contextId = contextId;
-		this.debugger = debugger;
-	}
-
-	/**
-	 * Returns the unique id of this context data
-	 * 
-	 * @return the unique id
-	 */
-	public Long getId() {
-		return contextId;
-	}
-
-	/**
-	 * Returns the live list of {@link DebugFrame}s from this context
-	 * 
-	 * @return the live list of {@link DebugFrame}s
-	 */
-	public synchronized List getFrameIds() {
-		List result = new ArrayList();
-		for (Iterator iterator = frames.iterator(); iterator.hasNext();) {
-			result.add(((StackFrame) iterator.next()).getId());
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the {@link DebugFrame} with the given id or <code>null</code> if no such {@link DebugFrame} exists
-	 * 
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id or <code>null</code>
-	 */
-	public synchronized StackFrame getFrame(Long frameId) {
-		StackFrame frame = null;
-		for (Iterator iterator = frames.iterator(); iterator.hasNext();) {
-			frame = (StackFrame) iterator.next();
-			if (frame.getId().equals(frameId)) {
-				return frame;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds the given frame to the top of the frame stack and sends out a break event as needed
-	 * 
-	 * @param frame
-	 * @param script
-	 * @param lineNumber
-	 * @param functionName
-	 */
-	public synchronized void pushFrame(StackFrame frame, ScriptSource script, Integer lineNumber, String functionName) {
-		frames.addFirst(frame);
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, functionName);
-		boolean isStepBreak = stepBreak(STEP_IN);
-		if (isStepBreak || breakpoint != null) {
-			if (sendBreakEvent(script, frame.getLineNumber(), functionName, breakpoint, isStepBreak, false)) {
-				suspendState();
-			}
-		}
-	}
-
-	/**
-	 * Returns if the step operation should cause a break
-	 * 
-	 * @param step
-	 * @return true if the operation should break false otherwise
-	 */
-	private boolean stepBreak(int step) {
-		return ((0 != (step & stepState)) && (stepFrame == null || stepFrame == frames.getFirst()));
-	}
-
-	/**
-	 * Suspends the state via {@link #wait()}
-	 */
-	private void suspendState() {
-		contextState = CONTEXT_SUSPENDED;
-		while (contextState == CONTEXT_SUSPENDED) {
-			try {
-				wait();
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	/**
-	 * Removes the first {@link DebugFrame} from the current stack
-	 * 
-	 * @param byThrow
-	 * @param resultOrException
-	 */
-	public synchronized void popFrame(boolean byThrow, Object resultOrException) {
-		if(!frames.isEmpty()) {
-			StackFrame frame = (StackFrame) frames.removeFirst();
-			if (stepFrame == frame) {
-				stepFrame = null;
-				stepState = STEP_OUT;
-			}
-				
-			boolean isStepBreak = stepBreak(STEP_IN | STEP_OUT);
-			if (isStepBreak) {
-				frame = getTopFrame();
-				if (frame != null && sendBreakEvent(frame.getScript(), frame.getLineNumber(), null, null, isStepBreak, false)) {
-					suspendState();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Resume the state with the given step type
-	 * 
-	 * @param stepType
-	 */
-	public synchronized void resume(String stepType) {
-		try {
-			if (stepType == null) {
-				stepState = STEP_CONTINUE;
-				stepFrame = null;
-			} else if (stepType.equals(JSONConstants.STEP_IN)) {
-				stepState = STEP_IN;
-				stepFrame = null;
-			} else if (stepType.equals(JSONConstants.STEP_NEXT)) {
-				stepState = STEP_NEXT;
-				stepFrame = getTopFrame();
-			} else if (stepType.equals(JSONConstants.STEP_OUT)) {
-				if (frames.size() > 1) {
-					stepState = STEP_OUT;
-					stepFrame = (StackFrame) frames.get(1);
-				} else {
-					stepState = STEP_CONTINUE;
-					stepFrame = null;
-				}
-			} else if (stepType.equals(JSONConstants.STEP_ANY)) {
-				stepState = STEP_IN | STEP_OUT | STEP_NEXT;
-				stepFrame = null;
-			} else {
-				throw new IllegalStateException("bad stepType: " + stepType); //$NON-NLS-1$
-			}
-		}
-		finally {
-			contextState = CONTEXT_RUNNING;
-			notifyAll();
-		}
-	}
-
-	/**
-	 * Returns the top stack frame iff there are frames.
-	 * Delegate method to prevent {@link NoSuchElementException}s
-	 * 
-	 * @return the top frame or <code>null</code>
-	 */
-	private StackFrame getTopFrame() {
-		if(this.frames != null && !this.frames.isEmpty()) {
-			return (StackFrame) this.frames.getFirst();
-		}
-		return null;
-	}
-	
-	/**
-	 * Set the step state to the suspend equivalent
-	 */
-	public synchronized void suspend() {
-		stepState = STEP_IN | STEP_NEXT | STEP_OUT;
-		stepFrame = null;
-	}
-
-	/**
-	 * Handles a <code>debugger;</code> statement
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 */
-	public synchronized void debuggerStatement(ScriptSource script, Integer lineNumber) {
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, null);
-		boolean isStepBreak = stepBreak(STEP_IN | STEP_NEXT);
-		if (sendBreakEvent(script, lineNumber, null, breakpoint, isStepBreak, true)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Handles a line change
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 */
-	public synchronized void lineChange(ScriptSource script, Integer lineNumber) {
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, null);
-		boolean isStepBreak = stepBreak(STEP_IN | STEP_NEXT);
-		if (isStepBreak || breakpoint != null) {
-			if (sendBreakEvent(script, lineNumber, null, breakpoint, isStepBreak, false)) {
-				suspendState();
-			}
-		}
-	}
-
-	/**
-	 * Handles forwarding an exception event
-	 * 
-	 * @param ex
-	 */
-	public synchronized void exceptionThrown(Throwable ex) {
-		StackFrame frame = getTopFrame();
-		if (sendExceptionEvent(frame.getScript(), frame.getLineNumber(), ex)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Sends a JSON message for an exception that has occurred
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 * @param ex
-	 * @return true if the message was sent successfully, false otherwise
-	 */
-	private boolean sendExceptionEvent(ScriptSource script, Integer lineNumber, Throwable ex) {
-		EventPacket exceptionEvent = new EventPacket(JSONConstants.EXCEPTION);
-		Map body = exceptionEvent.getBody();
-		body.put(JSONConstants.CONTEXT_ID, contextId);
-		body.put(JSONConstants.THREAD_ID, threadId);
-		body.put(JSONConstants.SCRIPT_ID, script.getId());
-		body.put(JSONConstants.LINE, lineNumber);
-		body.put(JSONConstants.MESSAGE, ex.getMessage());
-		return debugger.sendEvent(exceptionEvent);
-	}
-
-	/**
-	 * Sends a JSON message for a break event
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 * @param functionName
-	 * @param breakpoint
-	 * @param isStepBreak
-	 * @param isDebuggerStatement
-	 * @return true if the message was sent successfully, false otherwise
-	 */
-	private boolean sendBreakEvent(ScriptSource script, Integer lineNumber, String functionName, Breakpoint breakpoint, boolean isStepBreak, boolean isDebuggerStatement) {
-		EventPacket breakEvent = new EventPacket(JSONConstants.BREAK);
-		Map body = breakEvent.getBody();
-		body.put(JSONConstants.THREAD_ID, threadId);
-		body.put(JSONConstants.CONTEXT_ID, contextId);
-		body.put(JSONConstants.SCRIPT_ID, script.getId());
-		if (functionName != null) {
-			body.put(JSONConstants.FUNCTION_NAME, functionName);
-		}
-		body.put(JSONConstants.LINE, lineNumber);
-		if (breakpoint != null) {
-			body.put(JSONConstants.BREAKPOINT, breakpoint.breakpointId);
-		}
-
-		if (isStepBreak) {
-			String stepType;
-			if (stepState == STEP_IN) {
-				stepType = JSONConstants.STEP_IN;
-			} else if (stepState == STEP_NEXT) {
-				stepType = JSONConstants.STEP_NEXT;
-			} else if (stepState == STEP_OUT) {
-				stepType = JSONConstants.STEP_OUT;
-			} else {
-				stepType = JSONConstants.SUSPEND;
-			}
-			body.put(JSONConstants.STEP, stepType);
-			stepState = 0;
-		}
-
-		body.put(JSONConstants.DEBUGGER_STATEMENT, Boolean.valueOf(isDebuggerStatement));
-		return debugger.sendEvent(breakEvent);
-	}
-
-	/**
-	 * Handles a script load event
-	 * 
-	 * @param script
-	 */
-	public synchronized void scriptLoaded(ScriptSource script) {
-		if (sendScriptEvent(script)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Send a JSON message for a script event
-	 * 
-	 * @param script
-	 * @return
-	 */
-	private boolean sendScriptEvent(ScriptSource script) {
-		EventPacket scriptEvent = new EventPacket(JSONConstants.SCRIPT);
-		Map body = scriptEvent.getBody();
-		body.put(JSONConstants.THREAD_ID, threadId);
-		body.put(JSONConstants.CONTEXT_ID, contextId);
-		body.put(JSONConstants.SCRIPT_ID, script.getId());
-		return debugger.sendEvent(scriptEvent);
-	}
-
-	/**
-	 * Returns the string representation of the state
-	 * 
-	 * @return the state text
-	 */
-	public synchronized String getState() {
-		return contextState == CONTEXT_RUNNING ? JSONConstants.RUNNING : JSONConstants.SUSPENDED;
-	}
-
-	/**
-	 * Returns the underlying thread id
-	 * 
-	 * @return the underlying thread id
-	 */
-	public Long getThreadId() {
-		return threadId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java
deleted file mode 100644
index 61fdd0b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoTransportService;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Delegate for {@link DebugSession} communication
- * 
- * @since 1.1
- */
-public class DebugSessionManager {
-
-	public class DebugSessionThread extends Thread {
-
-		private ListenerKey listenerKey;
-		private Connection connection;
-		private RequestHandler requestHandler;
-
-		public DebugSessionThread(String name, RhinoDebuggerImpl debugger) {
-			super(name);
-			requestHandler = new RequestHandler(debugger);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			try {
-				listenerKey = transportService.startListening(address);
-				while (!shutdown) {
-					try {
-						acceptConnection(10000);
-					} catch (IOException e) {
-						if (connection == null) {
-							continue;
-						}
-					}
-					while (!shutdown && connection.isOpen()) {
-						try {
-							RhinoRequest request = (RhinoRequest) debugSession.receive(JSONConstants.REQUEST, 1000);
-							if (DEBUG)
-								System.out.println(request);
-							RhinoResponse response = requestHandler.handleRequest(request);
-							if (DEBUG)
-								System.out.println(response);
-							debugSession.send(response);
-						} catch (TimeoutException e) {
-							// ignore
-						} catch (DisconnectedException e) {
-							break;
-						}
-					}
-					closeConnection();
-				}
-			} catch (IOException e) {
-				sendDeathEvent();
-			} finally {
-				try {
-					if (listenerKey != null)
-						transportService.stopListening(listenerKey);
-				} catch (IOException e) {
-					sendDeathEvent();
-				}
-			}
-		}
-
-		/**
-		 * Close the active connection
-		 * 
-		 * @throws IOException
-		 */
-		private void closeConnection() throws IOException {
-			if (connection != null) {
-				setDebugSession(null);
-				connection.close();
-				connection = null;
-			}
-		}
-
-		/**
-		 * Waits for a connection for the given timeout
-		 * 
-		 * @param timeout
-		 * @throws IOException
-		 */
-		private void acceptConnection(long timeout) throws IOException {
-			if (connection == null) {
-				connection = transportService.accept(listenerKey, timeout, timeout);
-				setDebugSession(new DebugSession(connection));
-			}
-		}
-
-	}
-
-	private static boolean DEBUG = false;
-	
-	private static final String ADDRESS = "address"; //$NON-NLS-1$
-	private static final String SOCKET = "socket"; //$NON-NLS-1$
-	private static final String TRANSPORT = "transport"; //$NON-NLS-1$
-
-	private final TransportService transportService;
-	private final String address;
-	private final boolean startSuspended;
-
-	private DebugSession debugSession;
-	private Thread debuggerThread;
-	private volatile boolean shutdown = false;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param transportService
-	 * @param address
-	 * @param startSuspended
-	 */
-	public DebugSessionManager(TransportService transportService, String address, boolean startSuspended, boolean debug) {
-		this.transportService = transportService;
-		this.address = address;
-		this.startSuspended = startSuspended;
-		DEBUG = debug;
-	}
-
-	/**
-	 * Creates a new session manager
-	 * 
-	 * @param configString
-	 * @return
-	 */
-	static DebugSessionManager create(String configString) {
-		Map config = parseConfigString(configString);
-		String transport = (String) config.get(TRANSPORT);
-		if (!SOCKET.equals(transport)) {
-			throw new IllegalArgumentException("Transport service must be 'socket': " + transport); //$NON-NLS-1$
-		}
-		TransportService parsedTransportService = new RhinoTransportService();
-		String parsedAddress = (String) config.get(ADDRESS);
-		String suspend = (String) config.get(JSONConstants.SUSPEND);
-		boolean parsedStartSuspended = false;
-		if (suspend != null) {
-			parsedStartSuspended = (Boolean.valueOf(suspend).booleanValue() || suspend.trim().equalsIgnoreCase("y")); //$NON-NLS-1$
-		}
-		String debug = (String) config.get("trace"); //$NON-NLS-1$
-		boolean debugging = false;
-		if(debug != null) {
-			debugging = (Boolean.valueOf(debug).booleanValue() || debug.trim().equalsIgnoreCase("y")); //$NON-NLS-1$
-		}
-		return new DebugSessionManager(parsedTransportService, parsedAddress, parsedStartSuspended, debugging);
-	}
-
-	/**
-	 * Parses the command line configuration string
-	 * 
-	 * @param configString
-	 * @return the map of command line arguments
-	 */
-	private static Map parseConfigString(String configString) {
-		Map config = new HashMap();
-		StringTokenizer tokenizer = new StringTokenizer(configString, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken();
-			int equalsIndex = token.indexOf('=');
-			if (equalsIndex == -1)
-				config.put(token, null);
-			else
-				config.put(token.substring(0, equalsIndex), token.substring(equalsIndex + 1));
-		}
-		return config;
-	}
-
-	/**
-	 * @return true if the <code>suspend=true</code> command line argument is
-	 *         set
-	 */
-	public boolean isStartSuspended() {
-		return startSuspended;
-	}
-
-	/**
-	 * Returns if a {@link DebugSession} has successfully connected to this
-	 * debugger.
-	 * 
-	 * @return <code>true</code> if the debugger has a connected
-	 *         {@link DebugSession} <code>false</code> otherwise
-	 */
-	public synchronized boolean isConnected() {
-		return debugSession != null;
-	}
-
-	/**
-	 * Starts the debugger
-	 */
-	public synchronized void start(RhinoDebuggerImpl debugger) {
-		debuggerThread = new DebugSessionThread("RhinoDebugger - RhinoRequest Handler", debugger); //$NON-NLS-1$
-		debuggerThread.start();
-		if (startSuspended) {
-			try {
-				wait(300000);
-			} catch (InterruptedException e) {
-				/* e.printStackTrace(); */
-			}
-			// TODO: We might want to check if debugSession is null and if so
-			// call "stop" and throw an exception
-		}
-	}
-
-	/**
-	 * Stops the debugger
-	 */
-	public synchronized void stop() {
-		shutdown = true;
-		try {
-			debuggerThread.interrupt();
-			while(debuggerThread.isAlive()) {
-				wait(1000);
-			}
-			debuggerThread.join();
-		} catch (InterruptedException e) {
-			/* e.printStackTrace(); */
-		}
-	}
-
-	private synchronized void setDebugSession(DebugSession session) {
-		if (debugSession != session) {
-			if (debugSession != null) {
-				debugSession.dispose();
-			}
-			debugSession = session;
-			notify();
-		}
-	}
-
-	/**
-	 * Sends the given {@link EventPacket} using the underlying
-	 * {@link DebugRuntime} and returns if it was sent successfully
-	 * 
-	 * @param event
-	 * @return true if the event was sent successfully, false otherwise
-	 */
-	public synchronized boolean sendEvent(EventPacket event) {
-		try {
-			if (debugSession != null) {
-				if (DEBUG) {
-					System.out.println(event);
-				}
-				debugSession.send(event);
-				return true;
-			}
-		} catch (DisconnectedException e) {
-			e.printStackTrace();
-		}
-		return false;
-	}
-
-	/**
-	 * Sends out an event that the debugger has died in an unexpected way.
-	 * Debugger death can result from:
-	 * <ul>
-	 * <li>an {@link IOException} while the debugger is running</li>
-	 * <li>an {@link InterruptedException} processing I/O</li>
-	 * </ul>
-	 */
-	private void sendDeathEvent() {
-		EventPacket event = new EventPacket(JSONConstants.VMDEATH);
-		sendEvent(event);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java
deleted file mode 100644
index 2f207199..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-
-/**
- * Handle for a {@link DebuggableScript} function
- * 
- * @since 1.0
- */
-public class FunctionSource {
-	
-	final ScriptSource parent;
-	final String name;
-	String source;
-	final int linenumber;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param script the parent - cannot be <code>null</code>
-	 * @param name the name of the function - can be <code>null</code>
-	 * @param source the underlying source for the function - can be <code>null</code>
-	 */
-	public FunctionSource(ScriptSource script, String name, String source, int linenumber) {
-		if(script == null) {
-			throw new IllegalArgumentException("The parent script cannot be null"); //$NON-NLS-1$
-		}
-		this.parent = script;
-		this.name = name;
-		this.source = source;
-		this.linenumber = linenumber;
-	}
-
-	/**
-	 * @return the parent {@link ScriptSource} this function appears in
-	 */
-	public ScriptSource parent() {
-		return this.parent;
-	}
-	
-	/**
-	 * @return the name of the function
-	 */
-	public String name() {
-		return this.name; 
-	}
-	
-	/**
-	 * @return the source for the function
-	 */
-	public String source() {
-		return this.source;
-	}
-	
-	/**
-	 * Sets the underlying source to the given string
-	 * 
-	 * @param source the new source
-	 */
-	public void setSource(String source) {
-		this.source = source;
-	}
-	
-	/**
-	 * @return the line number this function appears on
-	 */
-	public int linenumber() {
-		return this.linenumber;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("FunctionSource: [name - ").append(this.name).append("] [linenumber - ").append(linenumber).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		buffer.append("\tparent: ").append(parent.getLocation()); //$NON-NLS-1$
-		buffer.append("\tsource: ").append(this.source).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java
deleted file mode 100644
index 1e81c5d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-/**
- * Class to hold information about a given line such as:
- * <ul>
- * <li>FunctionSource at the line</li>
- * <li>Breakpoint set on the line</li>
- * </ul>
- * @since 1.0
- */
-public class LineData {
-
-	Breakpoint breakpoint = null;
-	FunctionSource function = null;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java
deleted file mode 100644
index eb6ed50..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-
-/**
- * Rhino request handler used to craft response bodies for given JSON requests
- * 
- * @since 1.0
- */
-public class RequestHandler {
-
-	public static final String VERSION_1_6 = "1.6"; //$NON-NLS-1$
-	private RhinoDebuggerImpl debugger;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param debugger
-	 */
-	public RequestHandler(RhinoDebuggerImpl debugger) {
-		this.debugger = debugger;
-	}
-
-	/**
-	 * Handles a general request - delegating to the correct command type
-	 * 
-	 * @param request
-	 * @return
-	 */
-	public RhinoResponse handleRequest(RhinoRequest request) {
-		String command = request.getCommand();
-		RhinoResponse response = new RhinoResponse(request.getSequence(), command);
-		try {
-			if (command.equals(JSONConstants.VERSION)) {
-				handleVersionRequest(request, response);
-			} else if (command.equals(JSONConstants.SUSPEND)) {
-				handleSuspendRequest(request, response);
-			} else if (command.equals(JSONConstants.CONTINUE)) {
-				handleContinueRequest(request, response);
-			} else if (command.equals(JSONConstants.DISPOSE)) {
-				handleDisposeRequest(request, response);
-			} else if (command.equals(JSONConstants.THREADS)) {
-				handleThreadsRequest(request, response);
-			} else if (command.equals(JSONConstants.THREAD)) {
-				handleThreadRequest(request, response);
-			} else if (command.equals(JSONConstants.FRAMES)) {
-				handleFramesRequest(request, response);
-			} else if (command.equals(JSONConstants.FRAME)) {
-				handleFrameRequest(request, response);
-			} else if (command.equals(JSONConstants.SCRIPTS)) {
-				handleScriptsRequest(request, response);
-			} else if (command.equals(JSONConstants.SCRIPT)) {
-				handleScriptRequest(request, response);
-			} else if (command.equals(JSONConstants.EVALUATE)) {
-				handleEvaluateRequest(request, response);
-			} else if (command.equals(JSONConstants.LOOKUP)) {
-				handleLookupRequest(request, response);
-			} else if (command.equals(JSONConstants.BREAKPOINTS)) {
-				handleBreakpointsRequest(request, response);
-			} else if (command.equals(JSONConstants.BREAKPOINT)) {
-				handleBreakpointRequest(request, response);
-			} else if (command.equals(JSONConstants.SETBREAKPOINT)) {
-				handleSetBreakpointRequest(request, response);
-			} else if (command.equals(JSONConstants.CLEARBREAKPOINT)) {
-				handleClearBreakpointRequest(request, response);
-			} else {
-				response.setSuccess(false);
-				response.setMessage("command not supported"); //$NON-NLS-1$
-			}
-		} catch (Throwable t) {
-			response.setSuccess(false);
-			response.setMessage(t.getClass().getName() + " - " + t.getMessage()); //$NON-NLS-1$
-			t.printStackTrace();
-		}
-		return response;
-	}
-
-	/**
-	 * Handles a clear breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleClearBreakpointRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long breakpointId = numberToLong((Number) arguments.get(JSONConstants.BREAKPOINT_ID));
-		if (breakpointId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.BREAKPOINT_ID));
-			return;
-		}
-		Breakpoint breakpoint = debugger.clearBreakpoint(breakpointId);
-		if (breakpoint == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-	}
-
-	/**
-	 * Handles a set breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleSetBreakpointRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long scriptId = numberToLong((Number) arguments.get(JSONConstants.SCRIPT_ID));
-		Integer line = numberToInteger((Number) arguments.get(JSONConstants.LINE));
-		String function = (String) arguments.get(JSONConstants.FUNCTION);
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		String condition = (String) arguments.get(JSONConstants.CONDITION);
-		Breakpoint breakpoint = debugger.setBreakpoint(scriptId, line, function, condition, threadId);
-		if(breakpoint != null) {
-			response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-		}
-	}
-
-	/**
-	 * Handles a breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleBreakpointRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long breakpointId = numberToLong((Number) arguments.get(JSONConstants.BREAKPOINT_ID));
-		if (breakpointId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.BREAKPOINT_ID));
-			return;
-		}
-		Breakpoint breakpoint = debugger.getBreakpoint(breakpointId);
-		if (breakpoint == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-	}
-
-	/**
-	 * Handles a breakpoints request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleBreakpointsRequest(RhinoRequest request, RhinoResponse response) {
-		Collection breakpoints = debugger.getBreakpoints();
-		response.getBody().put(JSONConstants.BREAKPOINTS, breakpoints);
-	}
-
-	/**
-	 * Handles an evaluate request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleEvaluateRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		String evaluate = (String) arguments.get(JSONConstants.EXPRESSION);
-		if (evaluate == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.EXPRESSION));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		Object result = frame.evaluate(evaluate);
-		response.getBody().put(JSONConstants.EVALUATE, result);
-	}
-
-	/**
-	 * Handles a lookup request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleLookupRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		Long handle = numberToLong((Number) arguments.get(JSONConstants.REF));
-		if (handle == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.REF));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		Object result = frame.lookup(handle);
-		response.getBody().put(JSONConstants.LOOKUP, result);
-	}
-
-	/**
-	 * Handles a script request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleScriptRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long scriptId = numberToLong((Number) arguments.get(JSONConstants.SCRIPT_ID));
-		if (scriptId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.SCRIPT_ID));
-			return;
-		}
-		ScriptSource script = debugger.getScript(scriptId);
-		if (script == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.SCRIPT, script.toJSON());
-	}
-
-	/**
-	 * Handles a scripts request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleScriptsRequest(RhinoRequest request, RhinoResponse response) {
-		List scriptIds = debugger.getScriptIds();
-		response.getBody().put(JSONConstants.SCRIPTS, scriptIds);
-	}
-
-	/**
-	 * Handles a frame request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleFrameRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.FRAME, frame.toJSON());
-	}
-
-	/**
-	 * Handles a frames request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleFramesRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		List frameIds = debugger.getFrameIds(threadId);
-		response.getBody().put(JSONConstants.FRAMES, frameIds);
-	}
-
-	/**
-	 * Handles a thread request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleThreadRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		ThreadData threadData = debugger.getThreadData(threadId);
-		if (threadData == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.THREAD, threadData.toJSON());
-	}
-
-	/**
-	 * Reports a missing argument
-	 * 
-	 * @param key
-	 * @return
-	 */
-	private String missingArgument(String key) {
-		// TODO NLS this
-		return "Missing Argument: "+key; //$NON-NLS-1$
-	}
-
-	/**
-	 * Handles a threads request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleThreadsRequest(RhinoRequest request, RhinoResponse response) {
-		List threadIds = debugger.getThreadIds();
-		response.getBody().put(JSONConstants.THREADS, threadIds);
-	}
-
-	/**
-	 * Handles a dispose request by disconnecting the underlying {@link RhinoDebuggerImpl}
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleDisposeRequest(RhinoRequest request, RhinoResponse response) {
-		debugger.disconnect();
-	}
-
-	/**
-	 * Handles a continue request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleContinueRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			debugger.resumeAll();
-			return;
-		}
-		String stepType = (String) arguments.get(JSONConstants.STEP);
-		debugger.resume(threadId, stepType);
-	}
-
-	/**
-	 * Handles a suspend request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleSuspendRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			debugger.suspendAll();
-			return;
-		}
-		debugger.suspend(threadId);
-	}
-
-	/**
-	 * Wrappers the given {@link Number} as a {@link Long}
-	 * 
-	 * @param number
-	 * @return a new {@link Long}
-	 */
-	private static Long numberToLong(Number number) {
-		if (number == null)
-			return null;
-		return new Long(number.longValue());
-	}
-
-	/**
-	 * Wrappers the given {@link Number} as an {@link Integer}
-	 * 
-	 * @param number
-	 * @return a new {@link Integer}
-	 */
-	private Integer numberToInteger(Number number) {
-		if (number == null) {
-			return null;
-		}
-		return new Integer(number.intValue());
-	}
-
-	/**
-	 * Appends version infos to the given response body
-	 * 
-	 * @param request
-	 * @param response
-	 * 
-	 * @see JSONConstants#ECMASCRIPT_VERSION
-	 * @see JSONConstants#JAVASCRIPT_VERSION
-	 * @see JSONConstants#VM_NAME
-	 * @see JSONConstants#VM_VENDOR
-	 * @see JSONConstants#VM_VERSION
-	 */
-	private void handleVersionRequest(RhinoRequest request, RhinoResponse response) {
-		Map body = response.getBody();
-		body.put(JSONConstants.JAVASCRIPT_VERSION, VERSION_1_6);
-		body.put(JSONConstants.ECMASCRIPT_VERSION, "3"); //$NON-NLS-1$
-		body.put(JSONConstants.VM_NAME, "Rhino"); //$NON-NLS-1$
-		body.put(JSONConstants.VM_VERSION, VERSION_1_6);
-		body.put(JSONConstants.VM_VENDOR, "Mozilla"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java
deleted file mode 100644
index d0afacd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java
+++ /dev/null
@@ -1,539 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2011 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONUtil;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextFactory;
-import org.mozilla.javascript.debug.DebugFrame;
-import org.mozilla.javascript.debug.DebuggableScript;
-import org.mozilla.javascript.debug.Debugger;
-
-/**
- * Rhino implementation of {@link Debugger}
- * <br><br>
- * Events fired:
- * <ul>
- * <li><b>Thread enter event</b> - when a new context is created see: {@link #contextCreated(Context)}</li>
- * <li><b>Thread exit event</b> - when a context is exited see: {@link #contextReleased(Context)}</li>
- * <li><b>VM death event</b> - if the debugger dies: this event can only be received if the underlying communication channel has not been interrupted</li>
- * </ul>
- * @since 1.0
- */
-public class RhinoDebuggerImpl implements Debugger, ContextFactory.Listener {
-
-	public static final DebuggableScript[] NO_SCRIPTS = new DebuggableScript[0];
-	private static final String RHINO_SCHEME = "rhino"; //$NON-NLS-1$
-	
-	private final Map threadToThreadId = new HashMap();
-	private final Map threadIdToData = new HashMap();
-	private final Map breakpoints = new HashMap();
-
-	private long currentThreadId = 0L;
-	private long currentBreakpointId = 0L;
-	private long currentScriptId = 0L;
-	private ArrayList disabledThreads = new ArrayList();
-
-	/**
-	 * Mapping of the URI string to the {@link ScriptSource}
-	 */
-	private HashMap/*<String, ScriptSource>*/ uriToScript = new HashMap();
-	/**
-	 * Mapping of the id to the {@link ScriptSource}
-	 */
-	private HashMap/*<Long, ScriptSource>*/ idToScript = new HashMap();
-
-	private final DebugSessionManager sessionManager;
-	
-	/**
-	 * This constructor will only accept a <code>transport</code> argument
-	 * of <code>socket</code>. I.e. <code>transport=socket</code>.<br><br>
-	 * 
-	 * To use a differing {@link TransportService} pleas use the other constructor:
-	 * {@link #RhinoDebugger(TransportService, String, boolean)}
-	 * 
-	 * @param configString the configuration string, for example: <code>transport=socket,suspend=y,address=9000</code>
-	 */
-	public RhinoDebuggerImpl(String configString) {
-		sessionManager = DebugSessionManager.create(configString);
-	}
-	
-	/**
-	 * This constructor allows you to specify a custom {@link TransportService} to use other than <code>socket</code>.
-	 * 
-	 * @param transportService the {@link TransportService} to use for debugger communication
-	 * @param address the address to communicate on
-	 * @param startSuspended if the debugger should wait while accepting a connection. The wait time for stating suspended is not indefinite,
-	 * @param trace if the debugger should be in tracing mode, reporting debug statements to the console 
-	 * and is equal to 300000ms.
-	 */
-	public RhinoDebuggerImpl(TransportService transportService, String address, boolean startSuspended, boolean trace) {
-		sessionManager = new DebugSessionManager( transportService,  address,  startSuspended, trace);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.Debugger#getFrame(org.mozilla.javascript.Context, org.mozilla.javascript.debug.DebuggableScript)
-	 */
-	public synchronized DebugFrame getFrame(Context context, DebuggableScript debuggableScript) {
-		ScriptSource script = getScript(debuggableScript);
-		if(script != null && !script.isStdIn()) {
-			ContextData contextData = (ContextData) context.getDebuggerContextData();
-			ThreadData thread = (ThreadData) threadIdToData.get(contextData.getThreadId());
-			FunctionSource function = script.getFunction(debuggableScript);
-			return thread.getFrame(context, function, script);
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the root {@link ScriptSource} context
-	 * 
-	 * @param script
-	 * @return the root {@link ScriptSource} context
-	 */
-	private ScriptSource getScript(DebuggableScript script) {
-		synchronized (uriToScript) {
-			DebuggableScript root = script;
-			while (!root.isTopLevel()) {
-				root = root.getParent();
-			}
-			URI uri = getSourceUri(root, parseSourceProperties(root.getSourceName()));
-			if(uri != null) {
-				return (ScriptSource) uriToScript.get(uri);
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.Debugger#handleCompilationDone(org.mozilla.javascript.Context, org.mozilla.javascript.debug.DebuggableScript, java.lang.String)
-	 */
-	public void handleCompilationDone(Context context, DebuggableScript script, String source) {
-		if (!script.isTopLevel()) {
-			return;
-		}
-		Map properties = parseSourceProperties(script.getSourceName());
-		URI uri = getSourceUri(script, properties);
-		if(uri == null) {
-			//if the source cannot be located don't load or notify
-			return;
-		}
-		final ScriptSource newscript = new ScriptSource(script, source, uri, script.isGeneratedScript(), properties);
-		synchronized (uriToScript) {
-			ScriptSource old = (ScriptSource) uriToScript.remove(uri);
-			Long id = null;
-			if(old != null) {
-				//recycle the id for a re-loaded script
-				//https://bugs.eclipse.org/bugs/show_bug.cgi?id=306832
-				id = old.getId();
-				idToScript.remove(id);
-				newscript.setId(id);
-				//clean up the cache of breakpoints
-				old.clearBreakpoints(this);
-			}
-			else {
-				//a totally new script is loaded
-				id = scriptId();
-				newscript.setId(id);
-			}
-			uriToScript.put(uri, newscript);
-			idToScript.put(id, newscript);
-		}
-		ContextData contextData = (ContextData) context.getDebuggerContextData();
-		contextData.scriptLoaded(newscript);
-	}
-
-	/**
-	 * Composes a {@link URI} representing the path to the source of the given script
-	 * 
-	 * @param script the script to create a {@link URI} for
-	 * @param properties any special properties @see {@link #parseSourceProperties(String)}
-	 * @return the {@link URI} for the source or <code>null</code>
-	 */
-	private URI getSourceUri(DebuggableScript script, Map properties) {
-			String sourceName = script.getSourceName();
-			if(properties != null) {
-				String jsonName = (String) properties.get(JSONConstants.NAME);
-				if (jsonName != null)
-					sourceName = jsonName;
-			}
-			
-			// handle null sourceName
-			if (sourceName == null)
-				return null;
-			
-			// handle input from the Rhino Shell
-			if (sourceName.equals("<stdin>")) { //$NON-NLS-1$
-				sourceName = "stdin"; //$NON-NLS-1$
-			} 
-			if(sourceName.equals("<command>")) { //$NON-NLS-1$
-				sourceName = "command"; //$NON-NLS-1$
-			}
-			else {	
-				// try to parse it as a file
-				File sourceFile = new File(sourceName);
-				if (sourceFile.exists())
-					return sourceFile.toURI();
-				
-				//try to just create a URI from the name
-				try {
-					return new URI(sourceName);
-				} catch(URISyntaxException e) {
-					//do nothing and fall through
-				}
-			}
-			
-			//fall back to creating a rhino specific URI from the script source name as a path
-			try {
-				if (! (sourceName.charAt(0) == '/'))
-					sourceName = "/" + sourceName; //$NON-NLS-1$
-				return new URI(RHINO_SCHEME, null, sourceName, null);
-			} catch (URISyntaxException e) {
-				return null;
-			}
-	}
-	
-	/**
-	 * Returns any special properties specified in the source name or <code>null</code>
-	 * 
-	 * @param sourceName
-	 * @return any special properties specified in the source name or <code>null</code>
-	 */
-	Map parseSourceProperties(String sourceName) {
-		if (sourceName != null && sourceName.charAt(0) == '{') {
-			try {
-				Object json = JSONUtil.read(sourceName);
-				if (json instanceof Map) {
-					return (Map) json;
-				}
-			} catch (RuntimeException e) {
-				// ignore
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the next script id to use
-	 * 
-	 * @return the next id
-	 */
-	synchronized Long scriptId() {
-		return new Long(currentScriptId++);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextCreated(org.mozilla.javascript.Context)
-	 */
-	public synchronized void contextCreated(Context context) {
-		Thread thread = Thread.currentThread();
-		if (disabledThreads.contains(thread)) {
-			return;
-		}
-		Long threadId = (Long) threadToThreadId.get(thread);
-		if (threadId == null) {
-			threadId = new Long(currentThreadId++);
-			threadToThreadId.put(thread, threadId);
-		}
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData == null) {
-			threadData = new ThreadData(threadId, this);
-			threadIdToData.put(threadId, threadData);
-			sendThreadEvent(JSONConstants.ENTER, threadId);
-		}
-		threadData.contextCreated(context);
-	}
-
-	/**
-	 * Sends a thread event for the given type
-	 * 
-	 * @param type the type of event to send
-	 * @param threadId the id of the thread the even is for
-	 * 
-	 * @see JSONConstants#ENTER
-	 * @see JSONConstants#EXIT
-	 */
-	private void sendThreadEvent(String type, Long threadId) {
-		EventPacket threadEvent = new EventPacket(JSONConstants.THREAD);
-		Map body = threadEvent.getBody();
-		body.put(JSONConstants.TYPE, type);
-		body.put(JSONConstants.THREAD_ID, threadId);
-		sendEvent(threadEvent);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextReleased(org.mozilla.javascript.Context)
-	 */
-	public synchronized void contextReleased(Context context) {
-		Thread thread = Thread.currentThread();
-		if (disabledThreads.contains(thread)) {
-			return;
-		}
-		Long threadId = (Long) threadToThreadId.get(thread);
-		if (threadId == null) {
-			return;
-		}
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		threadData.contextReleased(context);
-		if (!threadData.hasContext()) {
-			threadToThreadId.remove(thread);
-			threadIdToData.remove(threadId);
-			sendThreadEvent(JSONConstants.EXIT, threadId);
-		}
-	}
-
-	/**
-	 * Resumes a thread with the given id for the given step type. Has no effect if no such thread exists
-	 * 
-	 * @param threadId
-	 * @param stepType
-	 */
-	public synchronized void resume(Long threadId, String stepType) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			threadData.resume(stepType);
-		}
-	}
-
-	/**
-	 * Resumes all threads currently in the debugger
-	 */
-	public synchronized void resumeAll() {
-		for (Iterator it = threadIdToData.keySet().iterator(); it.hasNext();) {
-			Long threadId = (Long) it.next();
-			resume(threadId, null);
-		}
-	}
-
-	/**
-	 * Suspend the thread with the given id. Has no effect if no such thread exists
-	 * 
-	 * @param threadId
-	 */
-	public synchronized void suspend(Long threadId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			threadData.suspend();
-		}
-	}
-
-	/**
-	 * Suspend all threads currently in the debugger
-	 */
-	public synchronized void suspendAll() {
-		for (Iterator it = threadIdToData.keySet().iterator(); it.hasNext();) {
-			Long threadId = (Long) it.next();
-			suspend(threadId);
-		}
-	}
-
-	/**
-	 * Disconnects the debugger
-	 */
-	public void disconnect() {
-	}
-
-	/**
-	 * Returns all of the stack frame ids for the thread with the given id. Returns an empty list if no such thread exists, never <code>null</code>
-	 * 
-	 * @param threadId
-	 * @return the complete list of stack frame ids from the thread with the given id
-	 */
-	public synchronized List getFrameIds(Long threadId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return threadData.getFrameIds();
-	}
-
-	/**
-	 * Returns a {@link DebugFrame} with the given id from the thread with the given thread id. Returns <code>null</code> if the no such thread exists with the given id and / or no such {@link DebugFrame} exists with the given id
-	 * 
-	 * @param threadId
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id from the thread with the given id
-	 */
-	public synchronized StackFrame getFrame(Long threadId, Long frameId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			return threadData.getFrame(frameId);
-		}
-		return null;
-	}
-
-	/**
-	 * @return the ids of all of the scripts currently known to the debugger
-	 */
-	public synchronized List getScriptIds() {
-		return new ArrayList(idToScript.keySet());
-	}
-
-	/**
-	 * Returns the script with the given id or <code>null</code> if no such script exists with the given id
-	 * 
-	 * @param scriptId
-	 * @return the script with the given id or <code>null</code>
-	 */
-	public synchronized ScriptSource getScript(Long scriptId) {
-		return (ScriptSource) idToScript.get(scriptId);
-	}
-
-	/**
-	 * @return the complete collection of breakpoints currently known to the debugger
-	 */
-	public synchronized Collection getBreakpoints() {
-		return breakpoints.keySet();
-	}
-
-	/**
-	 * Creates a breakpoint in the script with the given id and the given breakpoint attributes. 
-	 * Returns the new breakpoint or <code>null</code> if:
-	 * <ul>
-	 * <li>no such script exists with the given id</li>
-	 * <li>the given line number is not a valid line number</li>
-	 * </ul>
-	 * <p>
-	 * If a breakpoint already exists at the given location it is removed and the new breakpoint is set.
-	 * </p>
-	 * @param scriptId
-	 * @param lineNumber
-	 * @param functionName
-	 * @param condition
-	 * @param threadId
-	 * @return the new breakpoint or <code>null</code> if no script exists with the given id
-	 */
-	public synchronized Breakpoint setBreakpoint(Long scriptId, Integer lineNumber, String functionName, String condition, Long threadId) {
-		ScriptSource script = (ScriptSource) idToScript.get(scriptId);
-		if (script == null || !script.isValid(lineNumber, functionName)) {
-			return null;
-		}
-
-		
-		Breakpoint newbreakpoint = new Breakpoint(nextBreakpointId(), script, lineNumber, functionName, condition, threadId);
-		Breakpoint oldbp = script.getBreakpoint(lineNumber, functionName);
-		if(oldbp != null) {
-			breakpoints.remove(oldbp.breakpointId);
-		}
-		breakpoints.put(newbreakpoint.breakpointId, newbreakpoint);
-		script.addBreakpoint(newbreakpoint);
-		return newbreakpoint;
-	}
-
-	/**
-	 * @return the next unique breakpoint id to use
-	 */
-	private synchronized Long nextBreakpointId() {
-		return new Long(currentBreakpointId++);
-	}
-
-	/**
-	 * Clears the breakpoint out of the cache with the given id and returns it. Returns <code>null</code> if no breakpoint exists with the given id.
-	 * 
-	 * @param breakpointId
-	 * @return the removed breakpoint or <code>null</code>
-	 */
-	public synchronized Breakpoint clearBreakpoint(Long breakpointId) {
-		Breakpoint breakpoint = (Breakpoint) breakpoints.remove(breakpointId);
-		if (breakpoint != null) {
-			breakpoint.delete();
-		}
-		return breakpoint;
-	}
-
-	/**
-	 * Sends the given {@link EventPacket} using the underlying {@link DebugRuntime} and returns if it was sent successfully
-	 * 
-	 * @param event
-	 * @return true if the event was sent successfully, false otherwise
-	 */
-	public boolean sendEvent(EventPacket event) {
-		return sessionManager.sendEvent(event);
-	}
-
-	/**
-	 * Gets a breakpoint with the given id, returns <code>null</code> if no such breakpoint exists with the given id
-	 * 
-	 * @param breakpointId
-	 * @return the breakpoint with the given id or <code>null</code>
-	 */
-	public Breakpoint getBreakpoint(Long breakpointId) {
-		return (Breakpoint) breakpoints.get(breakpointId);
-	}
-
-	/**
-	 * Gets the thread for the thread with the given id, returns <code>null</code> if no such thread exists with the given id
-	 * 
-	 * @param threadId
-	 * @return the thread data for the thread with the given id or <code>null</code>
-	 */
-	public synchronized ThreadData getThreadData(Long threadId) {
-		return (ThreadData) threadIdToData.get(threadId);
-	}
-
-	/**
-	 * @return the complete list of thread ids known to the debugger
-	 */
-	public synchronized List getThreadIds() {
-		return new ArrayList(threadIdToData.keySet());
-	}
-
-	/**
-	 * Caches the current thread as disabled
-	 */
-	public synchronized void disableThread() {
-		disabledThreads.add(Thread.currentThread());
-	}
-
-	/**
-	 * Removes the current thread as being disabled
-	 */
-	public synchronized void enableThread() {
-		disabledThreads.remove(Thread.currentThread());
-	}
-
-	public void start() {
-		sessionManager.start(this);
-	}
-
-	public void stop() {
-		sessionManager.stop();
-	}
-	
-	/**
-	 * Returns if a {@link DebugSession} has successfully connected to this debugger.
-	 * 
-	 * @return <code>true</code> if the debugger has a connected {@link DebugSession} <code>false</code> otherwise
-	 */
-	public boolean isConnected() {
-		return sessionManager.isConnected();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java
deleted file mode 100644
index de63cda..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2011 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.debug.DebuggableScript;
-import org.mozilla.javascript.debug.Debugger;
-
-/**
- * Rhino script implementation
- * 
- * @since 1.0
- */
-public class ScriptSource {
-
-	/**
-	 * No line information
-	 */
-	static final LineData[] NO_LINES = new LineData[0];
-	
-	/**
-	 * The id of the script
-	 */
-	private Long scriptId;
-	/**
-	 * Any special source properties to consider
-	 */
-	private final Map properties;
-	/**
-	 * The backing source String that was compiled to give us this proxy
-	 */
-	private final String source;
-	/**
-	 * If this {@link ScriptSource} was generated
-	 */
-	private final boolean generated;
-	/**
-	 * The ordered list of function names
-	 */
-	private ArrayList functionNames = null;
-
-	private Integer firstLine = null;
-	
-	/**
-	 * The location of the script
-	 */
-	private URI uri = null;
-	/**
-	 * The array of cached {@link FunctionSource}s
-	 */
-	private FunctionSource[] functionSources = null;
-	/**
-	 * Sparse array of line information. This array only has entries present for 
-	 * lines that are returned 
-	 */
-	private LineData[] lines = null;
-	/**
-	 * Mapping of the {@link DebuggableScript} backing the FunctionSource to the FunctionSource handle
-	 */
-	private HashMap/*<DebuggableScript, FunctionSource>*/ scriptToFunction = new HashMap();
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param scriptId
-	 * @param debuggableScript
-	 * @param source
-	 */
-	public ScriptSource(DebuggableScript script, String source, URI uri, boolean generated, Map properties) {
-		this.uri = uri;
-		this.source = source;
-		this.properties = properties;
-		this.generated = generated;
-
-		if(isStdIn()) {
-			//do not compute line data
-			return;
-		}
-		int[] rootlines = script.getLineNumbers();		
-		DebuggableScript[] functions = collectFunctions(script);
-		int flength = functions.length;
-		int max = 0;
-		int min = Integer.MAX_VALUE;
-		HashSet lineNumbers = new HashSet(flength+rootlines.length+1);
-		//dump in the line #'s from the root script
-		for (int i = 0; i < rootlines.length; i++) {
-			int line = rootlines[i];
-			if(line > max) {
-				max = line;
-			}
-			if(line < min) {
-				min = line;
-			}
-			lineNumbers.add(new Integer(line));
-		}
-		//dump in the line numbers from the expanded set of functions
-		if(flength > 0) {
-			functionSources = new FunctionSource[flength];
-			functionNames = new ArrayList(flength);
-			
-			int start = 0, end = 0;;
-			for (int i = 0; i < functions.length; i++) {
-				int[] lines = functions[i].getLineNumbers();
-				if(lines != null && lines.length > 0) {
-					start = lines[0] + 1;
-					for (int j = 0; j < lines.length; j++) {
-						int currentLine = lines[j];
-						if(currentLine > max) {
-							max = currentLine;
-						}
-						if(currentLine < min) {
-							min = currentLine;
-						}
-						if (currentLine < start) {
-							start = currentLine;
-						}
-						else if(currentLine > end) {
-							end = currentLine;
-						}
-						lineNumbers.add(new Integer(currentLine));
-					}
-				}
-				String name = functions[i].getFunctionName();
-				name = (name == null ? Constants.EMPTY_STRING : name);
-				functionSources[i] = new FunctionSource(this, name, computeFunctionSource(0, 0, source), start);
-				functionNames.add(name);
-				scriptToFunction.put(functions[i], functionSources[i]);
-				start = 0;
-			}
-		}
-		//create the sparse array and populate the valid line numbers
-		if(max == 0) {
-			this.lines = NO_LINES;
-		}
-		else {
-			this.lines = new LineData[max+1];
-			for (Iterator iter = lineNumbers.iterator(); iter.hasNext();) {
-				Integer value = (Integer) iter.next();
-				this.lines[value.intValue()] = new LineData();
-				iter.remove();
-			}
-			lineNumbers = null;
-		}
-		this.firstLine = new Integer(min);
-	}
-
-	/**
-	 * Returns the first executable line in the script
-	 * 
-	 * @return the first executable line in the script
-	 */
-	public Integer firstLine() {
-		return this.firstLine;
-	}
-	
-	/**
-	 * @return if this script represents the stdin script
-	 */
-	public boolean isStdIn() {
-		return this.uri.toString().endsWith("stdin"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Clears the breakpoints from this script out of the given {@link Debugger}
-	 */
-	void clearBreakpoints(RhinoDebuggerImpl debugger) {
-		if(this.lines != null) {
-			for (int i = 0; i < this.lines.length; i++) {
-				Breakpoint bp = lines[i].breakpoint;
-				if(bp != null) {
-					debugger.clearBreakpoint(bp.breakpointId);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Collects all of the {@link DebuggableScript} objects for the functions
-	 * @param root the root script
-	 * @return the collected array of functions - {@link DebuggableScript} - objects or an empty array
-	 */
-	DebuggableScript[] collectFunctions(DebuggableScript root) {
-		ArrayList functions = new ArrayList();
-		collectFunctions(root, functions);
-		int size = functions.size();
-		if(size < 1) {
-			return RhinoDebuggerImpl.NO_SCRIPTS;
-		}
-		DebuggableScript[] funcs = new DebuggableScript[size];
-		functions.toArray(funcs);
-		return funcs;
-	}
-	
-	/**
-	 * Recursively collects function {@link DebuggableScript}s
-	 * 
-	 * @param root
-	 * @param collector
-	 */
-	void collectFunctions(DebuggableScript root, List collector) {
-		if(root.isFunction()) {
-			collector.add(root);
-		}
-		for (int i = 0; i < root.getFunctionCount(); i++) {
-			collectFunctions(root.getFunction(i), collector);
-		}
-	}
-	
-	/**
-	 * Computes the functions' source from the given compiled buffer
-	 * 
-	 * @param start
-	 * @param end
-	 * @param source
-	 * @return the string for the source or <code>null</code> if it could not be computed
-	 */
-	String computeFunctionSource(int start, int end, String source) {
-		if(start > -1 && end <= source.length()) {
-			return source.substring(start, end);
-		}
-		return null;
-	}
-	
-	/**
-	 * Sets the id for the script, <code>null</code> will throw and {@link IllegalArgumentException}
-	 * @param id
-	 * @throws IllegalArgumentException if <code>null</code> is specified as the new id
-	 */
-	public void setId(Long id) throws IllegalArgumentException {
-		if(id == null) {
-			throw new IllegalArgumentException();
-		}
-		this.scriptId = id;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if(obj instanceof ScriptSource) {
-			return this.uri.toString().equals(((ScriptSource)obj).uri.toString());
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return this.uri.toString().hashCode();
-	}
-
-	/**
-	 * @return a new JSON map
-	 */
-	public Object toJSON() {
-		HashMap result = new HashMap();
-		result.put(JSONConstants.SCRIPT_ID, this.scriptId);
-		result.put(JSONConstants.LOCATION, this.uri.toString());
-		result.put(JSONConstants.PROPERTIES, properties);
-		result.put(JSONConstants.SOURCE, source);
-		result.put(JSONConstants.GENERATED, Boolean.valueOf(generated));
-		if(lines != null) {
-		HashSet lineNumbers = new HashSet();
-		for (int i = 0; i < lines.length; i++) {
-			if(lines[i] != null) {
-				lineNumbers.add(new Integer(i));
-			}
-		}
-		result.put(JSONConstants.LINES, (lineNumbers == null ? Collections.EMPTY_SET : lineNumbers));
-		}
-		else {
-			result.put(JSONConstants.LINES, Collections.EMPTY_SET);
-		}
-		result.put(JSONConstants.FUNCTIONS, (functionNames == null ? Collections.EMPTY_LIST : functionNames));
-		return result;
-	}
-
-	/**
-	 * @return the id for this script object
-	 */
-	public Long getId() {
-		return scriptId;
-	}
-	
-	/**
-	 * Returns the {@link Breakpoint} at the given line number or <code>null</code>
-	 * if there isn't one
-	 * @param lineNumber
-	 * @return
-	 */
-	public Breakpoint getBreakpoint(Integer line, String functionName) {
-		synchronized (lines) {
-			if(line != null) {
-				int value = line.intValue();
-				if (value > -1 && value < lines.length && lines[value] != null) {
-					return lines[value].breakpoint;
-				}
-			}
-			if(functionNames != null) {
-				int index = functionNames.indexOf(functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null && lines[func.linenumber()] != null) {
-					return lines[func.linenumber()].breakpoint;
-				}
-			}
-			return null;
-		}
-	}
-
-	/**
-	 * Returns if the line number is valid wrt this script
-	 * 
-	 * @param lineNumber
-	 * @param functionName
-	 * @return true if the line number is valid wrt this script
-	 */
-	public boolean isValid(Integer line, String functionName) {
-		synchronized (lines) {
-			if(line != null) {
-				int value = line.intValue();
-				if (value > -1 && value < lines.length) {
-					return lines[value] != null;
-				}
-			}
-			if(functionNames != null) {
-				int index = functionNames.indexOf(functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					return lines[func.linenumber()] != null;
-				}
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Adds a breakpoint to this script
-	 * 
-	 * @param breakpoint
-	 */
-	public void addBreakpoint(Breakpoint breakpoint) {
-		synchronized (lines) {
-			Integer lineNumber = breakpoint.lineNumber;
-			if(lineNumber != null) {
-				int value = lineNumber.intValue();
-				if(lines[value] != null) {
-					lines[value].breakpoint = breakpoint;
-				}
-			}
-			else if(functionNames != null) {
-				int index = functionNames.indexOf(breakpoint.functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					if(lines[func.linenumber] != null) {
-						lines[func.linenumber].breakpoint = breakpoint;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes a breakpoint from this script
-	 * 
-	 * @param breakpoint
-	 */
-	public void removeBreakpoint(Breakpoint breakpoint) {
-		synchronized (lines) {
-			Integer lineNumber = breakpoint.lineNumber;
-			if(lineNumber != null) {
-				int value = lineNumber.intValue();
-				if(lines[value] != null) {
-					lines[value].breakpoint = null;
-				}
-			}
-			else if(functionNames != null) {
-				int index = functionNames.indexOf(breakpoint.functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					if(lines[func.linenumber] != null) {
-						lines[func.linenumber].breakpoint = null;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return the string location of this script
-	 */
-	public String getLocation() {
-		return this.uri.toString();
-	}
-	
-	/**
-	 * Returns the {@link FunctionSource} at the given position iff the given index
-	 * is within the bounds of the sources array.
-	 * 
-	 * @param index
-	 * @return the {@link FunctionSource} at the given index or <code>null</code>
-	 */
-	public FunctionSource functionAt(int index) {
-		synchronized (functionSources) {
-			if(functionSources != null && (index < functionSources.length && index > -1)) {
-				return functionSources[index];
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the {@link FunctionSource} for the given {@link DebuggableScript}
-	 * 
-	 * @param script
-	 * @return the {@link FunctionSource} for the given {@link DebuggableScript} or <code>null</code>
-	 */
-	public FunctionSource getFunction(DebuggableScript script) {
-		synchronized (scriptToFunction) {
-			return (FunctionSource) scriptToFunction.get(script);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ScriptSource: [id - ").append(scriptId).append("] [uri - ").append(uri.toString()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		buffer.append("[generated - ").append(generated).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		if(lines != null) {
-			buffer.append("\tline numbers: {"); //$NON-NLS-1$
-			for (int i = 0; i < lines.length; i++) {
-				if(lines[i] != null) {
-					buffer.append(i);
-					if(i < lines.length-1) {
-						buffer.append(", "); //$NON-NLS-1$
-					}
-				}
-			}
-			buffer.append("}\n"); //$NON-NLS-1$
-		}
-		if(functionNames != null) {
-			buffer.append("\tfunction names: {"); //$NON-NLS-1$
-			for (int i = 0; i < functionNames.size(); i++) {
-				buffer.append(functionNames.get(i));
-				if(i < functionNames.size()-1) {
-					buffer.append(", "); //$NON-NLS-1$
-				}
-			}
-			buffer.append("}\n"); //$NON-NLS-1$
-		}
-		if(functionSources != null) {
-			buffer.append("\tfunction sources:\n"); //$NON-NLS-1$
-			for (int i = 0; i < functionSources.length; i++) {
-				buffer.append(functionSources[i]).append("\n"); //$NON-NLS-1$
-			}
-		}
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java
deleted file mode 100644
index f944ca2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.BaseFunction;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.EcmaError;
-import org.mozilla.javascript.NativeArray;
-import org.mozilla.javascript.NativeJavaObject;
-import org.mozilla.javascript.Script;
-import org.mozilla.javascript.ScriptRuntime;
-import org.mozilla.javascript.Scriptable;
-import org.mozilla.javascript.ScriptableObject;
-import org.mozilla.javascript.Undefined;
-import org.mozilla.javascript.debug.DebugFrame;
-import org.mozilla.javascript.debug.DebuggableObject;
-import org.mozilla.javascript.debug.Debugger;
-
-/**
- * Rhino implementation of {@link DebugFrame}
- * 
- * @since 1.0
- */
-public class StackFrame implements DebugFrame {
-
-	private final Long id;
-	private final Context context;
-	private final ContextData contextData;
-	private final ScriptSource script;
-	private FunctionSource function = null;
-	private final HashMap handles = new HashMap();
-	private final IdentityHashMap handledObjects = new IdentityHashMap();
-	private Scriptable activation;
-	private Scriptable thisObj;
-	private int lineNumber;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param frameId
-	 * @param context
-	 * @param debuggableScript
-	 * @param script
-	 */
-	public StackFrame(Long frameId, Context context, FunctionSource function, ScriptSource script) {
-		this.id = frameId;
-		this.context = context;
-		this.contextData = (ContextData) context.getDebuggerContextData();
-		this.function = function;
-		this.script = script;
-		if(function != null) {
-			this.lineNumber = function.linenumber();
-		}
-		else {
-			this.lineNumber = script.firstLine().intValue();
-		}
-	}
-
-	/**
-	 * Returns the id of the frame
-	 * 
-	 * @return the frame id
-	 */
-	public Long getId() {
-		return id;
-	}
-
-	/**
-	 * Returns the underlying {@link Script}
-	 * 
-	 * @return the underlying {@link Script}
-	 */
-	public ScriptSource getScript() {
-		return script;
-	}
-
-	/**
-	 * Returns the line number for the frame
-	 * 
-	 * @return the frame line number
-	 */
-	public Integer getLineNumber() {
-		return new Integer(lineNumber);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onDebuggerStatement(org.mozilla.javascript.Context)
-	 */
-	public void onDebuggerStatement(Context cx) {
-		initializeHandles();
-		this.lineNumber = 1+lineNumber;
-		contextData.debuggerStatement(script, new Integer(lineNumber));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onEnter(org.mozilla.javascript.Context, org.mozilla.javascript.Scriptable, org.mozilla.javascript.Scriptable, java.lang.Object[])
-	 */
-	public void onEnter(Context cx, Scriptable activation, Scriptable thisObj, Object[] args) {
-		this.activation = activation;
-		this.thisObj = thisObj;
-		initializeHandles();
-		contextData.pushFrame(this, this.script, new Integer(lineNumber), getFunctionName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onExit(org.mozilla.javascript.Context, boolean, java.lang.Object)
-	 */
-	public void onExit(Context cx, boolean byThrow, Object resultOrException) {
-		this.activation = null;
-		this.thisObj = null;
-		clearHandles();
-		this.contextData.popFrame(byThrow, resultOrException);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onExceptionThrown(org.mozilla.javascript.Context, java.lang.Throwable)
-	 */
-	public void onExceptionThrown(Context cx, Throwable ex) {
-		initializeHandles();
-		this.contextData.exceptionThrown(ex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onLineChange(org.mozilla.javascript.Context, int)
-	 */
-	public void onLineChange(Context cx, int lineNumber) {
-		if (this.lineNumber == lineNumber)
-			return;
-		initializeHandles();
-		this.lineNumber = lineNumber;
-		Integer line = new Integer(this.lineNumber);
-		if(this.script.isValid(line, getFunctionName())) {
-			this.contextData.lineChange(this.script, line);
-		}
-	}
-
-	/**
-	 * @return the name of the function backing this frame or <code>null</code> if there is no function
-	 * or it has no name.
-	 */
-	String getFunctionName() {
-		return (this.function == null ? null : this.function.name());
-	}
-	
-	/**
-	 * Evaluates the given source
-	 * 
-	 * @param source
-	 * @return
-	 */
-	public Object evaluate(String source) {
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context evalContext = context.getFactory().enter();
-		Debugger debugger = evalContext.getDebugger();
-		Object debuggerContextData = evalContext.getDebuggerContextData();
-		evalContext.setDebugger(null, null);
-		try {
-			Object result = ScriptRuntime.evalSpecial(evalContext, activation, thisObj, new Object[] { source }, "eval", 0); //$NON-NLS-1$
-			Long handle = createHandle(result);
-			return serialize(handle, result);
-		}
-		catch (EcmaError ecma) {
-			return null;
-		}
-		finally {
-			evalContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Evaluates the given condition
-	 * 
-	 * @param condition
-	 * @return the status of the condition evaluation
-	 */
-	public boolean evaluateCondition(String condition) {
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context evalContext = context.getFactory().enter();
-		Debugger debugger = evalContext.getDebugger();
-		Object debuggerContextData = evalContext.getDebuggerContextData();
-		evalContext.setDebugger(null, null);
-		try {
-			Object result = ScriptRuntime.evalSpecial(evalContext, activation, thisObj, new Object[] { condition }, JSONConstants.CONDITION, 0);
-			return ScriptRuntime.toBoolean(result);
-		} finally {
-			evalContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Look up the given handle in the known list of handles for this frame
-	 * 
-	 * @param handle
-	 * @return the serialized handle never <code>null</code>
-	 */
-	public Object lookup(Long handle) {
-
-		Object result = handles.get(handle);
-
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context lookupContext = context.getFactory().enter();
-		Debugger debugger = lookupContext.getDebugger();
-		Object debuggerContextData = lookupContext.getDebuggerContextData();
-		lookupContext.setDebugger(null, null);
-		try {
-			return serialize(handle, result);
-		} finally {
-			lookupContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Returns a JSON map
-	 * 
-	 * @return a new JSON object
-	 */
-	public Object toJSON() {
-		Map result = new HashMap();
-		result.put(JSONConstants.THREAD_ID, contextData.getThreadId());
-		result.put(JSONConstants.CONTEXT_ID, contextData.getId());
-		result.put(JSONConstants.FRAME_ID, id);
-		result.put(JSONConstants.SCRIPT_ID, script.getId());
-		result.put(JSONConstants.LINE, new Integer(lineNumber));
-		result.put(JSONConstants.REF, new Integer(0));
-		//TODO update this
-		result.put(JSONConstants.SCOPE_NAME, null);
-		return result;
-	}
-
-	/**
-	 * Serializes a handle object for this frame
-	 * 
-	 * @param handle
-	 * @param object
-	 * @return the serialized handle, never <code>null</code>
-	 */
-	public Object serialize(Long handle, Object object) {
-		Map result = new HashMap();
-		result.put(JSONConstants.REF, handle);
-
-		// "undefined", "null", "boolean", "number", "string", "object", "function" or "frame"
-		if (object == Undefined.instance) {
-			serializeUndefined(result);
-		} else if (object == null) {
-			serializeNull(result);
-		} else if (object instanceof Boolean) {
-			serializeSimpleType(object, JSONConstants.BOOLEAN, result);
-		} else if (object instanceof Number) {
-			Object value = (object == ScriptRuntime.NaNobj) ? null : object;
-			serializeSimpleType(value, JSONConstants.NUMBER, result);
-		} else if (object instanceof String) {
-			serializeSimpleType(object, JSONConstants.STRING, result);
-		} else if (object instanceof Scriptable) {
-			Scriptable scriptable = (Scriptable) object;
-			serializeFunctionOrObject(scriptable, result);
-		} else if (object == this) {
-			serializeFrame(result);
-		} else {
-			serializeUndefined(result);
-		}
-		return result;
-	}
-
-	/**
-	 * Serialize the undefined value
-	 * 
-	 * @param result
-	 * @see JSONConstants#UNDEFINED
-	 */
-	private void serializeUndefined(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.UNDEFINED);
-	}
-
-	/**
-	 * Serialize the null value
-	 * 
-	 * @param result
-	 * @see JSONConstants#NULL
-	 */
-	private void serializeNull(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.NULL);
-	}
-
-	/**
-	 * Serialize the given simple type
-	 * 
-	 * @param object
-	 * @param type
-	 * @param result
-	 */
-	private void serializeSimpleType(Object object, String type, Map result) {
-		result.put(JSONConstants.TYPE, type);
-		result.put(JSONConstants.VALUE, object);
-	}
-
-	/**
-	 * Serialize a function or object
-	 * 
-	 * @param scriptable
-	 * @param result
-	 * @see JSONConstants#FUNCTION
-	 * @see JSONConstants#OBJECT
-	 */
-	private void serializeFunctionOrObject(Scriptable scriptable, Map result) {
-		if (scriptable instanceof BaseFunction) {
-			result.put(JSONConstants.TYPE, JSONConstants.FUNCTION);
-			result.put(JSONConstants.NAME, ((BaseFunction) scriptable).getFunctionName());
-		} else if (scriptable instanceof NativeArray) {
-			result.put(JSONConstants.TYPE, JSONConstants.ARRAY);
-		} else {
-			result.put(JSONConstants.TYPE, JSONConstants.OBJECT);
-		}
-		result.put(JSONConstants.CLASS_NAME, scriptable.getClassName());
-
-		Object constructorFunction = null;
-		if (ScriptableObject.hasProperty(scriptable, JSONConstants.CONSTRUCTOR)) {
-			constructorFunction = ScriptableObject.getProperty(scriptable, JSONConstants.CONSTRUCTOR);
-		}
-		result.put(JSONConstants.CONSTRUCTOR_FUNCTION, createHandle(constructorFunction));
-		result.put(JSONConstants.PROTOTYPE_OBJECT, createHandle(scriptable.getPrototype()));
-		if (scriptable instanceof NativeJavaObject)
-			result.put(JSONConstants.PROPERTIES, createJavaObjectProperties((NativeJavaObject) scriptable));
-		else
-			result.put(JSONConstants.PROPERTIES, createProperties(scriptable));
-	}
-
-	/**
-	 * @param javaObject
-	 * @return
-	 */
-	private Object createJavaObjectProperties(NativeJavaObject javaObject) {
-		ArrayList properties = new ArrayList();
-		// TODO: The problem here is Rhino treats getters and setters differently and in some cases will call these methods
-		// we need to sort out what's reasonable to display without modifying state
-		return properties;
-	}
-
-	/**
-	 * Serialize a frame
-	 * 
-	 * @param result
-	 * @see JSONConstants#FRAME
-	 * @see JSONConstants#THIS
-	 */
-	private void serializeFrame(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.FRAME);
-		Set properties = new HashSet();
-		properties.add(createProperty(JSONConstants.THIS, thisObj));
-		properties.addAll(createProperties(activation));
-		Scriptable parent = activation.getParentScope();
-		while(parent != null) {
-			properties.addAll(createProperties(parent));
-			parent = parent.getParentScope();
-		}		
-		result.put(JSONConstants.PROPERTIES, properties);
-	}
-
-	/**
-	 * Creates the list of properties from the given {@link Scriptable}
-	 * 
-	 * @param scriptable
-	 * @return the live list of properties from the given {@link Scriptable}
-	 */
-	private List createProperties(Scriptable scriptable) {
-		ArrayList properties = new ArrayList();
-		Object[] ids = scriptable.getIds();
-		if (scriptable instanceof DebuggableObject) {
-			HashSet arrayIds = new HashSet(Arrays.asList(ids));
-			arrayIds.addAll(Arrays.asList(((DebuggableObject)scriptable).getAllIds()));
-			ids = arrayIds.toArray();
-		}
-		for (int i = 0; i < ids.length; i++) {
-			Object id = ids[i];
-			Object value = null;
-			if (id instanceof String) {
-				value = ScriptableObject.getProperty(scriptable, (String) id);
-			} else if (id instanceof Number) {
-				value = ScriptableObject.getProperty(scriptable, ((Number) id).intValue());
-			} else
-				continue;
-
-			Map property = createProperty(id, value);
-			properties.add(property);
-		}
-		return properties;
-	}
-
-	/**
-	 * Create a new property map for the given id and value
-	 * 
-	 * @param id
-	 * @param value
-	 * @return a new property map
-	 * @see JSONConstants#NAME
-	 */
-	private Map createProperty(Object id, Object value) {
-		Map property = createRef(value);
-		property.put(JSONConstants.NAME, id);
-		return property;
-	}
-
-	/**
-	 * Create a new ref map for the given object
-	 * 
-	 * @param object
-	 * @return a new ref map
-	 * @see JSONConstants#REF
-	 */
-	private Map createRef(Object object) {
-		Map map = new HashMap(2);
-		map.put(JSONConstants.REF, createHandle(object));
-		return map;
-	}
-
-	/**
-	 * Clears all cached handles from this frame
-	 */
-	private void clearHandles() {
-		handles.clear();
-		handledObjects.clear();
-	}
-
-	/**
-	 * Initializes the set of handles
-	 */
-	private void initializeHandles() {
-		if (handles.size() != 1) {
-			clearHandles();
-			createHandle(this);
-		}
-	}
-
-	/**
-	 * Creates a new handle for the given object and caches it
-	 * 
-	 * @param object
-	 * @return the id of the new handle
-	 */
-	private Long createHandle(Object object) {
-		Long handle = (Long) handledObjects.get(object);
-		if (handle == null) {
-			handle = new Long(nextHandle());
-			handles.put(handle, object);
-			handledObjects.put(object, handle);
-		}
-		return handle;
-	}
-
-	/**
-	 * @return the next handle to use when creating handles
-	 */
-	private int nextHandle() {
-		return handles.size();
-	}
-
-	/**
-	 * @return the thread id for the underlying {@link ContextData}
-	 */
-	public Object getThreadId() {
-		return contextData.getThreadId();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java
deleted file mode 100644
index e8d25b4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.debug.DebugFrame;
-
-/**
- * Rhino implementation of thread data
- * 
- * @since 1.0
- */
-public class ThreadData {
-
-	private final LinkedList contexts = new LinkedList();
-	private final Long threadId;
-	private final RhinoDebuggerImpl debugger;
-
-	private long currentContextId = 0L;
-	private long currentFrameId = 0L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param threadId
-	 * @param debugger
-	 */
-	public ThreadData(Long threadId, RhinoDebuggerImpl debugger) {
-		this.threadId = threadId;
-		this.debugger = debugger;
-	}
-
-	/**
-	 * @return a JSON object for this data
-	 */
-	public synchronized Object toJSON() {
-		Map result = new HashMap();
-		result.put(JSONConstants.THREAD_ID, threadId);
-		if (contexts.isEmpty()) {
-			result.put(JSONConstants.STATE, JSONConstants.RUNNING);
-		} else {
-			Context top = (Context) contexts.getFirst();
-			result.put(JSONConstants.STATE, ((ContextData) top.getDebuggerContextData()).getState());
-		}
-		ArrayList contextIds = new ArrayList(contexts.size());
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			contextIds.add(data.getId());
-		}
-		result.put(JSONConstants.CONTEXTS, contextIds);
-		return result;
-	}
-
-	/**
-	 * Caches that the given context has been created
-	 * 
-	 * @param context
-	 */
-	public synchronized void contextCreated(Context context) {
-		context.setGeneratingDebug(true);
-		context.setOptimizationLevel(-1);
-		ContextData contextData = new ContextData(threadId, new Long(currentContextId++), debugger);
-		context.setDebugger(debugger, contextData);
-		contexts.addFirst(context);
-	}
-
-	/**
-	 * Removes the context from the top of the stack
-	 * 
-	 * @param context
-	 */
-	public synchronized void contextReleased(Context context) {
-		if(hasContext()) {
-			contexts.removeFirst();
-		}
-	}
-
-	/**
-	 * @return true if there are any known contexts to this thread data
-	 */
-	public synchronized boolean hasContext() {
-		return !contexts.isEmpty();
-	}
-
-	/**
-	 * Returns all of the frame ids from all of the known contexts in this thread data or an empty list, never <code>null</code>
-	 * 
-	 * @return the complete list of frame ids from all known contexts
-	 */
-	public synchronized List getFrameIds() {
-		ArrayList result = new ArrayList(contexts.size());
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			result.addAll(data.getFrameIds());
-		}
-		return result;
-	}
-
-	/**
-	 * Suspends the first context on the stack. has no effect if there are no known contexts for this thread data
-	 */
-	public synchronized void suspend() {
-		if(hasContext()) {
-			Context context = (Context) contexts.getFirst();
-			if (context == null) {
-				return;
-			}
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			data.suspend();
-		}
-	}
-
-	/**
-	 * Resumes the top context for the given type. Has no effect if there are no known contexts
-	 * 
-	 * @param stepType
-	 * 
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 * @see JSONConstants#STEP_ANY
-	 */
-	public synchronized void resume(String stepType) {
-		if(hasContext()) {
-			Context context = (Context) contexts.getFirst();
-			if (context == null) {
-				return;
-			}
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			data.resume(stepType);
-		}
-	}
-
-	/**
-	 * Returns the {@link DebugFrame} with the given id from the first context containing such a frame. Returns <code>null</code> if no such frame exists with the given id.
-	 * 
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id or <code>null</code>
-	 */
-	public synchronized StackFrame getFrame(Long frameId) {
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			StackFrame frame = data.getFrame(frameId);
-			if (frame != null)
-				return frame;
-		}
-		return null;
-	}
-
-	/**
-	 * Creates a new {@link DebugFrame} for the given attributes.
-	 * 
-	 * @param context
-	 * @param function
-	 * @param script
-	 * @return a new {@link DebugFrame}
-	 */
-	public synchronized DebugFrame getFrame(Context context, FunctionSource function, ScriptSource script) {
-		return new StackFrame(new Long(currentFrameId++), context, function, script);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java
deleted file mode 100644
index e47bae8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-/**
- * Common constants
- * 
- * @since 1.0
- */
-public interface Constants {
-
-	/**
-	 * Constant representing a space
-	 */
-	public static final String SPACE = " "; //$NON-NLS-1$
-	/**
-	 * Constant representing a colon.<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant representing the empty string
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant <br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-	/**
-	 * Debug property name <br>
-	 * <br>
-	 * Value is: <code>rhino.debug</code>
-	 */
-	public static final String RHINO_DEBUG = "rhino.debug"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java
deleted file mode 100644
index d0bb401..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * An {@link EventPacket} is a specialized {@link RhinoPacket}
- * that only handles <code>event</code> data.
- * 
- * @since 1.0
- */
-public class EventPacket extends RhinoPacket {
-
-	public static final String TYPE = JSONConstants.EVENT;
-	private final String event;
-	private final Map body = Collections.synchronizedMap(new HashMap());
-
-	/**
-	 * Constructor
-	 * @param event
-	 */
-	public EventPacket(String event) {
-		super(TYPE);
-		this.event = event.intern();
-	}
-
-	/**
-	 * Constructor
-	 * @param json
-	 */
-	public EventPacket(Map json) {
-		super(json);
-		String packetEvent = (String) json.get(JSONConstants.EVENT);
-		event = packetEvent.intern();
-		Map packetBody = (Map) json.get(JSONConstants.BODY);
-		body.putAll(packetBody);
-	}
-
-	/**
-	 * Returns the underlying event data
-	 * @return the event data
-	 */
-	public String getEvent() {
-		return event;
-	}
-
-	/**
-	 * Returns the underlying body of the event packet
-	 * @return the body of the packet
-	 */
-	public Map getBody() {
-		return body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.EVENT, event);
-		json.put(JSONConstants.BODY, body);
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("EventPacket: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java
deleted file mode 100644
index 3073856..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-/**
- * Collection of constants used for JSON
- * 
- * @since 1.0
- */
-public interface JSONConstants {
-
-	// request / response
-	public static final String SEQ = "seq"; //$NON-NLS-1$
-	public static final String REQUEST_SEQ = "request_seq"; //$NON-NLS-1$
-	public static final String TYPE = "type"; //$NON-NLS-1$
-	public static final String REQUEST = "request"; //$NON-NLS-1$
-	public static final String COMMAND = "command"; //$NON-NLS-1$
-	public static final String CONNECT = "connect"; //$NON-NLS-1$
-	public static final String MESSAGE = "message"; //$NON-NLS-1$
-	public static final String ARGUMENTS = "arguments"; //$NON-NLS-1$
-	public static final String BODY = "body"; //$NON-NLS-1$
-	public static final String LINE = "line"; //$NON-NLS-1$
-	public static final String SCRIPT = "script"; //$NON-NLS-1$
-	public static final String SCRIPTS = "scripts"; //$NON-NLS-1$
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-	public static final String ENTER = "enter"; //$NON-NLS-1$
-	public static final String EXIT = "exit"; //$NON-NLS-1$
-	public static final String FUNCTIONS = "functions"; //$NON-NLS-1$
-	public static final String BREAK = "break"; //$NON-NLS-1$
-	public static final String RESPONSE = "response"; //$NON-NLS-1$
-	public static final String FUNCTION_NAME = "functionName"; //$NON-NLS-1$
-	public static final String EVENT = "event"; //$NON-NLS-1$
-	public static final String NOT_FOUND = "not found"; //$NON-NLS-1$
-	/**
-	 * The type for a VMDeathEvent
-	 * 
-	 * @see EventPacket#getType()
-	 */
-	public static final String VMDEATH = "vmdeath"; //$NON-NLS-1$
-
-	// value constants
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-	public static final String UNKNOWN = "unknown"; //$NON-NLS-1$
-	public static final String NULL = "null"; //$NON-NLS-1$
-	public static final String BOOLEAN = "boolean"; //$NON-NLS-1$
-	public static final String NUMBER = "number"; //$NON-NLS-1$
-	public static final String STRING = "string"; //$NON-NLS-1$
-	public static final String OBJECT = "object"; //$NON-NLS-1$
-	public static final String ARRAY = "array"; //$NON-NLS-1$
-	public static final String PROPERTY = "property"; //$NON-NLS-1$
-	public static final String VARIABLE = "variable"; //$NON-NLS-1$
-	public static final String THIS = "this"; //$NON-NLS-1$
-	public static final String PROTOTYPE_OBJECT = "prototypeObject"; //$NON-NLS-1$
-	public static final String CONSTRUCTOR_FUNCTION = "constructorFunction"; //$NON-NLS-1$
-
-	// id constants
-	public static final String THREAD_ID = "threadId"; //$NON-NLS-1$
-	public static final String FRAME_ID = "frameId"; //$NON-NLS-1$
-	public static final String BREAKPOINT_ID = "breakpointId"; //$NON-NLS-1$
-	public static final String CONTEXT_ID = "contextId"; //$NON-NLS-1$
-	public static final String SCRIPT_ID = "scriptId"; //$NON-NLS-1$
-
-	// breakpoints
-	public static final String SETBREAKPOINT = "setbreakpoint"; //$NON-NLS-1$
-	public static final String BREAKPOINT = "breakpoint"; //$NON-NLS-1$
-	public static final String BREAKPOINTS = "breakpoints"; //$NON-NLS-1$
-	public static final String CLEARBREAKPOINT = "clearbreakpoint"; //$NON-NLS-1$
-	public static final String CONDITION = "condition"; //$NON-NLS-1$
-	public static final String LINES = "lines"; //$NON-NLS-1$
-	public static final String DEBUGGER_STATEMENT = "debuggerStatement"; //$NON-NLS-1$
-
-	// threads
-	public static final String CONTINUE = "continue"; //$NON-NLS-1$
-	public static final String RUNNING = "running"; //$NON-NLS-1$
-	public static final String BACKTRACE = "backtrace"; //$NON-NLS-1$
-	public static final String SUCCESS = "success"; //$NON-NLS-1$
-	public static final String TOTAL_FRAMES = "totalframes"; //$NON-NLS-1$
-	public static final String STEP_ACTION = "stepaction"; //$NON-NLS-1$
-	public static final String STEP = "step"; //$NON-NLS-1$
-	public static final String STEP_TYPE = "stepType"; //$NON-NLS-1$
-	public static final String STEP_IN = "in"; //$NON-NLS-1$
-	public static final String STEP_NEXT = "next"; //$NON-NLS-1$
-	public static final String STEP_OUT = "out"; //$NON-NLS-1$
-	public static final String STEP_ANY = "any"; //$NON-NLS-1$
-	public static final String CONTEXTS = "contexts"; //$NON-NLS-1$
-	public static final String STATE = "state"; //$NON-NLS-1$
-	public static final String FRAMES = "frames"; //$NON-NLS-1$
-
-	// target
-	public static final String THREADS = "threads"; //$NON-NLS-1$
-	public static final String THREAD = "thread"; //$NON-NLS-1$
-	public static final String VERSION = "version"; //$NON-NLS-1$
-	public static final String DISPOSE = "dispose"; //$NON-NLS-1$
-	public static final String SUSPEND = "suspend"; //$NON-NLS-1$
-	public static final String SUSPENDED = "suspended"; //$NON-NLS-1$
-	public static final String EXCEPTION = "exception"; //$NON-NLS-1$
-	public static final String VM_VERSION = "javascript.vm.version"; //$NON-NLS-1$
-	public static final String VM_NAME = "javascript.vm.name"; //$NON-NLS-1$
-	public static final String VM_VENDOR = "javascript.vm.vendor"; //$NON-NLS-1$
-	public static final String JAVASCRIPT_VERSION = "javascript.version"; //$NON-NLS-1$
-	public static final String ECMASCRIPT_VERSION = "ecmascript.version"; //$NON-NLS-1$
-
-	// stackframe
-	public static final String EVALUATE = "evaluate"; //$NON-NLS-1$
-	public static final String EXPRESSION = "expression"; //$NON-NLS-1$
-	public static final String PROPERTIES = "properties"; //$NON-NLS-1$
-	public static final String NAME = "name"; //$NON-NLS-1$
-	public static final String LOOKUP = "lookup"; //$NON-NLS-1$
-	public static final String REF = "ref"; //$NON-NLS-1$	
-	public static final String CONSTRUCTOR = "constructor"; //$NON-NLS-1$
-	public static final String CLASS_NAME = "className"; //$NON-NLS-1$
-	public static final String VALUE = "value"; //$NON-NLS-1$
-	public static final String SCOPE_NAME = "scopeName"; //$NON-NLS-1$
-	public static final String FRAME = "frame"; //$NON-NLS-1$
-
-	// scripts
-	public static final String GENERATED = "generated"; //$NON-NLS-1$
-	public static final String SOURCE = "source"; //$NON-NLS-1$
-	public static final String LOCATION = "location"; //$NON-NLS-1$
-	public static final String BASE = "base"; //$NON-NLS-1$	
-	public static final String PATH = "path"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java
deleted file mode 100644
index fe4ea07..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.math.BigDecimal;
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.mozilla.javascript.Undefined;
-
-
-/**
- * This class provides utilities for working with JSON.
- * <br><br>JSON identifiers map to Java as follows:
- * <ul>
- * <li>string	<--> 	java.lang.String</li>
- * <li>number	<--> 	java.math.Number (BigDecimal)</li>
- * <li>object	<--> 	java.util.Map (HashMap)</li>
- * <li>array	<--> 	java.util.Collection (ArrayList)</li>
- * <li>true		<--> 	java.lang.Boolean.TRUE</li>
- * <li>false	<--> 	java.lang.Boolean.FALSE</li>
- * <li>null		<--> 	null</li>
- * </ul> 
- * 
- * @see JSONConstants
- * @since 1.0
- */
-public final class JSONUtil {
-
-	/**
-	 * Constructor
-	 * no instantiation
-	 */
-	private JSONUtil() {}
-	
-	/**
-	 * Reads an object from the given JSON string.
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param jsonString
-	 * @return the object corresponding to the JSON string or <code>null</code>
-	 */
-	public static Object read(String jsonString) {
-		return parse(new StringCharacterIterator(jsonString));
-	}
-
-	/**
-	 * Writes the given object to JSON
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param jsonObject
-	 * @return the composed JSON string, never <code>null</code>
-	 */
-	public static String write(Object jsonObject) {
-		StringBuffer buffer = new StringBuffer();
-		writeValue(jsonObject, buffer);
-		return buffer.toString();
-	}
-
-	/**
-	 * Creates an {@link IllegalStateException} for the given message and iterator
-	 * 
-	 * @param message the message for the exception
-	 * @param it the iterator
-	 * @return a new {@link IllegalStateException} 
-	 */
-	private static RuntimeException error(String message, CharacterIterator it) {
-		return new IllegalStateException("[" + it.getIndex() + "] " + message); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Creates an {@link IllegalStateException} for the given message
-	 * 
-	 * @param message the message for the exception
-	 * @return a new {@link IllegalStateException}
-	 */
-	private static RuntimeException error(String message) {
-		return new IllegalStateException(message);
-	}
-
-	/**
-	 * Parses the object value from the JSON string.
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param it
-	 * @return
-	 */
-	private static Object parse(CharacterIterator it) {
-		parseWhitespace(it);
-		Object result = parseValue(it);
-		parseWhitespace(it);
-
-		if (it.current() != CharacterIterator.DONE) {
-			throw error("should be done", it); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * Chews up whitespace from the iterator
-	 * 
-	 * @param it
-	 */
-	private static void parseWhitespace(CharacterIterator it) {
-		char c = it.current();
-		while (Character.isWhitespace(c)) {
-			c = it.next();
-		}
-	}
-
-	/**
-	 * Delegate method that calls the correct parse* method for object creation
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param it
-	 * @return
-	 */
-	private static Object parseValue(CharacterIterator it) {
-		switch (it.current()) {
-			case '{' :
-				return parseObject(it);
-			case '[' :
-				return parseArray(it);
-			case '"' :
-				return parseString(it);
-			case '-' :
-			case '0' :
-			case '1' :
-			case '2' :
-			case '3' :
-			case '4' :
-			case '5' :
-			case '6' :
-			case '7' :
-			case '8' :
-			case '9' :
-				return parseNumber(it);
-			case 't' :
-				parseText(Boolean.TRUE.toString(), it);
-				return Boolean.TRUE;
-			case 'f' :
-				parseText(Boolean.FALSE.toString(), it);
-				return Boolean.FALSE;
-			case 'n' :
-				parseText(JSONConstants.NULL, it);
-				return null;
-			case 'u':
-				parseText(JSONConstants.UNDEFINED, it);
-				return null;
-		}
-		throw error("Bad JSON starting character '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-	}
-
-	/**
-	 * Parses an {@link Map} object from the iterator or throws an
-	 * {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it
-	 * @return a new {@link Map} object, never <code>null</code>
-	 */
-	private static Map parseObject(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == '}') {
-			it.next();
-			return Collections.EMPTY_MAP;
-		}
-
-		Map map = new HashMap();
-		while (true) {
-			if (it.current() != '"')
-				throw error("expected a string start '\"' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			String key = parseString(it);
-			if (map.containsKey(key))
-				throw error("' already defined" + "key '" + key, it); //$NON-NLS-1$ //$NON-NLS-2$
-			parseWhitespace(it);
-			if (it.current() != ':')
-				throw error("expected a pair separator ':' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			it.next();
-			parseWhitespace(it);
-			Object value = parseValue(it);
-			map.put(key, value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-
-			if (it.current() != '}')
-				throw error("expected an object close '}' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			break;
-		}
-		it.next();
-		return map;
-	}
-
-	/**
-	 * Parses an {@link ArrayList} from the given iterator or throws an
-	 * {@link IllegalStateException} if parsing fails
-	 * 
-	 * @param it
-	 * @return a new {@link ArrayList} object never <code>null</code>
-	 */
-	private static List parseArray(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == ']') {
-			it.next();
-			return Collections.EMPTY_LIST;
-		}
-
-		List list = new ArrayList();
-		while (true) {
-			Object value = parseValue(it);
-			list.add(value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-
-			if (it.current() != ']')
-				throw error("expected an array close ']' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			break;
-		}
-		it.next();
-		return list;
-	}
-
-	private static void parseText(String string, CharacterIterator it) {
-		int length = string.length();
-		char c = it.current();
-		for (int i = 0; i < length; i++) {
-			if (c != string.charAt(i))
-				throw error("expected to parse '" + string + "' but character " + (i + 1) + " was '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$;
-			c = it.next();
-		}
-	}
-
-	private static Object parseNumber(CharacterIterator it) {
-		StringBuffer buffer = new StringBuffer();
-		char c = it.current();
-		while (Character.isDigit(c) || c == '-' || c == '+' || c == '.' || c == 'e' || c == 'E') {
-			buffer.append(c);
-			c = it.next();
-		}
-		try {
-			return new BigDecimal(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw error("expected a number but was '" + buffer.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-		}
-	}
-
-	private static String parseString(CharacterIterator it) {
-		char c = it.next();
-		if (c == '"') {
-			it.next();
-			return ""; //$NON-NLS-1$
-		}
-		StringBuffer buffer = new StringBuffer();
-		while (c != '"') {
-			if (Character.isISOControl(c)) {
-				//XXX we should ignore the ISO control chars and make a best effort to continue
-				c = it.next();
-				continue;
-				//throw error("illegal iso control character: '" + Integer.toHexString(c) + "'", it); //$NON-NLS-1$ //$NON-NLS-2$);
-			}
-			if (c == '\\') {
-				c = it.next();
-				switch (c) {
-					case '"' :
-					case '\\' :
-					case '/' :
-						buffer.append(c);
-						break;
-					case 'b' :
-						buffer.append('\b');
-						break;
-					case 'f' :
-						buffer.append('\f');
-						break;
-					case 'n' :
-						buffer.append('\n');
-						break;
-					case 'r' :
-						buffer.append('\r');
-						break;
-					case 't' :
-						buffer.append('\t');
-						break;
-					case 'u' :
-						StringBuffer unicode = new StringBuffer(4);
-						for (int i = 0; i < 4; i++) {
-							unicode.append(it.next());
-						}
-						try {
-							buffer.append((char) Integer.parseInt(unicode.toString(), 16));
-						} catch (NumberFormatException e) {
-							throw error("expected a unicode hex number but was '" + unicode.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-						}
-						break;
-					default :
-						throw error("illegal escape character '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-				}
-			} else
-				buffer.append(c);
-
-			c = it.next();
-		}
-		c = it.next();
-		return buffer.toString();
-	}
-
-	private static void writeValue(Object value, StringBuffer buffer) {
-		if (value == null)
-			buffer.append(JSONConstants.NULL);
-		else if (value instanceof Boolean)
-			buffer.append(value.toString());
-		else if (value instanceof Number)
-			writeNumber((Number) value, buffer);
-		else if (value instanceof String)
-			writeString((String) value, buffer);
-		else if (value instanceof Collection)
-			writeArray((Collection) value, buffer);
-		else if (value instanceof Map)
-			writeObject((Map) value, buffer);
-		else  if(value instanceof Undefined) {
-			buffer.append(JSONConstants.UNDEFINED);
-		}
-		else
-			throw error("Unexpected object instance type was '" + value.getClass().getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$););
-	}
-
-	private static void writeNumber(Number value, StringBuffer buffer) {
-		if (value instanceof Double) {
-			if (((Double)value).isNaN() || ((Double)value).isInfinite()) {
-				buffer.append(JSONConstants.NULL);
-				return;
-			}
-		} else if (value instanceof Float) {
-			if (((Float)value).isNaN() || ((Float)value).isInfinite()) {
-				buffer.append(JSONConstants.NULL);
-				return;
-			}
-		}
-		buffer.append(value.toString());
-	}
-
-	private static void writeObject(Map map, StringBuffer buffer) {
-		buffer.append('{');
-		for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
-			Object key = iterator.next();
-			if (!(key instanceof String))
-				throw error("Map keys must be an instance of String but was '" + key.getClass().getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$););
-			writeString((String) key, buffer);
-			buffer.append(':');
-			writeValue(map.get(key), buffer);
-			buffer.append(',');
-		}
-		if (buffer.charAt(buffer.length() - 1) == ',')
-			buffer.setCharAt(buffer.length() - 1, '}');
-		else
-			buffer.append('}');
-	}
-
-	private static void writeArray(Collection collection, StringBuffer buffer) {
-		buffer.append('[');
-		for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
-			writeValue(iterator.next(), buffer);
-			buffer.append(',');
-		}
-		if (buffer.charAt(buffer.length() - 1) == ',')
-			buffer.setCharAt(buffer.length() - 1, ']');
-		else
-			buffer.append(']');
-	}
-
-	private static void writeString(String string, StringBuffer buffer) {
-		buffer.append('"');
-		int length = string.length();
-		for (int i = 0; i < length; i++) {
-			char c = string.charAt(i);
-			switch (c) {
-				case '"' :
-				case '\\' :
-				case '/' :
-					buffer.append('\\');
-					buffer.append(c);
-					break;
-				case '\b' :
-					buffer.append("\\b"); //$NON-NLS-1$
-					break;
-				case '\f' :
-					buffer.append("\\f"); //$NON-NLS-1$
-					break;
-				case '\n' :
-					buffer.append("\\n"); //$NON-NLS-1$
-					break;
-				case '\r' :
-					buffer.append("\\r"); //$NON-NLS-1$
-					break;
-				case '\t' :
-					buffer.append("\\t"); //$NON-NLS-1$
-					break;
-				default :
-					if (Character.isISOControl(c)) {
-						buffer.append("\\u"); //$NON-NLS-1$
-						String hexString = Integer.toHexString(c);
-						for (int j = hexString.length(); j < 4; j++)
-							buffer.append('0');
-						buffer.append(hexString);
-					} else
-						buffer.append(c);
-			}
-		}
-		buffer.append('"');
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java
deleted file mode 100644
index 7c87ba2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-
-/**
- * A {@link Connection} implementation that uses streams for communication
- * 
- * @since 1.0
- */
-public class PipedConnection implements Connection {
-
-	private Writer writer;
-	private Reader reader;
-	private boolean open = true;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param is the {@link InputStream} to read from, <code>null</code> is not accepted
-	 * @param os the {@link OutputStream} to write to, <code>null</code> is not accepted
-	 * @throws IOException
-	 */
-	public PipedConnection(InputStream is, OutputStream os) throws IOException {
-		if(is == null) {
-			throw new IllegalArgumentException("You cannot create a new PipedConnection on a null InputStream"); //$NON-NLS-1$
-		}
-		if(os == null) {
-			throw new IllegalArgumentException("You cannot create a new PipedConnection on a null OutputStream"); //$NON-NLS-1$
-		}
-		writer = new BufferedWriter(new OutputStreamWriter(os, Constants.UTF_8));
-		reader = new BufferedReader(new InputStreamReader(is, Constants.UTF_8));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#isOpen()
-	 */
-	public synchronized boolean isOpen() {
-		return open;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#close()
-	 */
-	public synchronized void close() throws IOException {
-		open = false;
-		writer.close();
-		reader.close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String jsonString = JSONUtil.write(packet.toJSON());
-		String count = Integer.toString(jsonString.length());
-		writer.write(count);
-		writer.write('\r');
-		writer.write('\n');
-		writer.write(jsonString);
-		writer.flush();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		int c;
-		while ((c = reader.read()) != -1) {
-			if (c == '\r')
-				break;
-			buffer.append((char) c);
-			if (buffer.length() > 10) {
-				throw new IOException("Invalid content length: " + buffer.toString()); //$NON-NLS-1$
-			}
-		}
-
-		int length = 0;
-		try {
-			length = Integer.parseInt(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw new IOException("Failed to parse content length: " + buffer.toString()); //$NON-NLS-1$
-		}
-
-		if ('\r' != c || '\n' != (char) reader.read())
-			throw new IOException("Missing CRLF after content length"); //$NON-NLS-1$
-
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0)
-				throw new EOFException();
-			n += count;
-		}
-
-		Map json = (Map) JSONUtil.read(new String(message));
-		String type = RhinoPacket.getType(json);
-		if (EventPacket.TYPE.equals(type))
-			return new EventPacket(json);
-		if (JSONConstants.REQUEST.equals(type))
-			return new RhinoRequest(json);
-		if (JSONConstants.RESPONSE.equals(type))
-			return new RhinoResponse(json);
-
-		throw new IOException("Unknown packet type: " + type); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java
deleted file mode 100644
index dcce3b6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-/**
- * {@link TransportService} specialization for a {@link PipedConnection}
- * 
- * @since 1.0
- */
-public class PipedTransportService implements TransportService {
-
-	/**
-	 * Key specialized for a {@link PipedTransportService}
-	 */
-	public static class PipedListenerKey implements ListenerKey {
-
-		private String address;
-
-		public PipedListenerKey(String address) {
-			this.address = address;
-		}
-
-		public String address() {
-			return address;
-		}
-
-		public int hashCode() {
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + ((address == null) ? 0 : address.hashCode());
-			return result;
-		}
-
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			PipedListenerKey other = (PipedListenerKey) obj;
-			if (address == null) {
-				if (other.address != null)
-					return false;
-			} else if (!address.equals(other.address))
-				return false;
-			return true;
-		}
-	}
-
-	Map listeners = new HashMap();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#startListening(java.lang.String)
-	 */
-	public synchronized ListenerKey startListening(String address) throws IOException {
-		ListenerKey key = new PipedListenerKey(address == null ? Constants.EMPTY_STRING : address);
-		listeners.put(key, null);
-		return key;
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#stopListening(org.eclipse.wst.jsdt.debug.transport.ListenerKey)
-	 */
-	public void stopListening(ListenerKey key) throws IOException {
-		synchronized (key) {
-			if (listeners.containsKey(key)) {
-				key.notify();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#accept(org.eclipse.wst.jsdt.debug.transport.ListenerKey, long, long)
-	 */
-	public Connection accept(ListenerKey key, long attachTimeout, long handshakeTimeout) throws IOException {
-		long timeout = attachTimeout;
-		if (timeout > 0) {
-			if (timeout > Integer.MAX_VALUE) {
-				timeout = Integer.MAX_VALUE; // approximately 25 days!
-			}
-		}
-
-		synchronized (listeners) {
-			if (!listeners.containsKey(key))
-				throw new IllegalStateException("not listening"); //$NON-NLS-1$
-
-			if (listeners.get(key) != null)
-				throw new IllegalStateException("PipedTransport only accepts one accept at a time"); //$NON-NLS-1$
-
-			PipedInputStream serveris = new PipedInputStream();
-			PipedOutputStream clientos = new PipedOutputStream();
-			serveris.connect(clientos);
-
-			PipedOutputStream serveros = new PipedOutputStream();
-			PipedInputStream clientis = new PipedInputStream();
-			serveros.connect(clientis);
-
-			listeners.put(key, new PipedConnection(clientis, clientos));
-			listeners.notifyAll();
-			long startTime = System.currentTimeMillis();
-			while (true) {
-				try {
-					listeners.wait(timeout);
-				} catch (InterruptedException e) {
-					throw new IOException("accept failed: interrupted"); //$NON-NLS-1$
-				}
-				if (!listeners.containsKey(key))
-					throw new IOException("accept failed: stopped listening"); //$NON-NLS-1$
-
-				if (listeners.get(key) != null) {
-					if (System.currentTimeMillis() - startTime > timeout) {
-						listeners.put(key, null);
-						throw new IOException("accept failed: timed out"); //$NON-NLS-1$
-					}
-					continue;
-				}
-				return new PipedConnection(serveris, serveros);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#attach(java.lang.String, long, long)
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException {
-		ListenerKey key = new PipedListenerKey(address == null ? Constants.EMPTY_STRING : address);
-		Connection connection;
-		long startTime = System.currentTimeMillis();
-		synchronized (listeners) {
-			connection = (Connection) listeners.get(key);
-			while (connection == null) {
-				if (System.currentTimeMillis() - startTime > attachTimeout)
-					throw new IOException("attach failed: timed out"); //$NON-NLS-1$
-				try {
-					listeners.wait(attachTimeout);
-				} catch (InterruptedException e) {
-					throw new IOException("attach failed: interrupted"); //$NON-NLS-1$
-				}
-				connection = (Connection) listeners.get(key);
-			}
-			listeners.put(key, null);
-			listeners.notifyAll();
-		}
-		return connection;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoPacket.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoPacket.java
deleted file mode 100644
index 64335db..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoPacket.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-
-/**
- * Abstract description of a packet for sending / receiving information to the debug client
- * using JSON
- *  
- *  @since 1.0
- */
-abstract public class RhinoPacket implements Packet {
-
-	private final String type;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param type the type for the {@link RhinoPacket} <code>null</code> is not accepted
-	 */
-	protected RhinoPacket(String type) {
-		if(type == null) {
-			throw new IllegalArgumentException("The type for a packet cannot be null"); //$NON-NLS-1$
-		}
-		this.type = type.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json the pre-composed map of attributes for the packet, <code>null</code> is not accepted
-	 */
-	protected RhinoPacket(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException("The JSON map for a packet cannot be null"); //$NON-NLS-1$
-		}
-		String packetType = (String) json.get(JSONConstants.TYPE);
-		this.type = packetType.intern();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#getType()
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = new HashMap();
-		json.put(JSONConstants.TYPE, type);
-		return json;
-	}
-
-	/**
-	 * Returns the type from the given JSON map.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the map is not correctly
-	 * formed.
-	 * 
-	 * @param json the JSON map, <code>null</code> is not accepted
-	 * @return the type from the JSON map or <code>null</code>
-	 */
-	public static String getType(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException("A null JSON map is not allowed when trying to get the packet type"); //$NON-NLS-1$
-		}
-		return (String) json.get(JSONConstants.TYPE);
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("RhinoPacket: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoRequest.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoRequest.java
deleted file mode 100644
index 480d429..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoRequest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Request;
-
-/**
- * Default request implementation using JSON
- * 
- * @since 1.0
- */
-public class RhinoRequest extends RhinoPacket implements Request {
-
-	private final String command;
-	private final Map arguments = Collections.synchronizedMap(new HashMap());
-	private static int currentSequence = 0;
-	private final int sequence;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param command the command, <code>null</code> is not accepted
-	 */
-	public RhinoRequest(String command) {
-		super(JSONConstants.REQUEST);
-		if(command == null) {
-			throw new IllegalArgumentException("The request command kind cannot be null"); //$NON-NLS-1$
-		}
-		this.command = command.intern();
-		this.sequence = nextSequence();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json map of JSON attributes, <code>null</code> is not accepted
-	 */
-	public RhinoRequest(Map json) {
-		super(json);
-		if(json == null) {
-			throw new IllegalArgumentException("The JSON map for a request packet cannot be null"); //$NON-NLS-1$
-		}
-		String packetCommand = (String) json.get(JSONConstants.COMMAND);
-		this.command = packetCommand.intern();
-		Map packetArguments = (Map) json.get(JSONConstants.ARGUMENTS);
-		arguments.putAll(packetArguments);
-		Number packetSeq = (Number) json.get(JSONConstants.SEQ);
-		this.sequence = packetSeq.intValue();
-	}
-
-	/**
-	 * @return a next value for the sequence
-	 */
-	private static synchronized int nextSequence() {
-		return ++currentSequence;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getSequence()
-	 */
-	public int getSequence() {
-		return sequence;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getArguments()
-	 */
-	public Map getArguments() {
-		return arguments;
-	}
-
-	/**
-	 * Sets the given argument in the JSON map.
-	 * 
-	 * @param key the key for the attribute, <code>null</code> is not accepted
-	 * @param argument the value for the argument, <code>null</code> is not accepted
-	 */
-	public void setArgument(String key, Object argument) {
-		if(key == null) {
-			throw new IllegalArgumentException("The argument key cannot be null"); //$NON-NLS-1$
-		}
-		if(argument == null) {
-			throw new IllegalArgumentException("A null argument is not allowed"); //$NON-NLS-1$
-		}
-		arguments.put(key, argument);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.SEQ, new Integer(sequence));
-		json.put(JSONConstants.COMMAND, command);
-		json.put(JSONConstants.ARGUMENTS, arguments);
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("RhinoRequest: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoResponse.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoResponse.java
deleted file mode 100644
index 9d58a7f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoResponse.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * Default {@link RhinoResponse} implementation using JSON
- * 
- * @since 1.0
- */
-public class RhinoResponse extends RhinoPacket implements Response {
-
-	private final String command;
-	private final int requestSequence;
-	private final Map body = Collections.synchronizedMap(new HashMap());
-	private volatile boolean success = true;
-	private volatile boolean running = true;
-	private volatile String message;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param requestSequence the sequence
-	 * @param command the command, <code>null</code> is not accepted
-	 */
-	public RhinoResponse(int requestSequence, String command) {
-		super(JSONConstants.RESPONSE);
-		if(command == null) {
-			throw new IllegalArgumentException("The command string for a response packet cannot be null"); //$NON-NLS-1$
-		}
-		this.requestSequence = requestSequence;
-		this.command = command.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json the JSON map for a response, <code>null</code> is not accepted
-	 */
-	public RhinoResponse(Map json) {
-		super(json);
-		Number packetRequestSeq = (Number) json.get(JSONConstants.REQUEST_SEQ);
-		requestSequence = packetRequestSeq.intValue();
-
-		String packetCommand = (String) json.get(JSONConstants.COMMAND);
-		command = packetCommand.intern();
-
-		Map packetBody = (Map) json.get(JSONConstants.BODY);
-		body.putAll(packetBody);
-
-		Boolean packetSuccess = (Boolean) json.get(JSONConstants.SUCCESS);
-		success = packetSuccess.booleanValue();
-
-		Boolean packetRunning = (Boolean) json.get(JSONConstants.RUNNING);
-		running = packetRunning.booleanValue();
-
-		message = (String) json.get(JSONConstants.MESSAGE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getRequestSequence()
-	 */
-	public int getRequestSequence() {
-		return requestSequence;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getBody()
-	 */
-	public Map getBody() {
-		return body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isSuccess()
-	 */
-	public boolean isSuccess() {
-		return success;
-	}
-
-	/**
-	 * Set the success flag for the response
-	 * 
-	 * @param success the new success flag
-	 */
-	public void setSuccess(boolean success) {
-		this.success = success;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isRunning()
-	 */
-	public boolean isRunning() {
-		return running;
-	}
-
-	/**
-	 * Sets the running state of the underlying command
-	 * 
-	 * @param running the new running state for the underlying command
-	 */
-	public void setRunning(boolean running) {
-		this.running = running;
-	}
-
-	/**
-	 * Returns the status message for this {@link RhinoResponse}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the status message for this {@link RhinoResponse} or <code>null</code>
-	 */
-	public String getMessage() {
-		return message;
-	}
-
-	/**
-	 * Set the status message for this {@link RhinoResponse}
-	 * 
-	 * @param message the new message, <code>null</code> is accepted
-	 */
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.REQUEST_SEQ, new Integer(requestSequence));
-		json.put(JSONConstants.COMMAND, command);
-		json.put(JSONConstants.BODY, body);
-		json.put(JSONConstants.SUCCESS, new Boolean(success));
-		json.put(JSONConstants.RUNNING, new Boolean(running));
-		if (message != null) {
-			json.put(JSONConstants.MESSAGE, message);
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("RhinoResponse: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoSocketConnection.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoSocketConnection.java
deleted file mode 100644
index f3d7a00..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoSocketConnection.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-
-/**
- * A specialized {@link Connection} that communicates using {@link Socket}s
- * 
- * @since 1.0
- */
-public class RhinoSocketConnection extends SocketConnection {
-
-	/**
-	 * Constructor
-	 * 
-	 * @param socket the underlying {@link Socket}, <code>null</code> is not accepted
-	 * 
-	 * @throws IOException
-	 */
-	public RhinoSocketConnection(Socket socket) throws IOException {
-		super(socket);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String jsonString = JSONUtil.write(packet.toJSON());
-		String count = Integer.toString(jsonString.length());
-		Writer writer = getWriter();
-		writer.write(count);
-		writer.write('\r');
-		writer.write('\n');
-		writer.write(jsonString);
-		writer.flush();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		if(!isOpen()) {
-			throw new IOException("Failed to read more packets: the socket is closed"); //$NON-NLS-1$
-		}
-		StringBuffer buffer = new StringBuffer();
-		int c;
-		Reader reader = getReader();
-		while ((c = reader.read()) != -1) {
-			if (c == '\r')
-				break;
-			buffer.append((char) c);
-			if (buffer.length() > 10) {
-				throw new IOException("Invalid content length: " + buffer.toString()); //$NON-NLS-1$
-			}
-		}
-
-		int length = 0;
-		try {
-			length = Integer.parseInt(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw new IOException("Failed to parse content length: " + buffer.toString()); //$NON-NLS-1$
-		}
-		if ('\r' != c || '\n' != (char) reader.read())
-			throw new IOException("Missing CRLF after content length"); //$NON-NLS-1$
-
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0)
-				throw new EOFException();
-			n += count;
-		}
-		Map json = (Map) JSONUtil.read(new String(message));
-		String type = RhinoPacket.getType(json);
-		if (EventPacket.TYPE.equals(type))
-			return new EventPacket(json);
-		if (JSONConstants.REQUEST.equals(type))
-			return new RhinoRequest(json);
-		if (JSONConstants.RESPONSE.equals(type))
-			return new RhinoResponse(json);
-
-		throw new IOException("Unknown packet type: " + type); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoTransportService.java
deleted file mode 100644
index 8d7c4b7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoTransportService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService;
-
-/**
- * Implementation of a transport service that using a {@link Socket} for communication
- * 
- * @since 1.0
- */
-public class RhinoTransportService extends SocketTransportService {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#getConnection(java.net.Socket)
-	 */
-	public SocketConnection getConnection(Socket socket) throws IOException {
-		return new RhinoSocketConnection(socket);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAccept(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAccept(Connection connection) throws IOException {
-		Packet packet = connection.readPacket();
-		if (packet instanceof RhinoRequest) {
-			RhinoRequest request = (RhinoRequest) packet;
-			if (!request.getCommand().equals(JSONConstants.CONNECT)) {
-				throw new IOException("failure establishing connection"); //$NON-NLS-1$
-			}
-			RhinoResponse response = new RhinoResponse(request.getSequence(), request.getCommand());
-			connection.writePacket(response);
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAttach(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAttach(Connection connection) throws IOException {
-		RhinoRequest request = new RhinoRequest(JSONConstants.CONNECT);
-		connection.writePacket(request);
-		Packet packet = connection.readPacket();
-		if (packet instanceof RhinoResponse) {
-			RhinoResponse response = (RhinoResponse) packet;
-			if (!response.getCommand().equals(JSONConstants.CONNECT) || response.getRequestSequence() != request.getSequence() || !response.isSuccess() || !response.isRunning()) {
-				throw new IOException("failure establishing connection"); //$NON-NLS-1$
-			}
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties
deleted file mode 100644
index 432ac35..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-failure_establishing_connection=failure establishing connection
-runtime_disconnected=Runtime disconnected
-time_out_waiting_for_command_packet=Time out waiting for command packet for: {0}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java
deleted file mode 100644
index 019e95a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.rhino.debugger;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.debugger.RhinoDebuggerImpl;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextFactory;
-
-/**
- * Rhino debugger
- * 
- * @since 1.0
- */
-public final class RhinoDebugger implements ContextFactory.Listener {
-	
-	/**
-	 * Delegate debugger
-	 */
-	private RhinoDebuggerImpl impl;
-
-	/**
-	 * This constructor will only accept a <code>transport</code> argument
-	 * of <code>socket</code>. I.e. <code>transport=socket</code>.
-	 * 
-	 * @param configString the configuration string, for example: <code>transport=socket,suspend=y,address=9000</code>
-	 */
-	public RhinoDebugger(String configString) {
-		impl = new RhinoDebuggerImpl(configString);
-	}
-	
-	/**
-	 * Starts the debugger
-	 * 
-	 * @throws Exception if the debugger could not start
-	 */
-	public void start() throws Exception {
-		impl.start();
-	}
-
-	/**
-	 * Stops the debugger
-	 */
-	public void stop() throws Exception {
-		impl.stop();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextCreated(org.mozilla.javascript.Context)
-	 */
-	public void contextCreated(Context context) {
-		impl.contextCreated(context);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextReleased(org.mozilla.javascript.Context)
-	 */
-	public void contextReleased(Context context) {
-		impl.contextReleased(context);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugMain.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugMain.java
deleted file mode 100644
index bb19337..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugMain.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.rhino.debugger.shell;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.debugger.RhinoDebuggerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoTransportService;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextAction;
-import org.mozilla.javascript.Kit;
-import org.mozilla.javascript.Script;
-import org.mozilla.javascript.Scriptable;
-import org.mozilla.javascript.ScriptableObject;
-import org.mozilla.javascript.tools.ToolErrorReporter;
-import org.mozilla.javascript.tools.shell.Main;
-
-/**
- * A proxy to running {@link Main} that allows us to run a batch of scripts without using the 
- * <code>-e load(...)</code> arguments. As well any argument not paired to a known kind (see below) will be considered
- * as an absolute path to a script (*.js) file.
- * <br><br>
- * This runner supports the following:
- * <ul>
- * <li><code>-debug</code> to have the interpreter generate debugging tracing</li>
- * <li><code>-e [script_src]</code> to evaluate the following argument as a script</li>
- * <li><code>-encoding</code> to set the character encoding to use</li>
- * <li><code>-f [absolute_file_paths]</code> to specify one or more *.js files to evaluate. This argument differs
- * from the Rhino {@link Main} one, in that any following arguments will be treated as absolute
- * paths to script (*.js) files.</li>
- * <li><code>-fatal-warnings</code> to have all warnings are treated as error</li>
- * <li><code>-help</code> or <code>-?</code>, to pretty-print the available commands</li>
- * <li><code>-opt</code> or <code>-O</code> to set the optimization level. Where available levels are -1 (interpret only), 0 (none), 1-9 (all optimizations)</li>
- * <li><code>-port [port]</code> to set the port to communicate on</li>
- * <li><code>-sealedlib</code> to set the standard libraries as sealed - meaning they cannot be modified by any evaluating script(s)</li>
- * <li><code>-strict</code> to set the interpreter in strict mode and report all warnings</li>
- * <li><code>-suspend</code> to set if the debugger should start suspended and wait for a client to connect before continuing</li>
- * <li><code>-trace</code> to enabled debugger tracing</li>
- * <li><code>-version [version_number]</code>, where <code>version_number</code> is one of: 100, 110, 120, 130, 140, 150, 160, 170</li>
- * <li><code>-w</code> to report warnings</li>
- * </ul>
- * <br>
- * The following examples assume you have properly set up your classpath to reference <code>org.mozilla.javascript.jar</code>,
- * <code>org.eclipse.wst.jsdt.debug.rhino.debugger.jar</code> and <code>org.eclipse.wst.jsdt.debug.transport</code>. Also the 
- * fully qualified name use to run DebugMain is <code>org.eclipse.wst.jsdt.debug.rhino.debugger.shell.DebugMain</code>
- * Examples
- * <br><br>
- * <code>%>java DebugMain -opt 7 -strict -f /home/user/scripts/a.js /home/user/scripts/b.js -version 170</code>
- * <code>%> java DebugMain -version 140 -e load('/home/user/scripts/a.js','/home/user/scripts/b.js')</code>
- * @since 1.1
- */
-public class DebugMain {
-
-	/**
-	 * Class to run an evaluated script when using <code>-e</code>
-	 */
-	static class Evaluator implements ContextAction {
-		String scriptsrc = null;
-		String[] scripts = null;
-		
-		/* (non-Javadoc)
-		 * @see org.mozilla.javascript.ContextAction#run(org.mozilla.javascript.Context)
-		 */
-		public Object run(Context cx) {
-			if(scriptsrc == null && scripts == null) {
-				throw Kit.codeBug();
-			}
-			if(scriptsrc != null) {
-				Script script = Main.loadScriptFromSource(cx, scriptsrc, FROM_EVAL, 0, null);
-				if(script != null) {
-					Main.evaluateScript(script, cx, Main.getGlobal());
-				}
-			}
-			Object[] array = new Object[scripts.length];
-	        System.arraycopy(scripts, 0, array, 0, scripts.length);
-			Scriptable argsObj = cx.newArray(Main.global, array);
-	        Main.global.defineProperty(GLOBAL_ARGUMENTS, argsObj, ScriptableObject.DONTENUM);
-	        for (int i = 0; i < scripts.length; i++) {
-				Main.processFile(cx, Main.global, scripts[i]);
-			}
-			return null; 
-		}
-		
-		void reset() {
-			scriptsrc = null;
-			scripts = null;
-		}
-	}
-	
-	/**
-	 * Constant representing the debug argument
-	 * <br><br>
-	 * Value is: <code>-debug</code>
-	 */
-	public static final String ARG_DEBUG = "-debug"; //$NON-NLS-1$
-	/**
-	 * Constant representing the evaluate argument
-	 * <br><br>
-	 * Value is: <code>-e</code>
-	 */
-	public static final String ARG_E = "-e"; //$NON-NLS-1$
-	/**
-	 * Constant representing the encoding argument
-	 * <br><br>
-	 * Value is: <code>-encoding</code>
-	 */
-	public static final String ARG_ENCODING = "-encoding"; //$NON-NLS-1$
-	/**
-	 * Constant representing the script file(s) argument
-	 * <br><br>
-	 * Value is: <code>-f</code>
-	 */
-	public static final String ARG_F = "-f"; //$NON-NLS-1$
-	/**
-	 * Constant representing the fatal-warnings argument
-	 * <br><br>
-	 * Value is: <code>-fatal-warnings</code>
-	 */
-	public static final String ARG_FATAL_WARNINGS = "-fatal-warnings"; //$NON-NLS-1$
-	/**
-	 * Constant representing the help argument
-	 * <br><br>
-	 * Value is: <code>-help</code>
-	 */
-	public static final String ARG_HELP = "-help"; //$NON-NLS-1$
-	/**
-	 * Constant representing the optimization argument
-	 * <br><br>
-	 * Value is: <code>-O</code>
-	 */
-	public static final String ARG_O = "-O"; //$NON-NLS-1$
-	/**
-	 * Constant representing the optimization argument
-	 * <br><br>
-	 * Value is: <code>-opt</code>
-	 */
-	public static final String ARG_OPT = "-opt"; //$NON-NLS-1$
-	/**
-	 * Constant representing the help argument
-	 * <br><br>
-	 * Value is: <code>-?</code>
-	 */
-	public static final String ARG_QM = "-?"; //$NON-NLS-1$
-	/**
-	 * Constant representing the sealed lib argument
-	 * <br><br>
-	 * Value is: <code>-sealedlib</code>
-	 */
-	public static final String ARG_SEALEDLIB = "-sealedlib"; //$NON-NLS-1$
-	/**
-	 * Constant representing the strict argument
-	 * <br><br>
-	 * Value is: <code>-strict</code>
-	 */
-	public static final String ARG_STRICT = "-strict"; //$NON-NLS-1$
-	/**
-	 * Constant representing the version argument
-	 * <br><br>
-	 * Value is: <code>-version</code>
-	 */
-	private static final String ARG_VERSION = "-version"; //$NON-NLS-1$
-	/**
-	 * Constant representing the report warnings argument
-	 * <br><br>
-	 * Value is: <code>-w</code>
-	 */
-	public static final String ARG_W = "-w"; //$NON-NLS-1$
-	/**
-	 * Constant representing the invalid message identifier for {@link Main}
-	 * <br><br>
-	 * Value is: <code>msg.shell.invalid</code>
-	 */
-	public static final String MSG_SHELL_INVALID = "msg.shell.invalid"; //$NON-NLS-1$
-	/**
-	 * Constant representing the invalid usage message identifier for {@link Main}
-	 * <br><br>
-	 * Value is: <code>msg.shell.usage</code>
-	 */
-	public static final String MSG_SHELL_USAGE = "msg.shell.usage"; //$NON-NLS-1$
-	/**
-	 * Copy from {@link Main} to specify as the path when evaluating a script via the <code>-e</code> argument
-	 * <br><br>
-	 * Value is: <code>&lt;command&gt;</code>
-	 */
-	public static final String FROM_EVAL = "<command>"; //$NON-NLS-1$
-	/**
-	 * Constant representing the name of the array containing the original script arguments in the global context
-	 * <br><br>
-	 * Value is: <code>arguments</code>
-	 */
-	public static final String GLOBAL_ARGUMENTS = "arguments"; //$NON-NLS-1$
-
-	private static Evaluator evaluate = new Evaluator();
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		ToolErrorReporter reporter = new ToolErrorReporter(true);
-		Main.shellContextFactory.setErrorReporter(reporter);
-		startDebugger(args);
-		ArrayList scripts = new ArrayList();
-		processArgs(args, scripts, reporter);
-		if(scripts.size() > 0) {
-			checkGlobal();
-			evaluate.reset();
-			evaluate.scripts = (String[]) scripts.toArray(new String[scripts.size()]);
-			Main.shellContextFactory.call(evaluate);
-		}
-	}
-
-	static void startDebugger(String[] args) {
-		String port = DebugShell.DEFAULT_PORT;
-		boolean suspend = false, 
-		        trace = false;
-		for (int i = 0; i < args.length; i++) {
-			if (DebugShell.ARG_PORT.equals(args[i])) {
-    			port = args[++i];
-    		} 
-			else if (DebugShell.ARG_SUSPEND.equals(args[i])) {
-				suspend = DebugShell.isSuspend(args[++i]);
-    		}
-    		else if(DebugShell.ARG_TRACE.equals(args[i])) {
-    			trace = Boolean.valueOf(args[++i]).booleanValue();
-    		}
-		}
-		TransportService service = new RhinoTransportService();
-		RhinoDebuggerImpl debugger = new RhinoDebuggerImpl(service, port, suspend, trace);
-		try {
-			debugger.start();
-			Main.shellContextFactory.addListener(debugger);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-	
-	/**
-	 * Walks over the original argument list and sets the corresponding arguments in Rhino
-	 * 
-	 * @param originalargs
-	 * @param scriptcollector
-	 * @param reporter
-	 */
-	static void processArgs(String[] originalargs, List scriptcollector, ToolErrorReporter reporter) {
-		try {
-			for (int i = 0; i < originalargs.length; i++) {
-				String arg = originalargs[i];
-	    		if(ARG_DEBUG.equals(arg)) {
-					Main.shellContextFactory.setGeneratingDebug(true);
-				}
-				else if(ARG_E.equals(arg)) {
-					peekArg(originalargs, i, false);
-					checkGlobal();
-	                evaluate.scriptsrc = originalargs[++i];
-	                Main.shellContextFactory.call(evaluate);
-				}
-				else if(ARG_ENCODING.equals(arg)) {
-					peekArg(originalargs, i, false);
-	                String enc = originalargs[++i];
-	                Main.shellContextFactory.setCharacterEncoding(enc);
-	            }
-				else if (ARG_F.equals(arg)) {
-	                peekArg(originalargs, i, false);
-	                String script = originalargs[++i];
-	                try {
-		                do {
-		                	scriptcollector.add(script);
-		                	peekArg(originalargs, i, false);
-		                	script = originalargs[++i];
-		                } while(true);
-	                }
-	                catch(IllegalArgumentException iae) {
-	                	//do nothing, we are done collecting
-	                }
-	            }
-				else if (ARG_FATAL_WARNINGS.equals(arg)) {
-	                Main.shellContextFactory.setWarningAsError(true);
-	            }
-				else if (ARG_QM.equals(arg) || ARG_HELP.equals(arg)) {
-	                Main.global.getOut().println(ToolErrorReporter.getMessage(MSG_SHELL_USAGE, Main.class.getName()));
-	                System.exit(1);
-		        }
-				else if(ARG_VERSION.equals(arg)) {
-	            	peekArg(originalargs, i, false);
-	                int version;
-	                try {
-	                    version = Integer.parseInt(originalargs[++i]);
-	                } catch (NumberFormatException ex) {
-	                    throw new IllegalArgumentException(originalargs[i]);
-	                }
-	                if (!Context.isValidLanguageVersion(version)) {
-	                	 throw new IllegalArgumentException(originalargs[i]);
-	                }
-	                Main.shellContextFactory.setLanguageVersion(version);
-	            }
-				else if (ARG_OPT.equals(arg) || ARG_O.equals(arg)) {
-					peekArg(originalargs, i, true);
-	                int opt;
-	                try {
-	                    opt = Integer.parseInt(originalargs[++i]);
-	                } catch (NumberFormatException ex) {
-	                   throw new IllegalArgumentException(originalargs[i]);
-	                }
-	                if (opt == -2) {
-	                    // Compatibility with Cocoon Rhino fork
-	                    opt = -1;
-	                } else if (!Context.isValidOptimizationLevel(opt)) {
-	                	throw new IllegalArgumentException(originalargs[i]);
-	                }
-	                Main.shellContextFactory.setOptimizationLevel(opt);
-	            }
-				else  if (ARG_SEALEDLIB.equals(arg)) {
-	            	Main.global.setSealedStdLib(true);
-	            }
-				else if (ARG_STRICT.equals(arg)) {
-	                Main.shellContextFactory.setStrictMode(true);
-	                reporter.setIsReportingWarnings(true);
-	            }
-				else if (ARG_W.equals(arg)) {
-	                reporter.setIsReportingWarnings(true);
-	            }
-			}
-		}
-		catch(IllegalArgumentException iae) {
-			Main.global.getOut().println(ToolErrorReporter.getMessage(MSG_SHELL_INVALID, iae.getMessage()));
-	        Main.global.getOut().println(ToolErrorReporter.getMessage(MSG_SHELL_USAGE, Main.class.getName()));
-	        System.exit(1);
-		}
-	}
-	
-	/**
-	 * Checks to see if the global context has been initialized, if not, it is initialized
-	 */
-	static void checkGlobal() {
-		if(!Main.global.isInitialized()) {
-        	Main.global.init(Main.shellContextFactory);
-        }
-	}
-	
-	/**
-	 * peeks at the next argument entry to see if it exists and is not another <code>-&lt;arg&gt;</code>
-	 * @param args
-	 * @param idx
-	 * @param ignoreswitch
-	 * @throws IllegalArgumentException if the next argument is not valid
-	 */
-	static void peekArg(String[] args, int idx, boolean ignoreswitch) throws IllegalArgumentException {
-		if((idx+1 < args.length)) {
-			if(!args[idx+1].startsWith("-") || ignoreswitch) { //$NON-NLS-1$
-				return;
-			}
-		}
-		throw new IllegalArgumentException(args[idx]);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java
deleted file mode 100644
index 6741692..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.rhino.debugger.shell;
-
-import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.debugger.RhinoDebuggerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoTransportService;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-import org.mozilla.javascript.tools.shell.Main;
-
-/**
- * Entry point for launching a Rhino debugger
- * 
- * @since 1.0
- */
-public final class DebugShell {
-	
-    /**
-	 * Constant representing the default port
-	 * <br><br>
-	 * Value is: <code>9888</code>
-	 */
-	public static final String DEFAULT_PORT = "9888"; //$NON-NLS-1$
-	/**
-	 * Constant representing the trace argument
-	 * <br><br>
-	 * Value is: <code>-trace</code>
-	 */
-	public static final String ARG_TRACE = "-trace"; //$NON-NLS-1$
-	/**
-	 * Constant representing the suspend argument
-	 * <br><br>
-	 * Value is: <code>-suspend</code>
-	 */
-	public static final String ARG_SUSPEND = "-suspend"; //$NON-NLS-1$
-	/**
-	 * Constant representing the port argument
-	 * <br><br>
-	 * Value is: <code>-port</code>
-	 */
-	public static final String ARG_PORT = "-port"; //$NON-NLS-1$
-
-	public static void main(String args[]) {
-    	
-    	String port = DEFAULT_PORT;
-    	boolean suspend = false;
-    	boolean trace = true;
-    	
-    	ArrayList argList = new ArrayList();
-    	for (int i = 0; i < args.length; i++) {
-    		String arg = args[i];
-    		if (ARG_PORT.equals(arg)) {
-    			port = args[++i];
-    			continue;
-    		} else if (ARG_SUSPEND.equals(arg)) {
-    			suspend = isSuspend(args[++i]);
-    			continue;
-    		}
-    		else if(ARG_TRACE.equals(arg)) {
-    			trace = Boolean.valueOf(args[++i]).booleanValue();
-    			continue;
-    		}
-    		//forward all other args to Rhino
-    		argList.add(arg);
-		}
-    	String[] newArgs = (String[]) argList.toArray(new String[0]); 
-    	
-		TransportService service = new RhinoTransportService();
-		RhinoDebuggerImpl debugger = new RhinoDebuggerImpl(service, port, suspend, trace);
-		try {
-			if(trace) {
-				prettyPrintHeader(suspend, port);
-			}
-			debugger.start();
-			Main.shellContextFactory.addListener(debugger);
-			Main.exec(newArgs);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-    }
-	
-	/**
-	 * Pretty print the header for the debugger
-	 * 
-	 * @since 1.1
-	 */
-	static void prettyPrintHeader(boolean suspended, String port) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Rhino debugger\n"); //$NON-NLS-1$
-		buffer.append("Start at time: ").append(getStartAtDate()); //$NON-NLS-1$
-		buffer.append("\nListening to socket on"); //$NON-NLS-1$
-		buffer.append("port: ").append(port); //$NON-NLS-1$
-		if (suspended) {
-			buffer.append("\nStarted suspended - waiting for client resume..."); //$NON-NLS-1$
-		}
-		System.out.println(buffer.toString());
-	}
-	
-	/**
-	 * Returns the formatted date
-	 * 
-	 * @return the formatted date
-	 * @see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4981314
-	 * @since 1.1
-	 */
-	static String getStartAtDate() {
-		try {
-			return DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(Calendar.getInstance().getTime());
-		} catch (Throwable t) {
-			return "<unknown>"; //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Returns if the given argument should suspend 
-	 * @param arg
-	 * @return <code>true</code> if the argument is "true" or "y"
-	 */
-	public static boolean isSuspend(String arg) {
-		return Boolean.valueOf(arg).booleanValue() || 
-		       "y".equals(arg.toLowerCase());  //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath b/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.project b/bundles/org.eclipse.wst.jsdt.debug.rhino/.project
deleted file mode 100644
index 742a9ed..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.rhino</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF
deleted file mode 100644
index 77e1078..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,28 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-Vendor: %providerName
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.rhino;singleton:=true
-Bundle-Version: 1.0.100.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="3.6.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.internal.rhino;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui"
-Import-Package: org.eclipse.debug.core.model,
- org.eclipse.wst.jsdt.debug.core.breakpoints,
- org.eclipse.wst.jsdt.debug.core.jsdi,
- org.eclipse.wst.jsdt.debug.core.jsdi.connect,
- org.eclipse.wst.jsdt.debug.core.jsdi.event,
- org.eclipse.wst.jsdt.debug.core.jsdi.request,
- org.eclipse.wst.jsdt.debug.core.model,
- org.eclipse.wst.jsdt.debug.internal.rhino.transport,
- org.eclipse.wst.jsdt.debug.transport,
- org.eclipse.wst.jsdt.debug.transport.exception,
- org.eclipse.wst.jsdt.debug.transport.packet,
- org.eclipse.wst.jsdt.debug.transport.socket
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index c787bbd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName = Eclipse Web Tools Platform
-Bundle-Name = Rhino JavaScript Debug
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html b/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties
deleted file mode 100644
index c1711a9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties
-src.includes = about.html
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml
deleted file mode 100644
index 59d383e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?><!--
-    Copyright (c) 2009 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-   
-    Contributors:
-        IBM Corporation - initial API and implementation
- -->
-
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.RhinoAttachingConnector"
-            id="rhino.attaching.connector">
-      </connector>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.breakpointParticipants">
-      <participant
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints.RhinoBreakpointParticipant"
-            kind="*">
-      </participant>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.RhinoPreferenceInitializer">
-      </initializer>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java
deleted file mode 100644
index a12a140..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino;
-
-/**
- * Collection of constants used in Rhino
- * 
- * @since 1.0
- */
-public interface Constants {
-
-//############## GENERAL ####################
-	public static final String SPACE = " "; //$NON-NLS-1$
-	public static String URI_FILE_SCHEME = "file"; //$NON-NLS-1$
-	public static String STD_IN = "stdin"; //$NON-NLS-1$
-	public static String STD_IN_URI = "<stdin>"; //$NON-NLS-1$
-	
-//############## PREFERENCES ################
-	public static String SUSPEND_ON_STDIN_LOAD = RhinoDebugPlugin.PLUGIN_ID + ".suspend_on_stdin_load"; //$NON-NLS-1$
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java
deleted file mode 100644
index 64b62af..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * 
- * @since 1.0
- */
-public class RhinoDebugPlugin extends Plugin {
-
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	/**
-	 * The ID of the bundle<br>
-	 * <br>
-	 * value is: <code>org.eclipse.wst.jsdt.debug.core</code>
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.rhino"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance
-	 */
-	private static RhinoDebugPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public RhinoDebugPlugin() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static RhinoDebugPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Rhino Debug: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from Rhino Debug: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-	
-	/**
-	 * Creates a new {@link URI} with the <code>file</code> scheme
-	 * @param path
-	 * @return a new {@link URI}
-	 * @throws URISyntaxException
-	 */
-	public static URI fileURI(IPath path) throws URISyntaxException {
-		return new URI(Constants.URI_FILE_SCHEME, null, path.makeAbsolute().toString(), null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java
deleted file mode 100644
index af9a967..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Initializes the preferences for Rhino
- * 
- * @since 1.0
- */
-public class RhinoPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * Constructor
-	 */
-	public RhinoPreferenceInitializer() {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IEclipsePreferences defaultscope = new DefaultScope().getNode(RhinoDebugPlugin.PLUGIN_ID);
-		defaultscope.putBoolean(Constants.SUSPEND_ON_STDIN_LOAD, false);
-		try {
-			defaultscope.flush();
-		} catch (BackingStoreException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java
deleted file mode 100644
index 8589683..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-
-/**
- * Handles all of the core Rhino preferences - allows easy access to a variety of preferences
- * and tracks changes to those preferences.
- * 
- * @since 1.0
- */
-public class RhinoPreferencesManager implements IPreferenceChangeListener {
-
-	/**
-	 * Starts the manager
-	 */
-	public void start() {
-		IEclipsePreferences node = new InstanceScope().getNode(RhinoDebugPlugin.PLUGIN_ID);
-		if(node != null) {
-			node.addPreferenceChangeListener(this);
-		}
-		else {
-			//our preference node is bogus report the status
-			RhinoDebugPlugin.logErrorMessage("The Rhino core preference node could not loaded"); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Stops the manager and frees any resources held
-	 */
-	public void stop() {
-		IEclipsePreferences node = new InstanceScope().getNode(RhinoDebugPlugin.PLUGIN_ID);
-		if(node != null) {
-			node.removePreferenceChangeListener(this);
-		}
-		else {
-			//our preference node is bogus report the status
-			RhinoDebugPlugin.logErrorMessage("The Rhino core preference node could not loaded"); //$NON-NLS-1$
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent)
-	 */
-	public void preferenceChange(PreferenceChangeEvent event) {
-	}
-
-	/**
-	 * Returns if we should be suspending on script load events from stdin - i.e. from the Rhino console.
-	 * 
-	 * @return <code>true</code> if we should suspend on a script load for stdin, <code>false</code> otherwise
-	 */
-	public static boolean suspendOnStdinLoad() {
-		return Platform.getPreferencesService().getBoolean(RhinoDebugPlugin.PLUGIN_ID, Constants.SUSPEND_ON_STDIN_LOAD, false, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java
deleted file mode 100644
index f11f18a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoPreferencesManager;
-
-/**
- * Participant for Rhino
- * 
- * @since 1.0
- */
-public class RhinoBreakpointParticipant implements IJavaScriptBreakpointParticipant {
-
-	/**
-	 * Constructor
-	 */
-	public RhinoBreakpointParticipant() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#breakpointHit(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint) {
-		try {
-			if(breakpoint instanceof IJavaScriptLineBreakpoint) {
-				IJavaScriptLineBreakpoint lbp = (IJavaScriptLineBreakpoint) breakpoint;
-				String condition = lbp.getCondition();
-				if (condition != null) {
-					// evaluate it
-					if (thread.getFrameCount() < 1) {
-						return DONT_SUSPEND;
-					}
-					IJavaScriptValue value = thread.evaluate(condition);
-					if (lbp.isConditionSuspendOnTrue()) {
-						if(suspendForValue(value)) {
-							return SUSPEND;
-						}
-					} 
-					if(!suspendForValue(value)) {
-						return SUSPEND; 
-					}
-				}
-				return SUSPEND;
-			}
-		} 
-		catch (CoreException ce) {
-			//ignore, just don't suspend
-		}
-		return DONT_SUSPEND;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#scriptLoaded(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint) {
-		String seg = URIUtil.lastSegment(script.sourceURI());
-		if(seg != null && seg.equals(Constants.STD_IN) && !RhinoPreferencesManager.suspendOnStdinLoad()) {
-			return DONT_SUSPEND;
-		}
-		return SUSPEND;
-	}
-	
-	/**
-	 * If the thread should suspend based on the given {@link Value}. Currently only suspend when the value is non-null and a {@link BooleanValue} that has the value <code>true</code>
-	 * 
-	 * @param value
-	 * @return if we should suspend
-	 */
-	private boolean suspendForValue(IJavaScriptValue value) {
-		if(value instanceof IJavaScriptPrimitiveValue) {
-			return ((IJavaScriptPrimitiveValue)value).booleanValue();
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java
deleted file mode 100644
index 061e2fd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Rhino implementation of {@link ArrayReference}
- * 
- * @see ArrayReference
- * @see ObjectReferenceImpl
- * @since 1.0
- */
-public class ArrayReferenceImpl extends ObjectReferenceImpl implements ArrayReference {
-
-	/**
-	 * Empty array
-	 */
-	protected static final Value[] NO_VALUES = new Value[0];
-
-	/**
-	 * Raw list of {@link Value}s
-	 */
-	private ArrayList values = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param stackFrameImpl
-	 * @param body
-	 */
-	public ArrayReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl stackFrameImpl) {
-		super(vm, body, stackFrameImpl);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValue(int)
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException {
-		Value value = (Value) getValues().get(index);
-		if (value == null) {
-			return vm.mirrorOfNull();
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValues()
-	 */
-	public synchronized List getValues() {
-		if (values == null) {
-			Map members = new HashMap();
-			int length = 0;
-			for (Iterator iter = properties().iterator(); iter.hasNext();) {
-				Property property = (Property) iter.next();
-				if (Character.isDigit(property.name().charAt(0))) {
-					members.put(Integer.valueOf(property.name()), property.value());
-				} else if (property.name().equals("length")) { //$NON-NLS-1$
-					length = Integer.parseInt(property.value().valueString());
-				}
-			}
-			values = new ArrayList(length);
-			for (int i = 0; i < length; i++) {
-				Object value = members.get(new Integer(i));
-				if (value == null) {
-					value = new UndefinedValueImpl(vm);
-				}
-				values.add(value);
-			}
-		}
-		return values;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#length()
-	 */
-	public int length() {
-		return getValues().size();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#
-	 * valueString()
-	 */
-	public String valueString() {
-		return "Array"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#toString
-	 * ()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(NLS.bind(Messages.ArrayReferenceImpl_array_count_, new String[] {Integer.toString(length()) }));
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java
deleted file mode 100644
index 2481c59..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link BooleanValue}
- * 
- * @since 1.0
- */
-public class BooleanValueImpl extends MirrorImpl implements BooleanValue {
-
-	private Boolean value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public BooleanValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (Boolean) body.get(JSONConstants.VALUE));
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param bool
-	 */
-	public BooleanValueImpl(VirtualMachineImpl vm, Boolean bool) {
-		super(vm);
-		this.value = bool;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return value.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return (value.booleanValue() ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return value.booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return value.toString();
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java
deleted file mode 100644
index 16817ac..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link FunctionReference}
- * 
- * @see FunctionReference
- * @see ObjectReferenceImpl
- * @since 1.0
- */
-public class FunctionReferenceImpl extends ObjectReferenceImpl implements FunctionReference {
-
-	private String functionName;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 * @param stackFrameImpl
-	 */
-	public FunctionReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl stackFrameImpl) {
-		super(vm, body, stackFrameImpl);
-		this.functionName = (String) body.get(JSONConstants.NAME);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionName()
-	 */
-	public String functionName() {
-		return functionName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#valueString()
-	 */
-	public String valueString() {
-		return "Function"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionBody()
-	 */
-	public String functionBody() {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java
deleted file mode 100644
index 22be41c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Comparator;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Rhino implementation of {@link Location}
- * 
- * @since 1.0
- */
-public class LocationImpl extends MirrorImpl implements Location {
-	
-	/**
-	 * Comparator that orders {@link Location}s by line number - useful for debugging
-	 */
-	static class LocationComparator implements Comparator {
-		/* (non-Javadoc)
-		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-		 */
-		public int compare(Object o1, Object o2) {
-			int value = -1;
-			if(o1 instanceof Location && o2 instanceof Location) {
-				int first = ((Location)o1).lineNumber();
-				int second = ((Location)o2).lineNumber(); 
-				if(first == second) {
-					value = 0;
-				}
-				else if(first > second) {
-					value = 1;
-				}
-			}
-			return value;
-		}
-		
-	}
-	private static LocationComparator comparator = new LocationComparator();
-	private String functionName;
-	private int lineNumber;
-	private ScriptReferenceImpl scriptReference;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param functionName
-	 * @param lineNumber
-	 * @param scriptReference
-	 */
-	public LocationImpl(VirtualMachineImpl vm, String functionName, int lineNumber, ScriptReferenceImpl scriptReference) {
-		super(vm);
-		this.functionName = functionName;
-		this.lineNumber = lineNumber;
-		this.scriptReference = scriptReference;
-	}
-
-	static LocationComparator getLocationComparator() {
-		return comparator;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#functionName()
-	 */
-	public String functionName() {
-		return functionName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#lineNumber()
-	 */
-	public int lineNumber() {
-		return lineNumber;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#scriptReference()
-	 */
-	public ScriptReference scriptReference() {
-		return scriptReference;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("LocationImpl: "); //$NON-NLS-1$
-		buffer.append("[script - ").append(scriptReference.sourceURI()).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[function - ").append(functionName).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[line - ").append(lineNumber).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java
deleted file mode 100644
index ff82d7c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.messages"; //$NON-NLS-1$
-	public static String ArrayReferenceImpl_array_count_;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java
deleted file mode 100644
index 1d15e66..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Rhino implementation of {@link Mirror}
- * 
- * @since 1.0
- */
-public class MirrorImpl implements Mirror {
-
-	protected final VirtualMachineImpl vm;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param description
-	 */
-	public MirrorImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-	}
-
-	/**
-	 * This constructor is only to be used by {@link VirtualMachineImpl}. The name 
-	 * field is not store anywhere or used in any way.
-	 * 
-	 * @param name
-	 * @noreference This constructor is not intended to be referenced by clients.
-	 */
-	public MirrorImpl(String name) {
-		vm = (VirtualMachineImpl)this;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-	
-	/**
-	 * Re-throws the given exception as a {@link RuntimeException} with the given message
-	 * @param message
-	 * @param t
-	 * @since 1.1
-	 */
-	protected void handleException(String message, Throwable t) {
-		throw new RuntimeException(message, t);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java
deleted file mode 100644
index be4da9c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-
-/**
- * Rhino implementation of {@link NullValue}
- * 
- * @since 1.0
- */
-public final class NullValueImpl extends MirrorImpl implements NullValue {
-
-	static final String NULL_VALUE = "Null"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param description
-	 */
-	public NullValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return NULL_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java
deleted file mode 100644
index 6bb6842..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link NumberValue}
- * 
- * @since 1.0
- */
-public class NumberValueImpl extends MirrorImpl implements NumberValue {
-
-	/**
-	 * The underlying value
-	 */
-	private Number value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public NumberValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (Number) body.get(JSONConstants.VALUE));
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param number
-	 */
-	public NumberValueImpl(VirtualMachineImpl vm, Number number) {
-		super(vm);
-		this.value = number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#value()
-	 */
-	public Number value() {
-		return value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#isNaN()
-	 */
-	public boolean isNaN() {
-		return value == null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return JavaScriptDebugModel.numberToString(value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return value.intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return value.doubleValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return (value.intValue() > 0 ? true : false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return JavaScriptDebugModel.numberToString(value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java
deleted file mode 100644
index d1f49ef..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link ObjectReference}
- * 
- * @see MirrorImpl
- * @see ObjectReference
- * @see Property
- * @since 1.0
- */
-public class ObjectReferenceImpl extends MirrorImpl implements ObjectReference {
-
-	protected static final ArrayList NO_PROPERTIES = new ArrayList(0);
-
-	/**
-	 * The name of the class backing this object
-	 */
-	private final String className;
-	/**
-	 * The reference id to the constructor for this object
-	 */
-	private final Number constructorRef;
-	/**
-	 * The reference id to the prototype for this object
-	 */
-	private final Number prototypeRef;
-	/**
-	 * The reference id for this object
-	 */
-	private final Number id;
-	/**
-	 * The stackframe context for this object
-	 */
-	protected StackFrameImpl frame;
-	/**
-	 * The JSDI handle to the constructor for this object - lazily computed in {@link #constructor()}
-	 */
-	private Value constructor = null;
-	/**
-	 * The JSDI handle to the prototype for this object - lazily computed in {@link #prototype()}
-	 */
-	private Value prototype = null;
-	/**
-	 * The backing list of {@link PropertyReference}s for this object
-	 */
-	private List properties = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 * @param frame
-	 */
-	public ObjectReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl frame) {
-		super(vm);
-		this.frame = frame;
-		this.className = (String) body.get(JSONConstants.CLASS_NAME);
-		this.id = (Number) body.get(JSONConstants.REF);
-		this.constructorRef = (Number) body.get(JSONConstants.CONSTRUCTOR_FUNCTION);
-		this.prototypeRef = (Number) body.get(JSONConstants.PROTOTYPE_OBJECT);
-		List proplist = (List) body.get(JSONConstants.PROPERTIES);
-		if (proplist != null) {
-			this.properties = new ArrayList(proplist.size());
-			Map props = null;
-			for (Iterator iter = proplist.iterator(); iter.hasNext();) {
-				props = (Map) iter.next();
-				this.properties.add(new PropertyImpl(vm, frame, props.get(JSONConstants.NAME).toString(), (Number) props.get(JSONConstants.REF)));
-			}
-		} else {
-			this.properties = NO_PROPERTIES;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#className()
-	 */
-	public String className() {
-		return this.className;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#constructor()
-	 */
-	public Value constructor() {
-		synchronized (this.frame) {
-			if (this.constructor == null) {
-				this.constructor = this.frame.lookupValue(constructorRef);
-				if (this.constructor == null) {
-					this.constructor = this.vm.mirrorOfNull();
-				}
-			}
-		}
-		return this.constructor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#prototype()
-	 */
-	public Value prototype() {
-		synchronized (this.frame) {
-			if (this.prototype == null) {
-				this.prototype = this.frame.lookupValue(prototypeRef);
-				if (this.prototype == null) {
-					this.prototype = this.vm.mirrorOfNull();
-				}
-			}
-		}
-		return this.prototype;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#properties()
-	 */
-	public List properties() {
-		return this.properties;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Object Reference\n"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return "Object"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#id()
-	 */
-	public Number id() {
-		return this.id;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java
deleted file mode 100644
index 3b63bbc..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Rhino implementation of {@link Property}
- * 
- * @see MirrorImpl
- * @see Property
- * @see Value
- * @since 1.0
- */
-public class PropertyImpl extends MirrorImpl implements Property {
-
-	/**
-	 * The name of the property
-	 */
-	private String name;
-	/**
-	 * The reference used to look up the property value in the stackframe
-	 * context
-	 */
-	private Number ref;
-	private StackFrameImpl frame;
-	private Value value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param name
-	 * @param ref
-	 */
-	public PropertyImpl(VirtualMachineImpl vm, StackFrameImpl frame,
-			String name, Number ref) {
-		super(vm);
-		this.frame = frame;
-		this.name = name;
-		this.ref = ref;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#name()
-	 */
-	public String name() {
-		return name;
-	}
-
-	/**
-	 * The reference id of this property
-	 * 
-	 * @return the reference id of this property
-	 */
-	public Number getRef() {
-		return ref;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public Value value() {
-		synchronized (this.frame) {
-			if (this.value == null) {
-				this.value = frame.lookupValue(ref);
-			}
-		}
-		return this.value;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java
deleted file mode 100644
index 286c435..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.osgi.framework.Constants;
-
-/**
- * Rhino implementation of {@link ScriptReference}
- * 
- * @see MirrorImpl
- * @see ScriptReference
- * @since 1.0
- */
-public class ScriptReferenceImpl extends MirrorImpl implements ScriptReference {
-
-	/**
-	 * The id of the script - this can be used to look it up in the {@link VirtualMachineImpl}
-	 */
-	private final Long scriptId;
-	private String sourcePath = null;
-	private URI sourceuri = null;
-	private final String source;
-	private final Boolean generated;
-	private final List lineLocations = new ArrayList();
-	private final List functionLocations = new ArrayList();
-	private Map sourceProperties = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonScript
-	 */
-	public ScriptReferenceImpl(VirtualMachineImpl vm, Map jsonScript) {
-		super(vm);
-		this.scriptId = new Long(((Number) jsonScript.get(JSONConstants.SCRIPT_ID)).longValue());
-		this.sourcePath = (String) jsonScript.get(JSONConstants.LOCATION);
-		this.sourceProperties = (Map) jsonScript.get(JSONConstants.PROPERTIES);
-		this.source = (String) jsonScript.get(JSONConstants.SOURCE);
-		this.generated = (Boolean) jsonScript.get(JSONConstants.GENERATED);
-		List lines = (List) jsonScript.get(JSONConstants.LINES);
-		for (Iterator iterator = lines.iterator(); iterator.hasNext();) {
-			Number lineNumber = (Number) iterator.next();
-			Location location = new LocationImpl(vm, null, lineNumber.intValue(), this);
-			lineLocations.add(location);
-		}
-		List functions = (List) jsonScript.get(JSONConstants.FUNCTIONS);
-		for (Iterator iterator = functions.iterator(); iterator.hasNext();) {
-			String functionName = (String) iterator.next();
-			Location location = new LocationImpl(vm, functionName, 0, this);
-			functionLocations.add(location);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allFunctionLocations()
-	 */
-	public List allFunctionLocations() {
-		return Collections.unmodifiableList(functionLocations);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allLineLocations()
-	 */
-	public List allLineLocations() {
-		return Collections.unmodifiableList(lineLocations);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#functionLocation(java.lang.String)
-	 */
-	public Location functionLocation(String functionName) {
-		for (Iterator iterator = functionLocations.iterator(); iterator.hasNext();) {
-			Location location = (Location) iterator.next();
-			if (location.functionName().equals(functionName))
-				return location;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#lineLocation(int)
-	 */
-	public Location lineLocation(int lineNumber) {
-		for (Iterator iterator = lineLocations.iterator(); iterator.hasNext();) {
-			Location location = (Location) iterator.next();
-			if (location.lineNumber() == lineNumber)
-				return location;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#source()
-	 */
-	public String source() {
-		return source;
-	}
-
-	/**
-	 * @return the id of the {@link ScriptReference}
-	 */
-	public Long getScriptId() {
-		return scriptId;
-	}
-
-	
-	/**
-	 * Return if the script is generated or not
-	 * @return <code>true</code> if the script was generated <code>false</code> otherwise
-	 */
-	public boolean isGenerated() {
-		return generated.booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#sourceURI()
-	 */
-	public synchronized URI sourceURI() {
-		if (this.sourceuri == null) {
-			try {
-				if (this.sourceProperties != null) {
-					IPath path = new Path((String) this.sourceProperties.get(Constants.BUNDLE_SYMBOLICNAME));
-					path = path.append((String) this.sourceProperties.get(JSONConstants.PATH));
-					path = path.append((String) this.sourceProperties.get(JSONConstants.NAME));
-					this.sourceuri = URIUtil.fromString(path.toString());
-				} else if (this.sourcePath != null) {
-					try {
-						this.sourceuri = new URI(this.sourcePath);
-					}
-					catch(URISyntaxException use) {
-						this.sourceuri = URIUtil.fromString(sourcePath);
-					}
-				} else {
-					this.sourceuri = RhinoDebugPlugin.fileURI(new Path("script")); //$NON-NLS-1$
-				}
-			} catch (URISyntaxException urise) {
-				RhinoDebugPlugin.log(urise);
-			}
-		}
-		return this.sourceuri;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ScriptReferenceImpl: "); //$NON-NLS-1$
-		buffer.append("[sourceuri - ").append(sourceURI()).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("Line locations: \n"); //$NON-NLS-1$
-		List list = new ArrayList(allLineLocations());
-		Collections.sort(list, LocationImpl.getLocationComparator());
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Location loc = (Location) iter.next();
-			buffer.append("\t").append(loc.toString()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		buffer.append("Function locations: \n"); //$NON-NLS-1$
-		list = new ArrayList(allFunctionLocations());
-		Collections.sort(list, LocationImpl.getLocationComparator());
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Location loc = (Location) iter.next();
-			buffer.append("\t").append(loc.toString()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		buffer.append("\n"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java
deleted file mode 100644
index 3144064..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Rhino implementation of {@link StackFrame}
- * 
- * @see MirrorImpl
- * @see StackFrame
- * @since 1.0
- */
-public class StackFrameImpl extends MirrorImpl implements StackFrame {
-
-	private final Number frameId;
-	private final Number threadId;
-	private final Number contextId;
-	private final Number ref;
-	private final Location location;
-	private List variables;
-	private VariableImpl thisVariable;
-	private HashMap cache = new HashMap();
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonFrame
-	 */
-	public StackFrameImpl(VirtualMachineImpl vm, Map jsonFrame) {
-		super(vm);
-		this.threadId = (Number) jsonFrame.get(JSONConstants.THREAD_ID);
-		this.frameId = (Number) jsonFrame.get(JSONConstants.FRAME_ID);
-		this.contextId = (Number) jsonFrame.get(JSONConstants.CONTEXT_ID);
-		this.ref = (Number) jsonFrame.get(JSONConstants.REF);
-
-		Long scriptId = new Long(((Number) jsonFrame.get(JSONConstants.SCRIPT_ID)).longValue());
-		ScriptReferenceImpl script = vm.getScript(scriptId);
-
-		String function = (String) jsonFrame.get(JSONConstants.FUNCTION);
-		if (function != null) {
-			this.location = script.functionLocation(function);
-		} else {
-			Number line = (Number) jsonFrame.get(JSONConstants.LINE);
-			Location lineLocation = script.lineLocation(line.intValue());
-			this.location = lineLocation != null ? lineLocation : new LocationImpl(vm, function, line.intValue(), script);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#evaluate(java.lang.String)
-	 */
-	public Value evaluate(String expression) {
-		RhinoRequest request = new RhinoRequest(JSONConstants.EVALUATE);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		request.getArguments().put(JSONConstants.EXPRESSION, expression);
-		try {
-			RhinoResponse response = vm.sendRequest(request, 30000);
-			return createValue(response.getBody(), true);
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Utility method to look up the {@link Value} with the given reference id <br>
-	 * or <code>null</code> if there is no {@link Value} with the given id
-	 * 
-	 * @param ref
-	 * @return the {@link Value} or <code>null</code>
-	 */
-	public Value lookupValue(Number ref) {
-		Value value = (Value) this.cache.get(ref);
-		if (value == null) {
-			RhinoRequest request = new RhinoRequest(JSONConstants.LOOKUP);
-			request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-			request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-			request.getArguments().put(JSONConstants.REF, ref);
-			try {
-				RhinoResponse response = vm.sendRequest(request, 30000);
-				value = createValue(response.getBody(), false);
-				this.cache.put(ref, value);
-				return value;
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * Creates a new type value for the given type description in the map
-	 * 
-	 * @param body
-	 * @param iseval
-	 * @return the new type
-	 * @throws IllegalStateException
-	 *             if the type description in the map is unknown
-	 */
-	private Value createValue(Map body, boolean iseval) throws IllegalStateException {
-		Map value = (Map) body.get((iseval ? JSONConstants.EVALUATE : JSONConstants.LOOKUP));
-		if(value == null) {
-			return vm.nullValue;
-		}
-		String type = (String) value.get(JSONConstants.TYPE);
-		if(type == null) {
-			return vm.nullValue;
-		}
-		// "undefined", "null", "boolean", "number", "string", "object",
-		// "function"
-
-		if (type.equals(JSONConstants.UNDEFINED)) {
-			return vm.undefinedValue;
-		} else if (type.equals(JSONConstants.NULL)) {
-			return vm.nullValue;
-		} else if (type.equals(JSONConstants.BOOLEAN)) {
-			return new BooleanValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.NUMBER)) {
-			return new NumberValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.STRING)) {
-			return new StringValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.OBJECT)) {
-			return new ObjectReferenceImpl(vm, value, this);
-		} else if (type.equals(JSONConstants.FUNCTION)) {
-			return new FunctionReferenceImpl(vm, value, this);
-		} else if (type.equals(JSONConstants.ARRAY)) {
-			return new ArrayReferenceImpl(vm, value, this);
-		}
-		throw new IllegalStateException();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#location()
-	 */
-	public Location location() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#thisObject()
-	 */
-	public synchronized Variable thisObject() {
-		initializeVariables();
-		return thisVariable;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#variables()
-	 */
-	public synchronized List variables() {
-		initializeVariables();
-		if(variables == null) {
-			//return this to maintain the API contract, and to allow variable initialization happen again
-			return Collections.EMPTY_LIST;
-		}
-		return variables;
-	}
-
-	/**
-	 * Initializes and caches the live set of variables
-	 */
-	private void initializeVariables() {
-		if (variables != null) {
-			return;
-		}
-		RhinoRequest request = new RhinoRequest(JSONConstants.LOOKUP);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		request.getArguments().put(JSONConstants.REF, ref);
-		try {
-			RhinoResponse response = vm.sendRequest(request, 30000);
-			if(response.isSuccess()) {
-				Map lookup = (Map) response.getBody().get(JSONConstants.LOOKUP);
-				List properties = (List) lookup.get(JSONConstants.PROPERTIES);
-				variables = new ArrayList();
-				for (Iterator iterator = properties.iterator(); iterator.hasNext();) {
-					Map property = (Map) iterator.next();
-					String name = (String) property.get(JSONConstants.NAME);
-					Number ref = (Number) property.get(JSONConstants.REF);
-					VariableImpl variable = new VariableImpl(vm, this, name, ref);
-					if (name.equals(JSONConstants.THIS))
-						thisVariable = variable;
-					else
-						variables.add(variable);
-				}
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/**
-	 * Returns if this stack frame is visible
-	 * 
-	 * @param variable
-	 * @return true if this frame is visible, false otherwise
-	 */
-	public synchronized boolean isVisible(VariableImpl variable) {
-		return variables != null && (thisVariable == variable || variables.contains(variable));
-	}
-
-	/**
-	 * @return the context id for this frame
-	 */
-	public Number getContextId() {
-		return contextId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java
deleted file mode 100644
index 3bf19c2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link StringValue}
- * 
- * @since 1.0
- */
-public class StringValueImpl extends MirrorImpl implements StringValue {
-
-	private String value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param value
-	 */
-	public StringValueImpl(VirtualMachineImpl vm, String value) {
-		super(vm);
-		this.value = value;
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public StringValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (String) body.get(JSONConstants.VALUE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return value;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java
deleted file mode 100644
index a7b717b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Rhino implementation of {@link ThreadReference}
- * 
- * @since 1.0
- */
-public class ThreadReferenceImpl extends MirrorImpl implements ThreadReference {
-
-	private Number threadId;
-	private List frames;
-	private int status = THREAD_STATUS_RUNNING;
-	private boolean suspended;
-	private boolean atBreakpoint = false;
-	private String name;
-	private String step;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonThread
-	 */
-	public ThreadReferenceImpl(VirtualMachineImpl vm, Map jsonThread) {
-		super(vm);
-		this.threadId = (Number) jsonThread.get(JSONConstants.THREAD_ID);
-		this.name = (String) jsonThread.get(JSONConstants.NAME);
-		if (this.name == null) {
-			// TODO NLS this
-			this.name = "Rhino - " + threadId; //$NON-NLS-1$
-		}
-		this.suspended = JSONConstants.SUSPENDED.equals(jsonThread.get(JSONConstants.STATE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frameCount()
-	 */
-	public synchronized int frameCount() {
-		frames();
-		return (frames == null ? 0 : frames.size());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frame(int)
-	 */
-	public synchronized StackFrame frame(int index) {
-		frames();
-		return (StackFrame) frames.get(index);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frames()
-	 */
-	public synchronized List frames() {
-		if (!suspended || status == THREAD_STATUS_ZOMBIE) {
-			return Collections.EMPTY_LIST;
-		}
-		if (frames != null) {
-			return frames;
-		}
-		RhinoRequest request = new RhinoRequest(JSONConstants.FRAMES);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			RhinoResponse response = vm.sendRequest(request, 30000);
-			List frameIds = (List) response.getBody().get(JSONConstants.FRAMES);
-			if (frameIds.isEmpty()) {
-				return Collections.EMPTY_LIST;
-			}
-			frames = new ArrayList();
-			for (Iterator iterator = frameIds.iterator(); iterator.hasNext();) {
-				Long frameId = new Long(((Number) iterator.next()).longValue());
-				StackFrameImpl frame = createStackFrame(frameId);
-				frames.add(frame);
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		if(frames != null) {
-			return frames;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * Sends a request to make a new {@link StackFrameReference} in the current debugger.
-	 * Returns a new {@link StackFrameReference} on success, <code>null</code> on failure
-	 * 
-	 * @param frameId
-	 * @return a new {@link StackFrameReference} or <code>null</code>
-	 */
-	private StackFrameImpl createStackFrame(Long frameId) {
-		RhinoRequest request = new RhinoRequest(JSONConstants.FRAME);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		try {
-			RhinoResponse response = vm.sendRequest(request);
-			Map jsonFrame = (Map) response.getBody().get(JSONConstants.FRAME);
-			return new StackFrameImpl(vm, jsonFrame);
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isAtBreakpoint()
-	 */
-	public synchronized boolean isAtBreakpoint() {
-		return suspended && atBreakpoint;
-	}
-
-	/**
-	 * Marks the current thread reference as suspended
-	 * 
-	 * @param atBreakpoint
-	 */
-	public synchronized void markSuspended(boolean atBreakpoint) {
-		this.suspended = true;
-		this.atBreakpoint = atBreakpoint;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isSuspended()
-	 */
-	public synchronized boolean isSuspended() {
-		return suspended;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#name()
-	 */
-	public String name() {
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#resume()
-	 */
-	public synchronized void resume() {
-		if (status == THREAD_STATUS_ZOMBIE) {
-			return;
-		}
-		RhinoRequest request = new RhinoRequest(JSONConstants.CONTINUE);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		if (step != null) {
-			request.getArguments().put(JSONConstants.STEP, step);
-		}
-		try {
-			RhinoResponse response = vm.sendRequest(request);
-			if (response.isSuccess()) {
-				step = null;
-				frames = null;
-				suspended = false;
-				atBreakpoint = false;
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#suspend()
-	 */
-	public synchronized void suspend() {
-		if (status == THREAD_STATUS_ZOMBIE) {
-			return;
-		}
-		RhinoRequest request = new RhinoRequest(JSONConstants.SUSPEND);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			RhinoResponse response = vm.sendRequest(request);
-			if(response.isSuccess()) {
-				markSuspended(false);
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#interrupt()
-	 */
-	public void interrupt() {
-		throw new UnsupportedOperationException();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#status()
-	 */
-	public synchronized int status() {
-		return status;
-	}
-
-	/**
-	 * Returns the step type
-	 * 
-	 * @return the step type
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 */
-	public synchronized String getStep() {
-		return step;
-	}
-
-	/**
-	 * Sets the current step type
-	 * 
-	 * @param step
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 */
-	public synchronized void setStep(String step) {
-		this.step = step;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java
deleted file mode 100644
index 191ef70..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link UndefinedValue}
- * 
- * @see MirrorImpl
- * @see UndefinedValue
- * @since 1.0
- */
-public class UndefinedValueImpl extends MirrorImpl implements UndefinedValue {
-
-	static final String UNDEFINED_VALUE = "Undefined"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public UndefinedValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return JSONConstants.UNDEFINED;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return UNDEFINED_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java
deleted file mode 100644
index 08fee0f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- * Rhino implementation of a {@link Variable}
- * 
- * @since 1.0
- */
-public class VariableImpl extends PropertyImpl implements Variable {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param frame
-	 * @param name
-	 * @param ref
-	 */
-	public VariableImpl(VirtualMachineImpl vm, StackFrameImpl frame, String name, Number ref) {
-		super(vm, frame, name, ref);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isArgument()
-	 */
-	public boolean isArgument() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isVisible(org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame)
-	 */
-	public boolean isVisible(StackFrame frame) {
-		StackFrameImpl frameImpl = (StackFrameImpl) frame;
-		return frameImpl.isVisible(this);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java
deleted file mode 100644
index 1f5a437..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.internal.rhino.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event.EventQueueImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestManagerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Rhino implementation of {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public class VirtualMachineImpl extends MirrorImpl implements VirtualMachine {
-
-	public final UndefinedValueImpl undefinedValue = new UndefinedValueImpl(this);
-	public final NullValueImpl nullValue = new NullValueImpl(this);
-
-	private final Map scripts = new HashMap();
-	private final DebugSession session;
-	private EventRequestManagerImpl eventRequestManager = new EventRequestManagerImpl(this);
-	private final EventQueue eventQueue = new EventQueueImpl(this, eventRequestManager);
-	private Map threads = new HashMap();
-	private boolean disconnected = false;
-	private String name = null;
-	private String version = null;
-	Object lock = new Object();
-
-	/**
-	 * Constructor
-	 * 
-	 * @param debugSession
-	 */
-	public VirtualMachineImpl(DebugSession debugSession) {
-		super(Constants.SPACE);
-		this.session = debugSession;
-		initalizeScripts();
-	}
-
-	/**
-	 * loads the scripts
-	 */
-	private void initalizeScripts() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.SCRIPTS);
-		try {
-			RhinoResponse response = sendRequest(request);
-			List scriptIds = (List) response.getBody().get(JSONConstants.SCRIPTS);
-			for (Iterator iterator = scriptIds.iterator(); iterator.hasNext();) {
-				Long scriptId = new Long(((Number) iterator.next()).longValue());
-				ScriptReferenceImpl script = createScriptReference(scriptId);
-				if(script != null) {
-					scripts.put(scriptId, script);
-				}
-			}
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/**
-	 * Creates a new {@link ScriptReferenceImpl} for the given ID
-	 * @param scriptId
-	 * @return the new {@link ScriptReferenceImpl} or <code>null</code>
-	 */
-	private ScriptReferenceImpl createScriptReference(Long scriptId) {
-		RhinoRequest request = new RhinoRequest(JSONConstants.SCRIPT);
-		request.getArguments().put(JSONConstants.SCRIPT_ID, scriptId);
-		try {
-			RhinoResponse response = sendRequest(request, DEFAULT_TIMEOUT);
-			Map jsonScript = (Map) response.getBody().get(JSONConstants.SCRIPT);
-			return new ScriptReferenceImpl(this, jsonScript);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allScripts()
-	 */
-	public synchronized List allScripts() {
-		return new ArrayList(scripts.values());
-	}
-
-	/**
-	 * Adds a new script to the {@link VirtualMachine} with the given ID and returns
-	 * it.
-	 * @param scriptId
-	 * @param script
-	 */
-	public synchronized ScriptReferenceImpl addScript(Long scriptId) {
-		ScriptReferenceImpl script = createScriptReference(scriptId);
-		if (script != null) {
-			scripts.put(scriptId, script);
-		}
-		return script;
-	}
-
-	/**
-	 * Returns the {@link ScriptReferenceImpl} for the given ID or <code>null</code>
-	 * if no such {@link ScriptReferenceImpl} exists.
-	 * @param scriptId
-	 * @return the {@link ScriptReferenceImpl} for the given ID or <code>null</code>
-	 */
-	public synchronized ScriptReferenceImpl getScript(Long scriptId) {
-		return (ScriptReferenceImpl) scripts.get(scriptId);
-	}
-
-	/**
-	 * @param timeout
-	 * @return
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public EventPacket receiveEvent(int timeout) throws TimeoutException, DisconnectedException {
-		return (EventPacket) session.receive(EventPacket.TYPE, timeout);
-	}
-
-	/**
-	 * Sends a request to the backing {@link DebugSession}
-	 * 
-	 * @param request
-	 * @param timeout
-	 * @return the {@link RhinoResponse} for the request
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public RhinoResponse sendRequest(RhinoRequest request, int timeout) throws TimeoutException, DisconnectedException {
-		session.send(request);
-		return (RhinoResponse) session.receiveResponse(request.getSequence(), timeout);
-	}
-
-	/**
-	 * Sends the given {@link RhinoRequest} using the default timeout
-	 * @param request
-	 * @return the {@link RhinoResponse} from the request
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public RhinoResponse sendRequest(RhinoRequest request) throws TimeoutException, DisconnectedException {
-		return sendRequest(request, DEFAULT_TIMEOUT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allThreads()
-	 */
-	public synchronized List allThreads() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.THREADS);
-		try {
-			RhinoResponse response = sendRequest(request);
-			List threadIds = (List) response.getBody().get(JSONConstants.THREADS);
-			HashMap allThreads = new HashMap(threadIds.size());
-			for (Iterator iterator = threadIds.iterator(); iterator.hasNext();) {
-				Long threadId = new Long(((Number) iterator.next()).longValue());
-				ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
-				if (thread == null) {
-					thread = createThreadReference(threadId);
-				}
-				if(thread != null) {
-					allThreads.put(threadId, thread);
-				}
-			}
-			threads = allThreads;
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return new ArrayList(threads.values());
-	}
-
-	/**
-	 * Removes the thread with the given ID
-	 * @param threadId
-	 * @return the {@link ThreadReferenceImpl} that has been removed
-	 */
-	public synchronized ThreadReferenceImpl removeThread(Long threadId) {
-		return (ThreadReferenceImpl) threads.remove(threadId);
-	}
-
-	/**
-	 * Creates a new {@link ThreadReferenceImpl} with the given ID
-	 * @param threadId
-	 * @return the new {@link ThreadReferenceImpl} or <code>null</code>
-	 */
-	private ThreadReferenceImpl createThreadReference(Long threadId) {
-		RhinoRequest request = new RhinoRequest(JSONConstants.THREAD);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			RhinoResponse response = sendRequest(request, DEFAULT_TIMEOUT);
-			Map jsonThread = (Map) response.getBody().get(JSONConstants.THREAD);
-			if (jsonThread == null) {
-				return null;
-			}
-			return new ThreadReferenceImpl(this, jsonThread);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the {@link ThreadReferenceImpl} with the given ID or 
-	 * create and return a new one if it does not exist
-	 * @param threadId
-	 * @return the {@link ThreadReferenceImpl} for the given ID or <code>null</code>
-	 * if the request to create a new one fails
-	 */
-	public synchronized ThreadReferenceImpl getThread(Long threadId) {
-		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
-		if (thread == null) {
-			thread = createThreadReference(threadId);
-			if (thread != null) {
-				threads.put(threadId, thread);
-			}
-		}
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#description()
-	 */
-	public String description() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.VERSION);
-		try {
-			RhinoResponse response = sendRequest(request);
-			StringBuffer buffer = new StringBuffer();
-			buffer.append((String) response.getBody().get(JSONConstants.VM_VENDOR)).append(Constants.SPACE);
-			buffer.append(response.getBody().get(JSONConstants.VM_NAME)).append(Constants.SPACE);
-			buffer.append(response.getBody().get(JSONConstants.VM_VERSION));
-			return buffer.toString();
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#dispose()
-	 */
-	public void dispose() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.DISPOSE);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		} finally {
-			disconnectVM();
-			this.eventRequestManager.createVMDeathRequest();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#name()
-	 */
-	public String name() {
-		synchronized (lock) {
-			if(this.name == null) {
-	 			RhinoRequest request = new RhinoRequest(JSONConstants.VERSION);
-				try {
-					RhinoResponse response = sendRequest(request);
-					name = (String) response.getBody().get(JSONConstants.VM_NAME);
-				} catch (DisconnectedException e) {
-					disconnectVM();
-					handleException(e.getMessage(), e);
-				} catch (TimeoutException e) {
-					RhinoDebugPlugin.log(e);
-				}
-			}
-		}
-		return this.name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#resume()
-	 */
-	public void resume() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.CONTINUE);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#suspend()
-	 */
-	public void suspend() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.SUSPEND);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#terminate()
-	 */
-	public void terminate() {
-		dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#version()
-	 */
-	public String version() {
-		synchronized (lock) {
-			if(this.version == null) {
-				RhinoRequest request = new RhinoRequest(JSONConstants.VERSION);
-				try {
-					RhinoResponse response = sendRequest(request);
-					this.version = (String) response.getBody().get(JSONConstants.VM_VERSION);
-				} catch (DisconnectedException e) {
-					disconnectVM();
-					handleException(e.getMessage(), e);
-				} catch (TimeoutException e) {
-					RhinoDebugPlugin.log(e);
-				}
-			}
-		}
-		return this.version;
-	}
-
-	/**
-	 * disconnects the VM and creates the correct requests
-	 */
-	public void disconnectVM() {
-		if (this.disconnected) {
-			// no-op it is already disconnected
-			return;
-		}
-		try {
-			this.session.dispose();
-		} finally {
-			this.disconnected = true;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(boolean)
-	 */
-	public BooleanValue mirrorOf(boolean bool) {
-		return new BooleanValueImpl(this, Boolean.valueOf(bool));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.Number)
-	 */
-	public NumberValue mirrorOf(Number number) {
-		return new NumberValueImpl(this, number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.String)
-	 */
-	public StringValue mirrorOf(String string) {
-		return new StringValueImpl(this, string);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfNull()
-	 */
-	public NullValue mirrorOfNull() {
-		return nullValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfUndefined()
-	 */
-	public UndefinedValue mirrorOfUndefined() {
-		return undefinedValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventRequestManager()
-	 */
-	public EventRequestManager eventRequestManager() {
-		return eventRequestManager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventQueue()
-	 */
-	public EventQueue eventQueue() {
-		return eventQueue;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java
deleted file mode 100644
index 6d7f26a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-
-/**
- * Implementation of a string argument that describes the host argument
- * 
- * @since 1.0
- */
-public class HostArgument implements StringArgument {
-
-	private static final long serialVersionUID = 3057403815318177030L;
-	private String host;
-
-	/**
-	 * Host attribute name
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param host
-	 */
-	public HostArgument(String host) {
-		setValue(host);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.HostArgument_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.HostArgument_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return HOST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String host) {
-		if (!isValid(host)) {
-			throw new IllegalArgumentException();
-		}
-		this.host = host;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return host;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java
deleted file mode 100644
index 2c57f65..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Rhino messages
- * 
- * @since 1.0
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.messages"; //$NON-NLS-1$
-	public static String HostArgument_description;
-	public static String HostArgument_label;
-	public static String PortArgument_description;
-	public static String PortArgument_label;
-	public static String RhinoAttachingConnector_description;
-	public static String RhinoAttachingConnector_name;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java
deleted file mode 100644
index c51a547..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.PortArgument_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.PortArgument_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java
deleted file mode 100644
index 406690c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoTransportService;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-/**
- * Rhino {@link Connector} implementation that attaches to a running debug process
- * 
- * @since 1.0
- * @see Connector
- * @see AttachingConnector
- */
-public class RhinoAttachingConnector implements AttachingConnector {
-
-	/**
-	 * Describes the <code>localhost</code> hostname i.e. the <code>127.0.0.1</code> IP address
-	 */
-	public static final String LOCALHOST = "localhost"; //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector#attach(java.util.Map)
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException {
-		TransportService service = new RhinoTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		Connection c = service.attach(host + ":" + Integer.parseInt(port), 10000, 10000); //$NON-NLS-1$
-		DebugSession session = new DebugSession(c);
-		return new VirtualMachineImpl(session);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		Map result = new HashMap();
-		result.put(HostArgument.HOST, new HostArgument(LOCALHOST));
-		result.put(PortArgument.PORT, new PortArgument(9000));
-		return result;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.RhinoAttachingConnector_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.RhinoAttachingConnector_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return "rhino.attaching.connector"; //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties
deleted file mode 100644
index 9a85cd8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2009 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-HostArgument_description=The name of the host address to try attaching to.
-HostArgument_label=&Host:
-PortArgument_description=The port on the host machine to try attaching to.
-PortArgument_label=&Port:
-RhinoAttachingConnector_description=This connector is used to attach to a running Mozilla Rhino debug process.
-RhinoAttachingConnector_name=Mozilla Rhino - Attaching Connector
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java
deleted file mode 100644
index 2b86a87..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link BreakpointEvent}
- * 
- * @since 1.0
- */
-public final class BreakpointEventImpl extends LocatableEventImpl implements BreakpointEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public BreakpointEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, BreakpointRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java
deleted file mode 100644
index 8e197c4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link DebuggerStatementEvent}
- * 
- * @since 1.0
- */
-public final class DebuggerStatementEventImpl extends LocatableEventImpl implements DebuggerStatementEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public DebuggerStatementEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, DebuggerStatementRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java
deleted file mode 100644
index f559328..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link Event}
- * 
- * @since 1.0
- */
-public class EventImpl implements Event {
-
-	private final VirtualMachineImpl vm;
-	private final EventRequest request;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public EventImpl(VirtualMachineImpl vm, EventRequest request) {
-		this.vm = vm;
-		this.request = request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.Event#request()
-	 */
-	public EventRequest request() {
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java
deleted file mode 100644
index fb9e31a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.BreakpointRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.DebuggerStatementRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestManagerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.StepRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.SuspendRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Default implementation of {@link EventQueue}
- * 
- * @since 1.0
- */
-public final class EventQueueImpl extends MirrorImpl implements EventQueue {
-
-	private VirtualMachineImpl vm;
-	private EventRequestManagerImpl eventRequestManager;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param eventRequestManager
-	 */
-	public EventQueueImpl(VirtualMachineImpl vm, EventRequestManagerImpl eventRequestManager) {
-		super(vm);
-		this.vm = vm;
-		this.eventRequestManager = eventRequestManager;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove()
-	 */
-	public EventSet remove() {
-		return remove(-1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove(int)
-	 */
-	public EventSet remove(int timeout) {
-		try {
-			while (true) {
-				EventPacket event = vm.receiveEvent(timeout);
-				String eventName = event.getEvent();
-				EventSetImpl eventSet = new EventSetImpl(vm);
-				if (eventName.equals(JSONConstants.SCRIPT)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread == null) {
-						continue;
-					}
-					eventSet.setThread(thread);
-					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-					ScriptReferenceImpl script = vm.addScript(scriptId);
-					if(script != null) {
-						List scriptLoadRequests = eventRequestManager.scriptLoadRequests();
-						for (Iterator iterator = scriptLoadRequests.iterator(); iterator.hasNext();) {
-							ScriptLoadRequest request = (ScriptLoadRequest) iterator.next();
-							if (request.isEnabled()) {
-								eventSet.add(new ScriptLoadEventImpl(vm, thread, script, request));
-							}
-						}
-					}
-					if (!eventSet.isEmpty()) {
-						thread.markSuspended(false);
-					}
-				} else if (eventName.equals(JSONConstants.BREAK)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread == null) {
-						continue;
-					}
-					eventSet.setThread(thread);
-					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-					ScriptReferenceImpl script = vm.getScript(scriptId);
-					if(script != null) {
-						int lineNumber = ((Number) event.getBody().get(JSONConstants.LINE)).intValue();
-						Location location = script.lineLocation(lineNumber);
-						boolean atBreakpoint = false;
-						Number breakpointId = (Number) event.getBody().get(JSONConstants.BREAKPOINT);
-						if (breakpointId != null) {
-							List breakpointRequests = eventRequestManager.breakpointRequests();
-							for (Iterator iterator = breakpointRequests.iterator(); iterator.hasNext();) {
-								BreakpointRequestImpl request = (BreakpointRequestImpl) iterator.next();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread) && breakpointId.longValue() == request.breakpointId().longValue()) {
-									eventSet.add(new BreakpointEventImpl(vm, thread, location, request));
-									atBreakpoint = true;
-								}
-							}
-						}
-						String stepType = (String) event.getBody().get(JSONConstants.STEP);
-						if (JSONConstants.SUSPENDED.equals(stepType)) {
-							List suspendRequests = eventRequestManager.suspendRequests();
-							for (Iterator iterator = suspendRequests.iterator(); iterator.hasNext();) {
-								SuspendRequestImpl request = (SuspendRequestImpl) iterator.next();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
-									eventSet.add(new SuspendEventImpl(vm, thread, location, request));
-								}
-							}
-						} else if (stepType != null) {
-							List stepRequests = eventRequestManager.stepRequests();
-							for (Iterator iterator = stepRequests.iterator(); iterator.hasNext();) {
-								StepRequestImpl request = (StepRequestImpl) iterator.next();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
-									eventSet.add(new StepEventImpl(vm, thread, location, request));
-								}
-							}
-						}
-						Boolean debuggerStatement = (Boolean) event.getBody().get(JSONConstants.DEBUGGER_STATEMENT);
-						if (debuggerStatement.booleanValue()) {
-							List debuggerStatementRequests = eventRequestManager.debuggerStatementRequests();
-							for (Iterator iterator = debuggerStatementRequests.iterator(); iterator.hasNext();) {
-								DebuggerStatementRequestImpl request = (DebuggerStatementRequestImpl) iterator.next();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
-									eventSet.add(new DebuggerStatementEventImpl(vm, thread, location, request));
-								}
-							}
-						}
-						if (!eventSet.isEmpty()) {
-							thread.markSuspended(atBreakpoint);
-						}
-					}
-				} else if (eventName.equals(JSONConstants.EXCEPTION)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread != null) {
-						eventSet.setThread(thread);
-						Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-						ScriptReferenceImpl script = vm.getScript(scriptId);
-						int lineNumber = ((Number) event.getBody().get(JSONConstants.LINE)).intValue();
-						Location location = script.lineLocation(lineNumber);
-						String message = (String) event.getBody().get(JSONConstants.MESSAGE);
-						List exceptionRequests = eventRequestManager.exceptionRequests();
-						for (Iterator iterator = exceptionRequests.iterator(); iterator.hasNext();) {
-							ExceptionRequest request = (ExceptionRequest) iterator.next();
-							if (request.isEnabled()) {
-								eventSet.add(new ExceptionEventImpl(vm, thread, location, message, request));
-							}
-						}
-						if (!eventSet.isEmpty()) {
-							thread.markSuspended(false);
-						}
-					}
-				} else if (eventName.equals(JSONConstants.THREAD)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					String type = (String) event.getBody().get(JSONConstants.TYPE);
-					if (JSONConstants.ENTER.equals(type)) {
-						ThreadReferenceImpl thread = vm.getThread(threadId);
-						if(thread != null) {
-							eventSet.setThread(thread);
-							List threadEnterRequests = eventRequestManager.threadEnterRequests();
-							for (Iterator iterator = threadEnterRequests.iterator(); iterator.hasNext();) {
-								ThreadEnterRequest request = (ThreadEnterRequest) iterator.next();
-								if (request.isEnabled()) {
-									eventSet.add(new ThreadEnterEventImpl(vm, thread, request));
-								}
-							}
-						}
-					} else if (JSONConstants.EXIT.equals(type)) {
-						ThreadReferenceImpl thread = vm.removeThread(threadId);
-						List threadExitRequests = eventRequestManager.threadExitRequests();
-						for (Iterator iterator = threadExitRequests.iterator(); iterator.hasNext();) {
-							ThreadExitRequest request = (ThreadExitRequest) iterator.next();
-							if (request.isEnabled()) {
-								eventSet.add(new ThreadExitEventImpl(vm, thread, request));
-							}
-						}
-					}
-					else if(JSONConstants.VMDEATH.equals(type)) {
-						List requests = eventRequestManager.vmDeathRequests();
-						for (Iterator iter = requests.iterator(); iter.hasNext();) {
-							VMDeathRequest request = (VMDeathRequest) iter.next();
-							if(request.isEnabled()) {
-								eventSet.add(new VMDeathEventImpl(vm, request));
-							}
-						}
-					}
-				}
-				if (eventSet.isEmpty()) {
-					eventSet.resume();
-					continue;
-				}
-				return eventSet;
-			}
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		} catch (DisconnectedException e) {
-			vm.disconnectVM();
-			handleException(e.getMessage(), e);
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java
deleted file mode 100644
index 5d57522..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import java.util.HashSet;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventSet}
- * 
- * @since 1.0
- */
-public final class EventSetImpl extends HashSet implements EventSet {
-
-	private static final long serialVersionUID = 1L;
-	private VirtualMachineImpl vm;
-	private ThreadReferenceImpl thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventSetImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#resume()
-	 */
-	public void resume() {
-		if (thread == null) {
-			vm.resume();
-		}
-		else {
-			thread.resume();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#suspended()
-	 */
-	public boolean suspended() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-
-	/**
-	 * @param thread
-	 */
-	public void setThread(ThreadReferenceImpl thread) {
-		this.thread = thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java
deleted file mode 100644
index 1abd72e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ExceptionEvent}
- * 
- * @since 1.0
- */
-public final class ExceptionEventImpl extends LocatableEventImpl implements ExceptionEvent {
-
-	private final String message;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param message
-	 * @param request
-	 */
-	public ExceptionEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, String message, ExceptionRequest request) {
-		super(vm, thread, location, request);
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent#message()
-	 */
-	public String message() {
-		return message;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java
deleted file mode 100644
index 7da853c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link LocatableEvent}
- * 
- * @since 1.0
- */
-public class LocatableEventImpl extends EventImpl implements LocatableEvent {
-
-	protected ThreadReference thread = null;
-	protected Location location = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public LocatableEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, EventRequest request) {
-		super(vm, request);
-		this.thread = thread;
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return this.location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return this.thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ResumeEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ResumeEventImpl.java
deleted file mode 100644
index d87d0f3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ResumeEventImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ResumeEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ResumeEvent}
- * @since 1.1
- */
-public class ResumeEventImpl extends LocatableEventImpl implements ResumeEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public ResumeEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, EventRequest request) {
-		super(vm, thread, location, request);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java
deleted file mode 100644
index 7c36b04..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ScriptLoadEvent}
- * 
- * @since 1.0
- */
-public final class ScriptLoadEventImpl extends LocatableEventImpl implements ScriptLoadEvent {
-
-	private final ScriptReferenceImpl script;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param script
-	 * @param request
-	 */
-	public ScriptLoadEventImpl(VirtualMachineImpl vm, ThreadReference thread, ScriptReferenceImpl script, ScriptLoadRequest request) {
-		super(vm, thread, null, request);
-		this.script = script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent#script()
-	 */
-	public ScriptReference script() {
-		return script;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java
deleted file mode 100644
index 7f0999c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.StepEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link StepEvent}
- * 
- * @since 1.0
- */
-public final class StepEventImpl extends LocatableEventImpl implements StepEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public StepEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, StepRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java
deleted file mode 100644
index 2524a70..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link SuspendEvent}
- * 
- * @since 1.0
- */
-public final class SuspendEventImpl extends LocatableEventImpl implements SuspendEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public SuspendEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, SuspendRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java
deleted file mode 100644
index 1f83fe2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadEnterEvent}
- * 
- * @since 1.0
- */
-public final class ThreadEnterEventImpl extends LocatableEventImpl implements ThreadEnterEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param request
-	 */
-	public ThreadEnterEventImpl(VirtualMachineImpl vm, ThreadReference thread, ThreadEnterRequest request) {
-		super(vm, thread, null, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java
deleted file mode 100644
index 4edbc4c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadExitEvent}
- * 
- * @since 1.0
- */
-public final class ThreadExitEventImpl extends LocatableEventImpl implements ThreadExitEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param request
-	 */
-	public ThreadExitEventImpl(VirtualMachineImpl vm, ThreadReference thread, ThreadExitRequest request) {
-		super(vm, thread, null, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java
deleted file mode 100644
index 2363f44..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of a {@link VMDeathEvent}
- * 
- * @since 1.0
- */
-public class VMDeathEventImpl extends EventImpl implements VMDeathEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public VMDeathEventImpl(VirtualMachineImpl vm, EventRequest request) {
-		super(vm, request);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties
deleted file mode 100644
index ec56f59..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-ArrayReferenceImpl_array_count_=Array [{0}]
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java
deleted file mode 100644
index 7f11c0e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Rhino implementation of {@link BreakpointRequest}
- * 
- * @since 1.0
- */
-public class BreakpointRequestImpl extends EventRequestImpl implements BreakpointRequest {
-
-	private final Location location;
-	private ThreadReference thread;
-	private String condition;
-	private Long breakpointId;
-	private int hitcount = 0;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param location
-	 */
-	public BreakpointRequestImpl(VirtualMachineImpl vm, Location location) {
-		super(vm);
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
-	 */
-	public synchronized void addConditionFilter(String condition) {
-		checkDeleted();
-		this.condition = condition;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
-	 */
-	public void addHitCountFilter(int hitcount) {
-		checkDeleted();
-		this.hitcount = hitcount;
-	}
-
-	/**
-	 * Returns the condition for this breakpoint
-	 * 
-	 * @return the condition
-	 */
-	public synchronized String condition() {
-		return condition;
-	}
-
-	/**
-	 * Returns the hit count for the breakpoint
-	 * 
-	 * @return the hit count for the breakpoint
-	 */
-	public synchronized int hitcount() {
-		return this.hitcount;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return this.location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		if (this.enabled == enabled) {
-			return;
-		}
-		if (enabled) {
-			ScriptReferenceImpl scriptReferenceImpl = (ScriptReferenceImpl) this.location.scriptReference();
-			Long scriptId = scriptReferenceImpl.getScriptId();
-			RhinoRequest request = new RhinoRequest(JSONConstants.SETBREAKPOINT);
-			request.getArguments().put(JSONConstants.SCRIPT_ID, scriptId);
-			request.getArguments().put(JSONConstants.CONDITION, this.condition);
-			if (this.location.functionName() != null) {
-				request.getArguments().put(JSONConstants.FUNCTION, this.location.functionName());
-			}
-			else{
-				request.getArguments().put(JSONConstants.LINE, new Integer(this.location.lineNumber()));
-			}
-			try {
-				RhinoResponse response = this.vm.sendRequest(request);
-				if(response.isSuccess()) {
-					Map body = (Map) response.getBody().get(JSONConstants.BREAKPOINT);
-					Number id = (Number) body.get(JSONConstants.BREAKPOINT_ID);
-					this.breakpointId = new Long(id.longValue());
-				}
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			}
-		} else {
-			RhinoRequest request = new RhinoRequest(JSONConstants.CLEARBREAKPOINT);
-			request.getArguments().put(JSONConstants.BREAKPOINT_ID, breakpointId);
-			try {
-				vm.sendRequest(request);
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			}
-			breakpointId = null;
-		}
-		this.enabled = enabled;
-	}
-
-	/**
-	 * Returns the id reported back from the underlying {@link VirtualMachine} for this breakpoint
-	 * 
-	 * @return the id of the breakpoint
-	 */
-	public Long breakpointId() {
-		return this.breakpointId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java
deleted file mode 100644
index 55c13ec..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link DebuggerStatementRequest}
- * 
- * @since 1.0
- */
-public class DebuggerStatementRequestImpl extends EventRequestImpl implements DebuggerStatementRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public DebuggerStatementRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * The underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		this.enabled = enabled;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java
deleted file mode 100644
index c230638..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventRequest}
- * 
- * @since 1.0
- */
-public class EventRequestImpl extends MirrorImpl implements EventRequest {
-
-	private boolean deleted = false;
-	protected boolean enabled = false;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#isEnabled()
-	 */
-	public synchronized boolean isEnabled() {
-		return enabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		this.enabled = enabled;
-	}
-
-	/**
-	 * If the delete flag is set throw an {@link IllegalStateException}
-	 * @throws IllegalStateException
-	 */
-	protected void checkDeleted() throws IllegalStateException {
-		if (deleted) {
-			throw new IllegalStateException("deleted"); //$NON-NLS-1$
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-
-	/**
-	 * delete the request by setting it disabled and setting the delet flag 
-	 */
-	public synchronized void delete() {
-		setEnabled(false);
-		deleted = true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java
deleted file mode 100644
index 83252f2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventRequestManager}
- * 
- * @since 1.0
- */
-public final class EventRequestManagerImpl implements EventRequestManager {
-
-	private final Map eventsMap = new HashMap();
-	private final List breakpointRequests = new ArrayList();
-	private final List exceptionRequests = new ArrayList();
-	private final List debuggerStatementRequests = new ArrayList();
-	private final List scriptLoadRequests = new ArrayList();
-	private final List stepRequests = new ArrayList();
-	private final List suspendRequests = new ArrayList();
-	private final List resumeRequests = new ArrayList();
-	private final List threadEnterRequests = new ArrayList();
-	private final List threadExitRequests = new ArrayList();
-	private final List vmDeathRequests = new ArrayList();
-	private final List vmDisconnectRequests = new ArrayList();
-	private final VirtualMachineImpl vm;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public EventRequestManagerImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-		eventsMap.put(BreakpointRequestImpl.class, breakpointRequests);
-		eventsMap.put(DebuggerStatementRequestImpl.class, debuggerStatementRequests);
-		eventsMap.put(ExceptionRequestImpl.class, exceptionRequests);
-		eventsMap.put(ScriptLoadRequestImpl.class, scriptLoadRequests);
-		eventsMap.put(StepRequestImpl.class, stepRequests);
-		eventsMap.put(SuspendRequestImpl.class, suspendRequests);
-		eventsMap.put(ResumeRequestImpl.class, resumeRequests);
-		eventsMap.put(ThreadEnterRequestImpl.class, threadEnterRequests);
-		eventsMap.put(ThreadExitRequestImpl.class, threadExitRequests);
-		eventsMap.put(VMDeathRequestImpl.class, vmDeathRequests);
-		eventsMap.put(VMDisconnectRequestImpl.class, vmDisconnectRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createBreakpointRequest(org.eclipse.wst.jsdt.debug.core.jsdi.Location)
-	 */
-	public synchronized BreakpointRequest createBreakpointRequest(Location location) {
-		BreakpointRequestImpl request = new BreakpointRequestImpl(vm, location);
-		breakpointRequests.add(request);
-		return request;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#debuggerStatementRequests()
-	 */
-	public synchronized List debuggerStatementRequests() {
-		return Collections.unmodifiableList(debuggerStatementRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createDebuggerStatementRequest()
-	 */
-	public synchronized DebuggerStatementRequest createDebuggerStatementRequest() {
-		DebuggerStatementRequestImpl request = new DebuggerStatementRequestImpl(vm);
-		debuggerStatementRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#breakpointRequests()
-	 */
-	public synchronized List breakpointRequests() {
-		return Collections.unmodifiableList(breakpointRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createExceptionRequest()
-	 */
-	public synchronized ExceptionRequest createExceptionRequest() {
-		ExceptionRequest request = new ExceptionRequestImpl(vm);
-		exceptionRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#exceptionRequests()
-	 */
-	public synchronized List exceptionRequests() {
-		return Collections.unmodifiableList(exceptionRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createScriptLoadRequest()
-	 */
-	public synchronized ScriptLoadRequest createScriptLoadRequest() {
-		ScriptLoadRequest request = new ScriptLoadRequestImpl(vm);
-		scriptLoadRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#scriptLoadRequests()
-	 */
-	public synchronized List scriptLoadRequests() {
-		return Collections.unmodifiableList(scriptLoadRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createStepRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference, int)
-	 */
-	public synchronized StepRequest createStepRequest(ThreadReference thread, int step) {
-		StepRequest request = new StepRequestImpl(vm, thread, step);
-		stepRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#stepRequests()
-	 */
-	public synchronized List stepRequests() {
-		return Collections.unmodifiableList(stepRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createSuspendRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized SuspendRequest createSuspendRequest(ThreadReference thread) {
-		SuspendRequest request = new SuspendRequestImpl(vm, thread);
-		suspendRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#suspendRequests()
-	 */
-	public synchronized List suspendRequests() {
-		return Collections.unmodifiableList(suspendRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createResumeRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public ResumeRequest createResumeRequest(ThreadReference thread) {
-		ResumeRequestImpl request = new ResumeRequestImpl(vm, thread);
-		resumeRequests.add(request);
-		return request;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#resumeRequests()
-	 */
-	public List resumeRequests() {
-		return Collections.unmodifiableList(resumeRequests);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadEnterRequest()
-	 */
-	public synchronized ThreadEnterRequest createThreadEnterRequest() {
-		ThreadEnterRequest request = new ThreadEnterRequestImpl(vm);
-		threadEnterRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadEnterRequests()
-	 */
-	public List threadEnterRequests() {
-		return Collections.unmodifiableList(threadEnterRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadExitRequest()
-	 */
-	public synchronized ThreadExitRequest createThreadExitRequest() {
-		ThreadExitRequest request = new ThreadExitRequestImpl(vm);
-		threadExitRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadExitRequests()
-	 */
-	public List threadExitRequests() {
-		return Collections.unmodifiableList(threadExitRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	public synchronized void deleteEventRequest(EventRequest eventRequest) {
-		Class clazz = eventRequest.getClass();
-		List eventList = (List) eventsMap.get(clazz);
-		if (eventList == null) {
-			throw new IllegalArgumentException(
-					"bad event request class - " + clazz.getName()); //$NON-NLS-1$
-		}
-		eventList.remove(eventRequest);
-		EventRequestImpl eventRequestImpl = (EventRequestImpl) eventRequest;
-		eventRequestImpl.delete();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(java.util.List)
-	 */
-	public synchronized void deleteEventRequest(List eventRequests) {
-		for (Iterator iterator = eventRequests.iterator(); iterator.hasNext();) {
-			EventRequest eventRequest = (EventRequest) iterator.next();
-			deleteEventRequest(eventRequest);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDeathRequest()
-	 */
-	public VMDeathRequest createVMDeathRequest() {
-		VMDeathRequest request = new VMDeathRequestImpl(this.vm);
-		this.vmDeathRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDeathRequests()
-	 */
-	public List vmDeathRequests() {
-		return Collections.unmodifiableList(vmDeathRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDisconnectRequest()
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest() {
-		VMDisconnectRequest request = new VMDisconnectRequestImpl(this.vm);
-		this.vmDisconnectRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDisconnectRequests()
-	 */
-	public List vmDisconnectRequests() {
-		return Collections.unmodifiableList(vmDisconnectRequests);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java
deleted file mode 100644
index 11ab789..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ExceptionRequest}
- * 
- * @since 1.0
- */
-public class ExceptionRequestImpl extends EventRequestImpl implements ExceptionRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ExceptionRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * The underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ResumeRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ResumeRequestImpl.java
deleted file mode 100644
index a7fdee0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ResumeRequestImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ResumeRequest}
- * 
- * @since 1.1
- */
-public class ResumeRequestImpl extends EventRequestImpl implements ResumeRequest {
-
-	private final ThreadReference thread;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 */
-	public ResumeRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java
deleted file mode 100644
index 3b8857d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ScriptLoadRequest}
- * 
- * @since 1.0
- */
-public class ScriptLoadRequestImpl extends EventRequestImpl implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ScriptLoadRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java
deleted file mode 100644
index f72490a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link StepRequest}
- * 
- * @since 1.0
- */
-public class StepRequestImpl extends EventRequestImpl implements StepRequest {
-
-	private final ThreadReferenceImpl thread;
-	private final int step;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param step
-	 */
-	public StepRequestImpl(VirtualMachineImpl vm, ThreadReference thread, int step) {
-		super(vm);
-		this.thread = (ThreadReferenceImpl) thread;
-		this.step = step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#step()
-	 */
-	public int step() {
-		return step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		if (this.enabled == enabled) {
-			return;
-		}
-		if (enabled) {
-			String stepType = null;
-			if (step == STEP_INTO) {
-				stepType = JSONConstants.STEP_IN;
-			}
-			else if (step == STEP_OVER) {
-				stepType = JSONConstants.STEP_NEXT;
-			}
-			else if (step == STEP_OUT) {
-				stepType = JSONConstants.STEP_OUT;
-			}
-			if (thread.getStep() != null) {
-				throw new IllegalStateException("duplicate step"); //$NON-NLS-1$
-			}
-			thread.setStep(stepType);
-		} else {
-			thread.setStep(null);
-		}
-		this.enabled = enabled;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java
deleted file mode 100644
index 3a499d2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link SuspendRequest}
- * 
- * @since 1.0
- */
-public class SuspendRequestImpl extends EventRequestImpl implements SuspendRequest {
-
-	private final ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 */
-	public SuspendRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java
deleted file mode 100644
index 4240d4d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadEnterRequest}
- * 
- * @since 1.0
- */
-public class ThreadEnterRequestImpl extends EventRequestImpl implements ThreadEnterRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadEnterRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Return the underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java
deleted file mode 100644
index 16f45ef..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadExitRequest}
- * 
- * @since 1.0
- */
-public class ThreadExitRequestImpl extends EventRequestImpl implements ThreadExitRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadExitRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java
deleted file mode 100644
index 153cde2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation for a {@link VMDeathRequest}
- * 
- * @since 1.0
- */
-public class VMDeathRequestImpl extends EventRequestImpl implements VMDeathRequest {
-
-	/**
-	 * Constructor 
-	 * @param vm
-	 */
-	public VMDeathRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java
deleted file mode 100644
index 7beb14f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link VMDisconnectRequest}
- * 
- * @since 1.0
- */
-public class VMDisconnectRequestImpl extends EventRequestImpl implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public VMDisconnectRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/.classpath b/bundles/org.eclipse.wst.jsdt.debug.transport/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/.project b/bundles/org.eclipse.wst.jsdt.debug.transport/.project
deleted file mode 100644
index e37a4fc..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.transport</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.transport/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.transport/META-INF/MANIFEST.MF
deleted file mode 100644
index 3727843..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.transport
-Bundle-Version: 1.0.0.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-Vendor: %providerName
-Export-Package: org.eclipse.wst.jsdt.debug.transport,
- org.eclipse.wst.jsdt.debug.transport.exception,
- org.eclipse.wst.jsdt.debug.transport.packet,
- org.eclipse.wst.jsdt.debug.transport.socket
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.transport/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 6acca3c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName = Eclipse Web Tools Platform
-Bundle-Name = Debug Transport
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/about.html b/bundles/org.eclipse.wst.jsdt.debug.transport/about.html
deleted file mode 100644
index b3906a9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/about.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>April 20, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<h3>Third Party Content</h3>
-
-<p>The Content includes items that have been sourced from third parties as set out below. If you 
-did not receive this Content directly from the Eclipse Foundation, the following is provided 
-for informational purposes only, and you should look to the Redistributor&rsquo;s license for 
-terms and conditions of use.</p>
-
-<h4>Ispell 3.1.20</h4>
-
-<p>The plug-in is accompanied by software developed by Geoff Kuenning.  The following files:</p>
-<ul>
-	<li>dictionaries/en_US.dictionary</li>
-	<li>dictionaries/en_GB.dictionary</li>
-</ul>
-
-<p>are based on Ispell 3.1.20.  The home page for Ispell is located at <a href="http://lasr.cs.ucla.edu/geoff/ispell.html" target="_blank">http://lasr.cs.ucla.edu/geoff/ispell.html</a>.</p>
-
-<p>Your use of Ispell 3.1.20 in the plug-in is subject to the terms and conditions of the Ispell license.  A copy of the Ispell license is included in
-<a href="about_files/ispell-license.txt" target="_blank">about_files/ispell-license.txt</a> and is also reproduced below:</p>
-
-<blockquote>
-  Copyright 1993, Geoff Kuenning, Granada Hills, CA<br />
-  All rights reserved.<br />
-<br />
-  Redistribution and use in source and binary forms, with or without<br />
-  modification, are permitted provided that the following conditions<br />
-  are met:<br />
-<br />
-  1. Redistributions of source code must retain the above copyright<br />
-     notice, this list of conditions and the following disclaimer.<br />
-  2. Redistributions in binary form must reproduce the above copyright<br />
-     notice, this list of conditions and the following disclaimer in the<br />
-     documentation and/or other materials provided with the distribution.<br />
-  3. All modifications to the source code must be clearly marked as<br />
-     such.  Binary redistributions based on modified source code<br />
-     must be clearly marked as modified versions in the documentation<br />
-     and/or other materials provided with the distribution.<br />
-  4. All advertising materials mentioning features or use of this software<br />
-     must display the following acknowledgment:<br />
-     This product includes software developed by Geoff Kuenning and<br />
-     other unpaid contributors.<br />
-  5. The name of Geoff Kuenning may not be used to endorse or promote<br />
-     products derived from this software without specific prior<br />
-     written permission.<br />
-<br />
-  THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING AND CONTRIBUTORS ``AS<br />
-  IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br />
-  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS<br />
-  FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GEOFF<br />
-  KUENNING OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,<br />
-  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,<br />
-  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;<br />
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER<br />
-  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT<br />
-  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN<br />
-  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE<br />
-  POSSIBILITY OF SUCH DAMAGE.<br />
-</blockquote>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/build.properties b/bundles/org.eclipse.wst.jsdt.debug.transport/build.properties
deleted file mode 100644
index 050eb13..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/l10n/bundle.properties,\
-               about.html
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Connection.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Connection.java
deleted file mode 100644
index cf94046..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Connection.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-import java.io.IOException;
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-
-/**
- * Describes a connection to a debugger.
- * <br><br>
- * This interface is intended to be implemented by clients.
- * A default implementation for {@link Socket} communication is provided
- * in the class {@link SocketConnection}.
- * 
- * @since 1.0
- */
-public interface Connection {
-
-	/**
-	 * Returns if the connection is open.
-	 * 
-	 * @return <code>true</code> if the connection is open <code>false</code> otherwise
-	 */
-	public boolean isOpen();
-
-	/**
-	 * Closes the connection.
-	 * 
-	 * @throws IOException if the connection failed to close or is already closed
-	 */
-	public void close() throws IOException;
-
-	/**
-	 * Writes the given packet to the connection
-	 * 
-	 * @param packet the packet to write, <code>null</code> is not accepted
-	 * @throws IOException if the write failed
-	 */
-	public void writePacket(Packet packet) throws IOException;
-
-	/**
-	 * Reads the next packet from the connection. This is non-blocking.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>.
-	 * 
-	 * @return the next {@link Packet} from the connection
-	 * @throws IOException if the connection is prematurely closed or the read failed
-	 */
-	public Packet readPacket() throws IOException;
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Constants.java
deleted file mode 100644
index 08810a7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Constants.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-/**
- * Common constants
- * 
- * @since 1.0
- * 
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface Constants {
-	/**
-	 * Constant representing a colon<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant for the text representation of localhost<br>
-	 * <br>
-	 * Value is: <code>localhost</code>
-	 */
-	public static final String LOCALHOST = "localhost"; //$NON-NLS-1$
-	/**
-	 * Constant for the IP address representation of localhost<br>
-	 * <br>
-	 * Value is: <code>127.0.0.1</code> 
-	 */
-	public static final String LOCALHOST_IP = "127.0.0.1"; //$NON-NLS-1$
-	/**
-	 * "port" constant<br>
-	 * <br>
-	 * Value is: <code>port</code>
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant<br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/DebugSession.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/DebugSession.java
deleted file mode 100644
index dab4f85..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/DebugSession.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketReceiveManager;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketSendManager;
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * A {@link DebugSession} controls a {@link PacketSendManager} and {@link PacketReceiveManager}
- * that is used to communicate to a debug target using the underlying {@link Connection}
- * 
- * @since 1.0
- */
-public class DebugSession {
-	
-	/**
-	 * The default receive manager
-	 */
-	private final PacketReceiveManager packetReceiveManager;
-	/**
-	 * The default send manager
-	 */
-	private final PacketSendManager packetSendManager;
-
-	/**
-	 * Constructor
-	 * 
-	 * Starts the send / receive managers on the given {@link Connection}.
-	 * 
-	 * @param connection
-	 */
-	public DebugSession(Connection connection) {
-		packetReceiveManager = new PacketReceiveManager(connection);
-		Thread receiveThread = new Thread(packetReceiveManager, "Debug Session - Receive Manager"); //$NON-NLS-1$
-		receiveThread.setDaemon(true);
-
-		packetSendManager = new PacketSendManager(connection);
-		Thread sendThread = new Thread(packetSendManager, "Debug Session - Send Manager"); //$NON-NLS-1$
-		sendThread.setDaemon(true);
-
-		packetReceiveManager.setPartnerThread(sendThread);
-		packetSendManager.setPartnerThread(receiveThread);
-
-		receiveThread.start();
-		sendThread.start();
-	}
-
-	/**
-	 * Stops the debug sessions and disconnects the send / receive managers
-	 */
-	public void dispose() {
-		packetReceiveManager.disconnect();
-		packetSendManager.disconnect();
-	}
-
-	/**
-	 * Sends the given {@link Packet} using the underlying {@link PacketSendManager}.
-	 * 
-	 * @param packet the {@link Packet} to send, <code>null</code> is not accepted
-	 * @throws DisconnectedException if the {@link PacketSendManager} has been disconnected
-	 */
-	public void send(Packet packet) throws DisconnectedException {
-		if(packet == null) {
-			throw new IllegalArgumentException("You cannot send a null request"); //$NON-NLS-1$
-		}
-		packetSendManager.sendPacket(packet);
-	}
-	
-	/**
-	 * Waits for the given timeout for a {@link Response} response in the given sequence 
-	 * from the {@link PacketReceiveManager}.<br>
-	 * <br>
-	 * This method does not return <code>null</code> - one of the listed exceptions will be thrown 
-	 * if a {@link Response} cannot be returned.
-	 * 
-	 * @param timeout the amount of time in milliseconds to wait to a {@link Response}
-	 * @return a new {@link Response} from the {@link PacketReceiveManager} never <code>null</code>
-	 * @throws TimeoutException if the timeout lapses with no {@link Response} returned
-	 * @throws DisconnectedException if the {@link PacketReceiveManager} has been disconnected
-	 */
-	public Response receiveResponse(int requestSequence, int timeout) throws TimeoutException, DisconnectedException {
-		return packetReceiveManager.getResponse(requestSequence, timeout);
-	}
-
-	/**
-	 * Waits for the given timeout for a {@link Packet} from the {@link PacketReceiveManager}.
-	 * If a {@link Packet} is returned it is guaranteed it can be cast to the type asked for.
-	 * <br><br>
-	 * This method does not return <code>null</code> - one of the listed exceptions will be thrown 
-	 * if a {@link Packet} cannot be returned.
-	 * 
-	 * @param type the type of the packet to get
-	 * @param timeout the amount of time in milliseconds to wait for a {@link Packet}
-	 * 
-	 * @return a new {@link Packet} from the {@link PacketReceiveManager} never <code>null</code>
-	 * @throws TimeoutException if the timeout lapses with no {@link Packet} returned
-	 * @throws DisconnectedException if the {@link PacketReceiveManager} has been disconnected
-	 */
-	public Packet receive(String type, int timeout) throws TimeoutException, DisconnectedException {
-		return packetReceiveManager.getCommand(type, timeout);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/ListenerKey.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/ListenerKey.java
deleted file mode 100644
index b0e24d7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/ListenerKey.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.wst.jsdt.debug.transport;
-
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketListenerKey;
-
-/**
- * Describes a key for a {@link TransportService} that uniquely identifies an address to communicate with.
- * <br><br>
- * This interface is intended to be implemented by clients. A default
- * implementation for {@link Socket} communication is provided in the class
- * {@link SocketListenerKey}.
- * 
- * @since 1.0
- */
-public interface ListenerKey {
-	/**
-	 * Returns the address string for the listener.
-	 * <br><br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the address to try and communicate with, never <code>null</code>
-	 */
-	public String address();
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/TransportService.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/TransportService.java
deleted file mode 100644
index af0d79a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/TransportService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-import java.io.IOException;
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService;
-
-/**
- * A transport service is used to attach and / or listen to a 
- * {@link Connection}.
- * <br><br>
- * This interface is intended to be implemented by clients.
- * A default implementation for {@link Socket} communication is provided in
- * the class {@link SocketTransportService}.
- * 
- * @since 1.0
- */
-public interface TransportService {
-
-	/**
-	 * Registers that this service should begin listening to the given address
-	 * 
-	 * @param address the address to listen on - e.g. localhost:12000
-	 * @return the key that uniquely identifies this service
-	 * @throws IOException
-	 */
-	public ListenerKey startListening(String address) throws IOException;
-
-	/**
-	 * Stops listening for the given key
-	 * 
-	 * @param listenerKey
-	 * @throws IOException
-	 */
-	public void stopListening(ListenerKey listenerKey) throws IOException;
-
-	/**
-	 * Listens for a {@link Connection} to be made to and accepts it. The method can block until a {@link Connection} is made.
-	 * 
-	 * @param listenerKey
-	 * @param attachTimeout
-	 * @param handshakeTimeout
-	 * @return the resulting {@link Connection}
-	 * @throws IOException
-	 */
-	public Connection accept(ListenerKey listenerKey, long attachTimeout, long handshakeTimeout) throws IOException;
-
-	/**
-	 * Attaches to the given address and returns the resulting {@link Connection}. This method can block until a {@link Connection} is made
-	 * 
-	 * @param address
-	 * @param attachTimeout
-	 * @param handshakeTimeout
-	 * @return the resulting {@link Connection}
-	 * @throws IOException
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException;
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/DisconnectedException.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/DisconnectedException.java
deleted file mode 100644
index fc69a5c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/DisconnectedException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.exception;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketReceiveManager;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketSendManager;
-
-/**
- * A {@link DisconnectedException} is thrown by either the {@link PacketSendManager}
- * or the {@link PacketReceiveManager} when a request is made and they have been disconnected
- * 
- * @since 1.0
- */
-public final class DisconnectedException extends Exception {
-
-	private static final long serialVersionUID = 3233213787459625769L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param message
-	 * @param exception
-	 */
-	public DisconnectedException(String message, Exception exception) {
-		super(message, exception);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/TimeoutException.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/TimeoutException.java
deleted file mode 100644
index 052dde8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/TimeoutException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.exception;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketReceiveManager;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketSendManager;
-
-/**
- * This exception is thrown if the {@link PacketSendManager} or {@link PacketReceiveManager}
- * times out while waiting for a {@link Packet}
- * 
- * @since 1.0
- */
-public final class TimeoutException extends Exception {
-	
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param message the message for the exception
-	 */
-	public TimeoutException(String message) {
-		super(message);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Event.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Event.java
deleted file mode 100644
index 61d9194..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Event.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.util.Map;
-
-/**
- * Describes the general form of an event {@link Packet}
- * 
- * @since 1.0
- */
-public interface Event extends Packet {
-	/**
-	 * Returns the name of the event.
-	 * <br><br>
-	 * This method cannot return <code>null</code>.
-	 * 
-	 * @return the name of the event
-	 */
-	public String getEvent();
-
-	/**
-	 * Returns the body of the {@link Event}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>, if there is no body
-	 * an empty {@link Map} is returned.
-	 *  
-	 * @return the body of the {@link Event} or an empty {@link Map} never <code>null</code>
-	 */
-	public Map getBody();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Packet.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Packet.java
deleted file mode 100644
index 87e7d3a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Packet.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.util.Map;
-
-/**
- * Describes the general form of a packet
- * 
- * @since 1.0
- */
-public interface Packet {
-
-	/**
-	 * Returns the type of this packet. Where a <code>type</code> can be any string describing the type of
-	 * packet this is. For example a type could be <code>request</code> or <code>response</code>.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the type, never <code>null</code>
-	 */
-	public String getType();
-	
-	/**
-	 * Returns the JSON representation of this packet. 
-	 * Implementors are free to compose the JSON however they wish.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * @return the composed JSON map
-	 */
-	public Map toJSON();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketManager.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketManager.java
deleted file mode 100644
index d93fe02..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketManager.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.io.IOException;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-
-/**
- * Default manager for sending / receiving packets to / from the connected {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public abstract class PacketManager implements Runnable {
-
-	/**
-	 * Connector that performs IO to Virtual Machine.
-	 */
-	private final Connection connection;
-	/**
-	 * Thread that handles the communication the other way (e.g. if we are sending, the receiving thread).
-	 */
-	private volatile Thread partnerThread;
-	/**
-	 * The disconnected exception, if there is one
-	 */
-	private volatile IOException disconnectedException;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param connection the connection to communicate on, <code>null</code> is not accepted
-	 */
-	protected PacketManager(Connection connection) {
-		if(connection == null) {
-			throw new IllegalArgumentException("You cannot create a new PacketManager with a null Connection"); //$NON-NLS-1$
-		}
-		this.connection = connection;
-	}
-
-	/**
-	 * Returns the {@link Connection} this manager is communicating on.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the backing {@link Connection} to the {@link VirtualMachine}
-	 */
-	public Connection getConnection() {
-		return this.connection;
-	}
-
-	/**
-	 * Used to indicate that an IO exception occurred, closes the {@link Connection} 
-	 * to the {@link VirtualMachine}.
-	 * 
-	 * @param disconnectedException the IOException that occurred or <code>null</code>
-	 */
-	public void disconnect(IOException exception) {
-		this.disconnectedException = exception;
-		disconnect();
-	}
-
-	/**
-	 * Closes the {@link Connection} to the {@link VirtualMachine}.
-	 */
-	public void disconnect() {
-		try {
-			this.connection.close();
-		} catch (IOException e) {
-			this.disconnectedException = e;
-		}
-		if (this.partnerThread != null) {
-			this.partnerThread.interrupt();
-		}
-	}
-
-	/**
-	 * Returns if the manager is disconnected or not.
-	 * 
-	 * @return <code>true</code> if the manager is disconnected false otherwise
-	 */
-	public boolean isDisconnected() {
-		return this.connection == null || !this.connection.isOpen();
-	}
-
-	/**
-	 * Returns the underlying {@link IOException} from a disconnect.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the manager has not been disconnected
-	 * 
-	 * @return the underlying {@link IOException} from a disconnect or <code>null</code> if none
-	 */
-	public IOException getDisconnectedException() {
-		return this.disconnectedException;
-	}
-
-	/**
-	 * Assigns thread of partner, to be notified if we have an {@link IOException}.
-	 * 
-	 * @param thread the new partner thread, <code>null</code> is not accepted
-	 */
-	public void setPartnerThread(Thread thread) {
-		if(thread == null) {
-			throw new IllegalArgumentException("You cannot send a null partner thread on the PacketManager"); //$NON-NLS-1$
-		}
-		this.partnerThread = thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketReceiveManager.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketReceiveManager.java
deleted file mode 100644
index 2b75a32..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketReceiveManager.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Default implementation of {@link PacketManager} for receiving packets from the 
- * {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public final class PacketReceiveManager extends PacketManager {
-
-	/**
-	 * Generic timeout value for not blocking. <br>
-	 * Value is: <code>0</code>
-	 */
-	public static final int TIMEOUT_NOT_BLOCKING = 0;
-	/**
-	 * Generic timeout value for infinite timeout. <br>
-	 * Value is: <code>-1</code>
-	 */
-	public static final int TIMEOUT_INFINITE = -1;
-	/**
-	 * List of Command packets received from Virtual Machine.
-	 */
-	private List commandPackets = new LinkedList();
-	/**
-	 * List of Reply packets received from Virtual Machine.
-	 */
-	private List responsePackets = new LinkedList();
-	/**
-	 * List of Packets that have timed out already. Maintained so that responses can be discarded if/when they are received.
-	 */
-	private List timedOutPackets = new ArrayList();
-
-	/**
-	 * Constructor
-	 * 
-	 * @param connection the underlying connection to communicate on, <code>null</code> is not accepted
-	 */
-	public PacketReceiveManager(Connection connection) {
-		super(connection);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.PacketManager#disconnect()
-	 */
-	public void disconnect() {
-		super.disconnect();
-		synchronized (this.commandPackets) {
-			this.commandPackets.notifyAll();
-		}
-		synchronized (this.responsePackets) {
-			this.responsePackets.notifyAll();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		try {
-			while (!isDisconnected()) {
-				// Read a packet from the input stream.
-				readAvailablePacket();
-			}
-		}
-		// if the remote runtime is interrupted, drop the connection and clean up, don't wait for it to happen on its own
-		catch (InterruptedIOException e) {
-			disconnect(e);
-		} catch (IOException e) {
-			disconnect(e);
-		}
-	}
-
-	/**
-	 * Returns a specified command {@link Packet} from the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> an exception is thrown if the desired packet cannot
-	 * be returned.
-	 * 
-	 * @param type the type of the packet to get
-	 * @param timeToWait the amount of time to wait for the {@link Packet} to arrive
-	 * 
-	 * @return the specified command packet never <code>null</code>
-	 * @throws TimeoutException if the request times out
-	 * @throws DisconnectedException if the manager is disconnected
-	 */
-	public Packet getCommand(String type, long timeToWait) throws TimeoutException, DisconnectedException {
-		synchronized (this.commandPackets) {
-			long remainingTime = timeToWait;
-			// Wait until command is available.
-			//even if disconnected try to send the remaining events
-			while (!isDisconnected() || !this.commandPackets.isEmpty()) {
-				Packet packet = removeCommandPacket(type);
-				if (packet != null)
-					return packet;
-
-				if (remainingTime < 0 && timeToWait != TIMEOUT_INFINITE)
-					break;
-
-				long timeBeforeWait = System.currentTimeMillis();
-				try {
-					waitForPacketAvailable(remainingTime, this.commandPackets);
-				} catch (InterruptedException e) {
-					break;
-				}
-				long waitedTime = System.currentTimeMillis() - timeBeforeWait;
-				remainingTime -= waitedTime;
-			}
-		}
-		// Check for an IO Exception.
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-		// Check for a timeout.
-		throw new TimeoutException("Timed out waiting for command packet: " + type); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns a specified response packet from the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> an exception is thrown if the desired response cannot
-	 * be returned.
-	 * 
-	 * @param requestSequence the sequence of the response to acquire
-	 * @param timeToWait the amount of time to wait for the {@link Response}
-	 * 
-	 * @return a specified response packet from the {@link VirtualMachine} never <code>null</code>
-	 * @throws TimeoutException if the request times out
-	 * @throws DisconnectedException if the manager is disconnected
-	 */
-	public Response getResponse(int requestSequence, long timeToWait) throws TimeoutException, DisconnectedException {
-		synchronized (this.responsePackets) {
-			long remainingTime = timeToWait;
-			// Wait until command is available.
-			while (!isDisconnected()) {
-				Response response = removeResponsePacket(requestSequence);
-				if (response != null)
-					return response;
-
-				if (remainingTime < 0 && timeToWait != TIMEOUT_INFINITE)
-					break;
-
-				long timeBeforeWait = System.currentTimeMillis();
-				try {
-					waitForPacketAvailable(remainingTime, this.responsePackets);
-				} catch (InterruptedException e) {
-					break;
-				}
-				long waitedTime = System.currentTimeMillis() - timeBeforeWait;
-				remainingTime -= waitedTime;
-			}
-		}
-		// Check for an IO Exception.
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-
-		synchronized (this.responsePackets) {
-			this.timedOutPackets.add(new Integer(requestSequence));
-		}
-		throw new TimeoutException("Timed out waiting for packet: " + requestSequence); //$NON-NLS-1$
-	}
-
-	/**
-	 * Wait for an available packet from the Virtual Machine.
-	 */
-	private void waitForPacketAvailable(long timeToWait, Object lock) throws InterruptedException {
-		if (timeToWait == 0)
-			return;
-		else if (timeToWait < 0)
-			lock.wait();
-		else
-			lock.wait(timeToWait);
-	}
-
-	/**
-	 * Removes and returns the command packet for the given type or <code>null</code> if there is no command packet for the given type.
-	 * 
-	 * @param type
-	 * @return The command packet for the given type that has been removed
-	 */
-	private Packet removeCommandPacket(String type) {
-		ListIterator iter = this.commandPackets.listIterator();
-		while (iter.hasNext()) {
-			Packet packet = (Packet) iter.next();
-			if (type == null || packet.getType().equals(type)) {
-				iter.remove();
-				return packet;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Removes and returns the response packet with the given request sequence or <code>null</code> if there is no response packet with the given request sequence
-	 * 
-	 * @param requestSequence
-	 * @return the response packet with the given request sequence that has been removed
-	 */
-	private Response removeResponsePacket(int requestSequence) {
-		ListIterator iter = this.responsePackets.listIterator();
-		while (iter.hasNext()) {
-			Response response = (Response) iter.next();
-			if (requestSequence == response.getRequestSequence()) {
-				iter.remove();
-				return response;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds the given command packet to the listing of command packets. This method is a no-op if the given packet is <code>null</code>
-	 * 
-	 * @param packet
-	 */
-	private void addCommandPacket(Packet packet) {
-		if (packet == null) {
-			return;
-		}
-		synchronized (this.commandPackets) {
-			this.commandPackets.add(packet);
-			this.commandPackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Adds the given response packet to the listing of response packets. This method is a no-op if the given packet is <code>null</code>
-	 * 
-	 * @param response
-	 */
-	private void addResponsePacket(Response response) {
-		if (response == null) {
-			return;
-		}
-		synchronized (this.responsePackets) {
-			if (!this.timedOutPackets.isEmpty()) {
-				Integer requestSeq = new Integer(response.getRequestSequence());
-				if (this.timedOutPackets.remove(requestSeq))
-					return; // already timed out. No need to keep this one
-			}
-			this.responsePackets.add(response);
-			this.responsePackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Reads the next packet from the underlying connection and adds it to the correct packet listing.
-	 * 
-	 * @throws IOException
-	 */
-	private void readAvailablePacket() throws IOException {
-		// Read a packet from the Input Stream.
-		if(getConnection().isOpen()) {
-			Packet packet = getConnection().readPacket();
-			if (packet instanceof Response) {
-				addResponsePacket((Response) packet);
-			} else {
-				addCommandPacket(packet);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketSendManager.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketSendManager.java
deleted file mode 100644
index b769639..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketSendManager.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-
-
-
-/**
- * Default implementation of {@link PacketManager} for sending packets to the 
- * {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public final class PacketSendManager extends PacketManager {
-	
-	/** 
-	 * List of packets to be sent to Virtual Machine 
-	 */
-	private final List outgoingPackets = new ArrayList();
-
-	/**
-	 * Create a new thread that send packets to the {@link VirtualMachine}.
-	 * 
-	 * @param connection the underlying connection to communicate on, <code>null</code> is not accepted
-	 */
-	public PacketSendManager(Connection connection) {
-		super(connection);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.PacketManager#disconnect()
-	 */
-	public void disconnect() {
-		super.disconnect();
-		synchronized (outgoingPackets) {
-			outgoingPackets.notifyAll();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		while (!isDisconnected()) {
-			try {
-				sendAvailablePackets();
-			}
-			// in each case if the remote runtime fails, or has been interrupted, disconnect and force a clean up, don't wait for it to happen
-			catch (InterruptedException e) {
-				disconnect();
-			} catch (InterruptedIOException e) {
-				disconnect(e);
-			} catch (IOException e) {
-				disconnect(e);
-			}
-		}
-	}
-
-	/**
-	 * Sends the given {@link Packet}.
-	 * 
-	 * @param packet the packet to send, <code>null</code> is not accepted
-	 * 
-	 * @throws DisconnectedException
-	 */
-	public void sendPacket(Packet packet) throws DisconnectedException {
-		if(packet == null) {
-			throw new IllegalArgumentException("You cannot send a null packet"); //$NON-NLS-1$
-		}
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-		synchronized (outgoingPackets) {
-			// Add packet to list of packets to send.
-			outgoingPackets.add(packet);
-			// Notify PacketSendThread that data is available.
-			outgoingPackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Send available packets to the Virtual Machine.
-	 */
-	private void sendAvailablePackets() throws InterruptedException, IOException {
-		Object[] packetsToSend;
-		synchronized (outgoingPackets) {
-			while (outgoingPackets.size() == 0) {
-				outgoingPackets.wait();
-			}
-			packetsToSend = outgoingPackets.toArray();
-			outgoingPackets.clear();
-		}
-
-		// Put available packets on Output Stream.
-		for (int i = 0; i < packetsToSend.length; i++) {
-			getConnection().writePacket((Packet) packetsToSend[i]);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Request.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Request.java
deleted file mode 100644
index 91a6e9a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Request.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.util.Map;
-
-/**
- * Describes the general form of a request {@link Packet}
- * 
- * @since 1.0
- */
-public interface Request extends Packet {
-
-	/**
-	 * Returns the command that this {@link Request} was created for.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying command, never <code>null</code>
-	 */
-	public String getCommand();
-
-	/**
-	 * Returns the sequence for this request.
-	 * 
-	 * @return the request sequence
-	 */
-	public int getSequence();
-	
-	/**
-	 * Returns the complete collection of JSON arguments in the {@link Request}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>, an empty map will be returned
-	 * if there are no arguments.
-	 * 
-	 * @return the arguments or an empty map never <code>null</code>
-	 */
-	public Map getArguments();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Response.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Response.java
deleted file mode 100644
index d4340a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Response.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.util.Map;
-
-/**
- * Describes the general form of a response {@link Packet}
- * 
- * @since 1.0
- */
-public interface Response extends Packet {
-
-	/**
-	 * Returns the name of the original issued command.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the name of the original issued command, never <code>null</code>
-	 */
-	public String getCommand();
-	
-	/**
-	 * Returns the request sequence
-	 * 
-	 * @return the request sequence
-	 */
-	public int getRequestSequence();
-	
-	/**
-	 * Returns the body of the {@link Response}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>, if there is no body
-	 * an empty {@link Map} is returned.
-	 *  
-	 * @return the body of the {@link Response} or an empty {@link Map} never <code>null</code>
-	 */
-	public Map getBody();
-
-	/**
-	 * Returns <code>true</code> if the original {@link Request} was successful
-	 * 
-	 * @return <code>true</code> if the original {@link Request} was successful, <code>false</code> otherwise
-	 */
-	public boolean isSuccess();
-	
-	/**
-	 * Returns <code>true</code> if the issued command left the connected VM in a running state.
-	 * 
-	 * @return <code>true</code> if the underlying command is running, <code>false</code> otherwise
-	 */
-	public boolean isRunning();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketConnection.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketConnection.java
deleted file mode 100644
index c26c3b8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketConnection.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.socket;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.Constants;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-
-/**
- * A specialized {@link Connection} that communicates using {@link Socket}s
- * 
- * @since 1.0
- */
-public abstract class SocketConnection implements Connection {
-
-	private Writer writer;
-	private Reader reader;
-	private Socket socket;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param socket the underlying {@link Socket}, <code>null</code> is not accepted
-	 * 
-	 * @throws IOException
-	 */
-	public SocketConnection(Socket socket) throws IOException {
-		if(socket == null) {
-			throw new IllegalArgumentException("You cannot create a new SocketConnection on a null Socket"); //$NON-NLS-1$
-		}
-		this.socket = socket;
-		writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), Constants.UTF_8));
-		reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), Constants.UTF_8));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#isOpen()
-	 */
-	public boolean isOpen() {
-		return !socket.isClosed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#close()
-	 */
-	public void close() throws IOException {
-		socket.close();
-	}
-	
-	/**
-	 * Returns the {@link Writer} used to write to the underlying {@link Socket}.
-	 * <br><br>
-	 * This method will never return <code>null</code> 
-	 * 
-	 * @return the writer for the socket, never <code>null</code>
-	 */
-	public Writer getWriter() {
-		return writer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public abstract void writePacket(Packet packet) throws IOException;
-
-	/**
-	 * Returns the {@link Reader} used to read from the underlying {@link Socket}.
-	 * <br><br>
-	 * This method will never return <code>null</code> 
-	 * 
-	 * @return the reader for the socket, never <code>null</code>
-	 */
-	public Reader getReader() {
-		return reader;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#readPacket()
-	 */
-	public abstract Packet readPacket() throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketListenerKey.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketListenerKey.java
deleted file mode 100644
index caf98ff..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketListenerKey.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.eclipse.wst.jsdt.debug.transport.socket;
-
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-
-/**
- * Key implementation for a {@link SocketTransportService}
- * 
- * @since 1.0
- */
-public final class SocketListenerKey implements ListenerKey {
-
-	private String address;
-
-	/**
-	 * Constructor
-	 * @param address
-	 */
-	public SocketListenerKey(String address) {
-		this.address = address;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService.ListenerKey#address()
-	 */
-	public String address() {
-		return address;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketTransportService.java
deleted file mode 100644
index 66c029e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketTransportService.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.socket;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.Constants;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-/**
- * Implementation of a {@link TransportService} that using a {@link Socket} for communication
- * 
- * @since 1.0
- */
-public abstract class SocketTransportService implements TransportService {
-
-	/**
-	 * Map of {@link ListenerKey} to {@link ServerSocket}s
-	 */
-	private Map listeners = new HashMap();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#startListening(java.lang.String)
-	 */
-	public synchronized ListenerKey startListening(String address) throws IOException {
-		String host = null;
-		int port = 0;
-		if (address != null) {
-			String[] strings = address.split(Constants.COLON);
-			if (strings.length == 2) {
-				host = strings[0];
-				port = Integer.parseInt(strings[1]);
-			} else {
-				port = Integer.parseInt(strings[0]);
-			}
-		}
-		if (host == null) {
-			host = Constants.LOCALHOST;
-		}
-		ListenerKey key = new SocketListenerKey(host + Constants.COLON + port);
-		ServerSocket serverSocket = new ServerSocket(port);
-		listeners.put(key, serverSocket);
-		return key;
-
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#stopListening(org.eclipse.wst.jsdt.debug.transport.TransportService.ListenerKey)
-	 */
-	public void stopListening(ListenerKey key) throws IOException {
-		ServerSocket serverSocket = (ServerSocket) listeners.remove(key);
-		if (serverSocket != null) {
-			serverSocket.close();
-		}
-	}
-
-	/**
-	 * Returns the {@link ServerSocket} mapped to the given {@link ListenerKey} or 
-	 * <code>null</code> if the mapping does not exist
-	 * 
-	 * @param key the {@link ListenerKey} to get the {@link ServerSocket} for
-	 * @return the mapped {@link ServerSocket} or <code>null</code>
-	 */
-	public final ServerSocket getServerSocket(ListenerKey key) {
-		synchronized (listeners) {
-			return (ServerSocket) listeners.get(key);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#accept(org.eclipse.wst.jsdt.debug.transport.TransportService.ListenerKey, long, long)
-	 */
-	public Connection accept(ListenerKey key, long attachTimeout, long handshakeTimeout) throws IOException {
-		ServerSocket serverSocket = getServerSocket(key);
-		if (serverSocket == null) {
-			throw new IllegalStateException("Accept failed. Not listening for address: key.address()"); //$NON-NLS-1$
-		}
-		int timeout = (int) attachTimeout;
-		if (timeout > 0) {
-			if (timeout > Integer.MAX_VALUE) {
-				timeout = Integer.MAX_VALUE; // approximately 25 days!
-			}
-			serverSocket.setSoTimeout(timeout);
-		}
-		Connection connection = getConnection(serverSocket.accept());
-		handleAccept(connection);
-		return connection;
-	}
-
-	/**
-	 * This method allows implementors to perform specific actions immediately following
-	 * a successful accept for {@link Socket} communication (the socket has been successfully opened).
-	 * 
-	 * @param connection the connection that just opened
-	 * @throws IOException
-	 */
-	public abstract void handleAccept(Connection connection) throws IOException;
-	
-	/**
-	 * Returns the {@link SocketConnection} for the given {@link Socket}.
-	 * <br><br>
-	 * This method cannot return <code>null</code>, if a connection cannot be created
-	 * an {@link IOException} must be thrown.
-	 * 
-	 * @param socket the socket to get the connection for
-	 * @return the {@link SocketConnection} for the given {@link Socket}, never <code>null</code>
-	 * @throws IOException
-	 */
-	public abstract SocketConnection getConnection(Socket socket) throws IOException;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#attach(java.lang.String, long, long)
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException {
-		String host = null;
-		int port = 0;
-		if (address != null) {
-			String[] strings = address.split(Constants.COLON);
-			if (strings.length == 2) {
-				host = strings[0];
-				port = Integer.parseInt(strings[1]);
-			} else {
-				port = Integer.parseInt(strings[0]);
-			}
-		}
-		if (host == null) {
-			host = Constants.LOCALHOST;
-		}
-		Connection connection = getConnection(new Socket(host, port));
-		handleAttach(connection);
-		return connection;
-	}
-	
-	/**
-	 * This method allows implementors to perform specific actions immediately following
-	 * a successful attach for {@link Socket} communication (the socket has been successfully opened).
-	 * 
-	 * @param connection the connection that just opened
-	 * @throws IOException
-	 */
-	public abstract void handleAttach(Connection connection) throws IOException;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/.classpath b/development/org.eclipse.wst.jsdt.debug.chrome/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/.options b/development/org.eclipse.wst.jsdt.debug.chrome/.options
deleted file mode 100644
index d69be5d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/.options
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-#option file for tracing options for Google Chrome debugger port
-org.eclipse.wst.jsdt.debug.chrome/debug=true
-
-#option to trace packets being sent / received
-org.eclipse.wst.jsdt.debug.chrome/packets=false
-
-#option to trace the event queue
-org.eclipse.wst.jsdt.debug.chrome/eventqueue=false
-
-#option to trace the jsdi impl* elements
-org.eclipse.wst.jsdt.debug.chrome/jsdi=false
-
-#option to trace the JSON parser
-org.eclipse.wst.jsdt.debug.chrome/json=false
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/.project b/development/org.eclipse.wst.jsdt.debug.chrome/.project
deleted file mode 100644
index 53bcdb0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.internal.chrome</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/.settings/org.eclipse.jdt.core.prefs b/development/org.eclipse.wst.jsdt.debug.chrome/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/META-INF/MANIFEST.MF b/development/org.eclipse.wst.jsdt.debug.chrome/META-INF/MANIFEST.MF
deleted file mode 100644
index a282b5d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.chrome;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.chrome.ChromePlugin
-Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.wst.jsdt.debug.core;bundle-version="1.0.100",
- org.eclipse.wst.jsdt.debug.transport;bundle-version="1.0.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/OSGI-INF/l10n/bundle.properties b/development/org.eclipse.wst.jsdt.debug.chrome/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 41f01af..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Bundle-Vendor = Eclipse Web Tools Platform
-Bundle-Name = v8 JavaScript Debug
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/build.properties b/development/org.eclipse.wst.jsdt.debug.chrome/build.properties
deleted file mode 100644
index 89db3d9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/l10n/bundle.properties,\
-               plugin.xml
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/plugin.xml b/development/org.eclipse.wst.jsdt.debug.chrome/plugin.xml
deleted file mode 100644
index 8f3fd54..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/plugin.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.chrome.connect.ChromeAttachingConnector"
-            id="org.eclipse.wst.jsdt.debug.chrome.connector.attach">
-      </connector>
-   </extension>
-
-</plugin>
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/ChromePlugin.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/ChromePlugin.java
deleted file mode 100644
index e63d292..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/ChromePlugin.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package org.eclipse.wst.jsdt.debug.internal.chrome;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.jsdt.debug.internal.chrome.event.EventQueueImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.PacketImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.JSON;
-import org.osgi.framework.BundleContext;
-
-public class ChromePlugin extends Plugin {
-
-	/**
-	 * Id of the bundle
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.chrome"; //$NON-NLS-1$
-	/**
-	 * PacketImpl tracing option name
-	 */
-	public static final String TRC_PACKETS = PLUGIN_ID + "/packets"; //$NON-NLS-1$
-	/**
-	 * ChromeEvent queue tracing option name
-	 */
-	public static final String TRC_EVENTQUEUE = PLUGIN_ID + "/eventqueue"; //$NON-NLS-1$
-	/**
-	 * JSDI implementation tracing option name
-	 */
-	public static final String TRC_JSDI = PLUGIN_ID + "/jsdi"; //$NON-NLS-1$
-	/**
-	 * JSON parser tracing option
-	 */
-	public static final String TRC_JSON = PLUGIN_ID + "/json"; //$NON-NLS-1$
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	
-	/**
-	 * Singleton instance
-	 */
-	private static ChromePlugin plugin = null;
-	
-	/**
-	 * @return the singleton plugin instance
-	 */
-	public static ChromePlugin getDefault() {
-		return plugin;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext bundleContext) throws Exception {
-		super.start(bundleContext);
-		plugin = this;
-		configureTracing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext bundleContext) throws Exception {
-		try {
-			plugin = null;
-		}
-		finally {
-			super.stop(bundleContext);
-		}
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Google Chrome Debug: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from Google Chrome Debug: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-
-	/**
-	 * Turns on / off any tracing options
-	 */
-	public void configureTracing() {
-		if(ChromePlugin.getDefault().isDebugging()) {
-			String option = Platform.getDebugOption(TRC_PACKETS);
-			if(option != null) {
-				PacketImpl.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_EVENTQUEUE);
-			if(option != null) {
-				EventQueueImpl.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_JSDI);
-			if(option != null) {
-				MirrorImpl.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_JSON);
-			if(option != null) {
-				JSON.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/Tracing.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/Tracing.java
deleted file mode 100644
index efe751a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/Tracing.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome;
-
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.JSON;
-
-/**
- * Helper class for common tracing functions
- * 
- * @since 1.0
- */
-public class Tracing {
-
-	public static final String PRINTABLE_LINE_FEED = "\\\\r\\\\n"; //$NON-NLS-1$
-	
-	/**
-	 * Writes the string to system out cleaning it of control chars before printing it
-	 * 
-	 * @param string
-	 */
-	public static void writeString(String string) {
-		System.out.println("[CHROME] " +string.replaceAll(JSON.LINE_FEED, PRINTABLE_LINE_FEED)); //$NON-NLS-1$
-	}
-	
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/BrowserArgument.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/BrowserArgument.java
deleted file mode 100644
index 00924a4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/BrowserArgument.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument;
-
-/**
- * Option to automatically launch the browser and connect to it
- * 
- * @since 1.0
- */
-public class BrowserArgument implements BooleanArgument {
-
-	/**
-	 * name of the argument
-	 */
-	public static final String BROWSER = "browser"; //$NON-NLS-1$
-	
-	private boolean doit = false; 
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.browser_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.browser_arg_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return BROWSER;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		doit = Boolean.valueOf(value).booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Boolean.toString(doit);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return doit;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#setValue(boolean)
-	 */
-	public void setValue(boolean booleanValue) {
-		doit = booleanValue;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/ChromeAttachingConnector.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/ChromeAttachingConnector.java
deleted file mode 100644
index 3d355a2..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/ChromeAttachingConnector.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.internal.chrome.ChromePlugin;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.ChromeTransportService;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-
-/**
- * Default attaching connector
- * 
- * @since 1.0
- */
-public class ChromeAttachingConnector implements AttachingConnector {
-
-	public static final String ID = "org.eclipse.wst.jsdt.debug.chrome.connector.attach"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public ChromeAttachingConnector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		Map args = new HashMap();
-		args.put(HostArgument.HOST, new HostArgument(null));
-		args.put(PortArgument.PORT, new PortArgument(9222));
-		args.put(TimeoutArgument.TIMEOUT, new TimeoutArgument());
-		args.put(BrowserArgument.BROWSER, new BrowserArgument());
-		return args;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.attach_to_google_chrome;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.google_chrome_attach;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector#attach(java.util.Map)
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException {
-		String str = (String)arguments.get(BrowserArgument.BROWSER);
-		Connection c = null;
-		if(Boolean.valueOf(str).booleanValue()) {
-			c = launchForBrowser(arguments);
-		}
-		else {
-			c = launch(arguments);
-		}
-		DebugSession session = new DebugSession(c);
-		return new VMImpl(session);
-	}
-	
-	/**
-	 * Launches the browser and connects to it. This method will poll for the browser to be launched
-	 * but only for a fixed timeout. 
-	 * @param arguments
-	 * @return the created connection or <code>null</code> if the attempt to connect times out, the browser process
-	 * terminates before we can connect  
-	 * @throws IOException 
-	 */
-	Connection launchForBrowser(Map arguments) throws IOException {
-		TransportService service = new ChromeTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		StringBuffer buffer = new StringBuffer("/opt/google/chrome/chrome --remote-shell-port="); //$NON-NLS-1$
-		buffer.append(port);
-		Process proc = null;
-		try {
-			proc = Runtime.getRuntime().exec(buffer.toString());
-		} catch (IOException e) {
-			ChromePlugin.log(e);
-		}
-		String timeoutstr = (String) arguments.get(TimeoutArgument.TIMEOUT);
-		int timeout = Integer.parseInt(timeoutstr);
-		buffer = new StringBuffer();
-		buffer.append(host).append(':').append(Integer.parseInt(port));
-		Connection c = null;
-		long timer = System.currentTimeMillis() + 60000;
-		while(proc != null && System.currentTimeMillis() < timer && c == null) {
-			try {
-				c = service.attach(buffer.toString(), timeout, timeout);
-			}
-			catch(IOException ioe) {
-				//ignore while pinging to connect
-				try {
-					Thread.sleep(200);
-				} catch (InterruptedException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		if(c == null) {
-			throw new IOException(NLS.bind("Failed to attach to debugger at {0} on port {1}", new String[] {host, port})); //$NON-NLS-1$
-		}
-		return c;
-	}
-	
-	/**
-	 * Tries to connect to the given 
-	 * @param arguments
-	 * @return the {@link Connection} or throws an exception
-	 * @throws IOException
-	 */
-	Connection launch(Map arguments) throws IOException {
-		TransportService service = new ChromeTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		String timeoutstr = (String) arguments.get(TimeoutArgument.TIMEOUT);
-		int timeout = Integer.parseInt(timeoutstr);
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(host).append(':').append(Integer.parseInt(port));
-		return service.attach(buffer.toString(), timeout, timeout);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/HostArgument.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/HostArgument.java
deleted file mode 100644
index 607ba3d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/HostArgument.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-import org.eclipse.wst.jsdt.debug.transport.Constants;
-
-/**
- * Implementation of a string argument that describes the host argument
- * 
- * @since 1.0
- */
-public class HostArgument implements StringArgument {
-
-	private static final long serialVersionUID = 3057403815318177030L;
-	private String host;
-
-	/**
-	 * Host attribute name
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param host
-	 */
-	public HostArgument(String host) {
-		setValue(host);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.host_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.host_arg_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return HOST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String host) {
-		if(host == null) {
-			this.host = Constants.LOCALHOST;
-		}
-		else {
-			if (!isValid(host)) {
-				throw new IllegalArgumentException();
-			}
-			this.host = host;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return host;
-	}
-
-	/**
-	 * Returns if the given host is <code>localhost</code> or <code>127.0.0.1</code>
-	 * @param host
-	 * @return true if the given host it localhost (127.0.0.1) false otherwise
-	 */
-	public static boolean isLocalhost(String host) {
-		return host.equals(Constants.LOCALHOST) || host.equals(Constants.LOCALHOST_IP);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/Messages.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/Messages.java
deleted file mode 100644
index e68037e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.chrome.connect.messages"; //$NON-NLS-1$
-	public static String attach_to_google_chrome;
-	public static String browser_arg_desc;
-	public static String browser_arg_label;
-	public static String google_chrome_attach;
-	public static String host_arg_desc;
-	public static String host_arg_label;
-	public static String port_arg_desc;
-	public static String port_arg_label;
-	public static String timeout_arg_desc;
-	public static String timeout_arg_label;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/PortArgument.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/PortArgument.java
deleted file mode 100644
index 7e6fe05..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.port_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.port_arg_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/TimeoutArgument.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/TimeoutArgument.java
deleted file mode 100644
index 2d84a7a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/TimeoutArgument.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Argument used to specify a timeout (in ms)
- * 
- * @since 1.1
- */
-public class TimeoutArgument implements IntegerArgument {
-	
-	/**
-	 * Argument to specify a timeout
-	 */
-	public static final String TIMEOUT = "timeout"; //$NON-NLS-1$
-	/**
-	 * default connecting timeout
-	 */
-	public static final Integer CONNECT_TIMEOUT = new Integer(30000);
-	
-	/**
-	 * The timeout
-	 */
-	private int timeout = 0;
-	
-	/**
-	 * Constructor
-	 */
-	public TimeoutArgument() {
-		setValue(CONNECT_TIMEOUT.intValue());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.timeout_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.timeout_arg_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return TIMEOUT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			timeout = Integer.parseInt(value);
-		}
-		catch(NumberFormatException nfe) {
-			//do nothing the new value will not be set
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(timeout);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return timeout;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			return Integer.parseInt(value) > 0;
-		}
-		catch(NumberFormatException bfe) {
-			//do nothing, just not valid
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int intValue) {
-		timeout = intValue;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/messages.properties b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/messages.properties
deleted file mode 100644
index f6d0aa0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/messages.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-attach_to_google_chrome=Allows you to connect to the Google Chrome browser
-browser_arg_desc=Automatically launch Chrome and attach to it
-browser_arg_label=Auto&matically launch Chrome and attach to it (extremely experimental)
-google_chrome_attach=Google Chrome - Attach
-host_arg_desc=The name of the host address to try and attach to
-host_arg_label=&Host:
-port_arg_desc=The port on the host machine to try connecting on
-port_arg_label=&Port:
-timeout_arg_desc=A timeout value in milliseconds to wait for the debugger to connect
-timeout_arg_label=&Timeout:
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/BreakpointEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/BreakpointEventImpl.java
deleted file mode 100644
index 51fb72a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/BreakpointEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-
-/**
- *
- */
-public class BreakpointEventImpl extends LocatableEventImpl implements BreakpointEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/DebuggerStatementEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/DebuggerStatementEventImpl.java
deleted file mode 100644
index 6cec32b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/DebuggerStatementEventImpl.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-
-/**
- *
- */
-public class DebuggerStatementEventImpl extends LocatableEventImpl implements
-		DebuggerStatementEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventImpl.java
deleted file mode 100644
index 1381fbb..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- *
- */
-public class EventImpl implements Event {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.Event#request()
-	 */
-	public EventRequest request() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventQueueImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventQueueImpl.java
deleted file mode 100644
index 71911ef..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventQueueImpl.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.internal.chrome.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.Commands;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-import org.eclipse.wst.jsdt.debug.transport.packet.Event;
-
-/**
- * EVent queue for Chrome
- * 
- * @since 1.0
- */
-public class EventQueueImpl extends MirrorImpl implements EventQueue {
-
-	private EventRequestManager ermanager = null;
-	
-	static boolean TRACE = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 * @param manager the {@link EventRequestManager} to ask about pending requests
-	 */
-	public EventQueueImpl(VirtualMachine vm, EventRequestManager manager) {
-		super(vm);
-		this.ermanager = manager;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove()
-	 */
-	public EventSet remove() {
-		return remove(-1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove(int)
-	 */
-	public EventSet remove(int timeout) {
-		try {
-			//loop until disconnected - exception breaks loop
-			while(true) {
-				Event event = chromeVM().receiveEvent();
-				if(event != null) {
-					//TODO
-					if(event.getEvent().equals(Commands.NAVIGATED)) {
-						if(TRACE) {
-							Tracing.writeString("got navigated event"); //$NON-NLS-1$
-						}
-					}
-					else if(event.getEvent().equals(Commands.CLOSED)) {
-						List requests = ermanager.threadExitRequests();
-						for(Iterator i = requests.iterator(); i.hasNext();) {
-							//TODO
-						}
-						if(TRACE) {
-							Tracing.writeString("got closed event"); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-		catch(DisconnectedException de) {
-			
-		}
-		catch(TimeoutException te) {
-			
-		}
-		return null;
-	}
-	
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventSetImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventSetImpl.java
deleted file mode 100644
index fe6bb54..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventSetImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import java.util.HashSet;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-
-/**
- *
- */
-public class EventSetImpl extends HashSet implements EventSet {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#suspended()
-	 */
-	public boolean suspended() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#resume()
-	 */
-	public void resume() {
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ExceptionEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ExceptionEventImpl.java
deleted file mode 100644
index 9e5122e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ExceptionEventImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-
-/**
- *
- */
-public class ExceptionEventImpl extends LocatableEventImpl implements ExceptionEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent#message()
-	 */
-	public String message() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/LocatableEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/LocatableEventImpl.java
deleted file mode 100644
index 03aa31e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/LocatableEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent;
-
-/**
- *
- */
-public class LocatableEventImpl extends EventImpl implements LocatableEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ResumeEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ResumeEventImpl.java
deleted file mode 100644
index 03df2d7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ResumeEventImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ResumeEvent;
-
-/**
- *
- */
-public class ResumeEventImpl extends LocatableEventImpl implements ResumeEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ScriptEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ScriptEventImpl.java
deleted file mode 100644
index f024602..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ScriptEventImpl.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-
-/**
- *
- */
-public class ScriptEventImpl extends LocatableEventImpl implements
-		ScriptLoadEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent#script()
-	 */
-	public ScriptReference script() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/StepEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/StepEventImpl.java
deleted file mode 100644
index aa6e37e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/StepEventImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.StepEvent;
-
-/**
- *
- */
-public class StepEventImpl extends LocatableEventImpl implements StepEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/SuspendEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/SuspendEventImpl.java
deleted file mode 100644
index bfffd29..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/SuspendEventImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-
-/**
- *
- */
-public class SuspendEventImpl extends LocatableEventImpl implements SuspendEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadEnterEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadEnterEventImpl.java
deleted file mode 100644
index 018db56..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadEnterEventImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-
-/**
- *
- */
-public class ThreadEnterEventImpl extends LocatableEventImpl implements ThreadEnterEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadExitEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadExitEventImpl.java
deleted file mode 100644
index 4719d44..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadExitEventImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-
-/**
- *
- */
-public class ThreadExitEventImpl extends LocatableEventImpl implements
-		ThreadExitEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDeathEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDeathEventImpl.java
deleted file mode 100644
index 034bef6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDeathEventImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-
-/**
- *
- */
-public class VMDeathEventImpl extends LocatableEventImpl implements
-		VMDeathEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDisconnectEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDisconnectEventImpl.java
deleted file mode 100644
index c433cac..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDisconnectEventImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDisconnectEvent;
-
-/**
- *
- */
-public class VMDisconnectEventImpl extends LocatableEventImpl implements
-		VMDisconnectEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ArrayImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ArrayImpl.java
deleted file mode 100644
index af907e9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ArrayImpl.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- *
- */
-public class ArrayImpl extends ObjectImpl implements ArrayReference {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#length()
-	 */
-	public int length() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValue(int)
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValues()
-	 */
-	public List getValues() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/BooleanImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/BooleanImpl.java
deleted file mode 100644
index 4294644..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/BooleanImpl.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link BooleanValue} for Chrome
- * 
- * @since 1.0
- */
-public class BooleanImpl extends MirrorImpl implements BooleanValue {
-
-	private boolean value = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 * @param bool the boolean value
-	 */
-	public BooleanImpl(VirtualMachine vm, boolean bool) {
-		super(vm);
-		value = bool;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		if(value) {
-			return 1;
-		}
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return Boolean.toString(value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/FunctionImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/FunctionImpl.java
deleted file mode 100644
index 076e97a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/FunctionImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference;
-
-/**
- *
- */
-public class FunctionImpl extends ObjectImpl implements FunctionReference {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionName()
-	 */
-	public String functionName() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionBody()
-	 */
-	public String functionBody() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/Messages.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/Messages.java
deleted file mode 100644
index 6795014..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/Messages.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.messages"; //$NON-NLS-1$
-	public static String cannot_mirror_null_number;
-	public static String chrome_vm;
-	public static String vm_description;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/MirrorImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/MirrorImpl.java
deleted file mode 100644
index 4ebc132..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/MirrorImpl.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default impl for Chrome v8.
- * 
- * @since 1.0
- */
-public class MirrorImpl implements Mirror {
-
-	/**
-	 * Flag for tracing
-	 */
-	static boolean TRACE = false;
-	
-	private VirtualMachine vm = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 */
-	public MirrorImpl(VirtualMachine vm) {
-		this.vm = vm;
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * Used for the {@link VMImpl} instantiation case
-	 */
-	protected MirrorImpl() {
-		this.vm = (VirtualMachine) this;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-
-	/**
-	 * Returns the {@link VMImpl} backing this {@link Mirror} object
-	 * 
-	 * @return the backing {@link VMImpl}
-	 */
-	protected VMImpl chromeVM() {
-		return (VMImpl)vm;
-	}
-	
-	/**
-	 * Re-throws the given exception as a {@link RuntimeException} with the given message
-	 * @param message
-	 * @param t
-	 */
-	protected void handleException(String message, Throwable t) {
-		throw new RuntimeException(message, t);
-	}
-	
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NullImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NullImpl.java
deleted file mode 100644
index 8bfc9d7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NullImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Chrome impl of {@link NullValue}
- * 
- * @since 1.0
- */
-public class NullImpl extends MirrorImpl implements NullValue {
-
-	/**
-	 * String representation of the value<br><br>
-	 * Value is: <code>null</code>
-	 */
-	public static final String NULL = "null"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 */
-	public NullImpl(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return NULL;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NumberImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NumberImpl.java
deleted file mode 100644
index 13f9794..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NumberImpl.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link NumberValue} for Chrome
- * 
- * @since 1.0
- */
-public class NumberImpl extends MirrorImpl implements NumberValue {
-
-	private Number number = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 * @param number the number
-	 */
-	public NumberImpl(VirtualMachine vm, Number number) {
-		super(vm);
-		if(number == null) {
-			throw new IllegalArgumentException(Messages.cannot_mirror_null_number);
-		}
-		this.number = number;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return number.intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return number.doubleValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		if(number.intValue() < 1) {
-			return false;
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return number.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#value()
-	 */
-	public Number value() {
-		return number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#isNaN()
-	 */
-	public boolean isNaN() {
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ObjectImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ObjectImpl.java
deleted file mode 100644
index 393a6e3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ObjectImpl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- *
- */
-public class ObjectImpl extends MirrorImpl implements ObjectReference {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#className()
-	 */
-	public String className() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#constructor()
-	 */
-	public Value constructor() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#prototype()
-	 */
-	public Value prototype() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#properties()
-	 */
-	public List properties() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#id()
-	 */
-	public Number id() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/PropertyImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/PropertyImpl.java
deleted file mode 100644
index 05625a8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/PropertyImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- *
- */
-public class PropertyImpl extends MirrorImpl implements Property {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#name()
-	 */
-	public String name() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#value()
-	 */
-	public Value value() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ScriptImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ScriptImpl.java
deleted file mode 100644
index ca48acf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ScriptImpl.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.net.URI;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- *
- */
-public class ScriptImpl extends MirrorImpl implements ScriptReference {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allLineLocations()
-	 */
-	public List allLineLocations() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#lineLocation(int)
-	 */
-	public Location lineLocation(int lineNumber) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allFunctionLocations()
-	 */
-	public List allFunctionLocations() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#functionLocation(java.lang.String)
-	 */
-	public Location functionLocation(String functionName) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#source()
-	 */
-	public String source() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#sourceURI()
-	 */
-	public URI sourceURI() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StackFrameImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StackFrameImpl.java
deleted file mode 100644
index c9dbcb9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StackFrameImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- *
- */
-public class StackFrameImpl extends MirrorImpl implements StackFrame {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#thisObject()
-	 */
-	public Variable thisObject() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#variables()
-	 */
-	public List variables() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#evaluate(java.lang.String)
-	 */
-	public Value evaluate(String expression) {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StringImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StringImpl.java
deleted file mode 100644
index dfbe67e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StringImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- *
- */
-public class StringImpl extends MirrorImpl implements StringValue {
-
-	private String string = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param string
-	 */
-	StringImpl(VirtualMachine vm, String string) {
-		super(vm);
-		this.string = string;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return string;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return string;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ThreadImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ThreadImpl.java
deleted file mode 100644
index 989caa9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ThreadImpl.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- *
- */
-public class ThreadImpl extends MirrorImpl implements ThreadReference {
-
-	Number id = null;
-	String url = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param id
-	 * @param url
-	 */
-	public ThreadImpl(VMImpl vm, Number id, String url) {
-		super(vm);
-		this.id = id;
-		this.url = url;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frameCount()
-	 */
-	public int frameCount() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frame(int)
-	 */
-	public StackFrame frame(int index) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frames()
-	 */
-	public List frames() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#interrupt()
-	 */
-	public void interrupt() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#resume()
-	 */
-	public void resume() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#suspend()
-	 */
-	public void suspend() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#status()
-	 */
-	public int status() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isAtBreakpoint()
-	 */
-	public boolean isAtBreakpoint() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isSuspended()
-	 */
-	public boolean isSuspended() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#name()
-	 */
-	public String name() {
-		return url;
-	}
-	
-	public Number id() {
-		return id;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/UndefinedImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/UndefinedImpl.java
deleted file mode 100644
index 99d5044..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/UndefinedImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link UndefinedValue} for Chrome.
- * 
- * @since 1.0
- */
-public class UndefinedImpl extends MirrorImpl implements UndefinedValue {
-
-	/**
-	 * Textual representation of undefined<br><br>
-	 * value is: <code>undefined</code>
-	 */
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 */
-	public UndefinedImpl(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return UNDEFINED;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}	
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VMImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VMImpl.java
deleted file mode 100644
index a0bef24..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VMImpl.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.internal.chrome.ChromePlugin;
-import org.eclipse.wst.jsdt.debug.internal.chrome.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.chrome.event.EventQueueImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.request.EventReqManager;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.Attributes;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.EventPacketImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.RequestPacketImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.Commands;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.JSON;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-import org.eclipse.wst.jsdt.debug.transport.packet.Event;
-import org.eclipse.wst.jsdt.debug.transport.packet.Request;
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * Default implementation of a {@link VirtualMachine} for Chrome
- * 
- * @since 1.0
- */
-public class VMImpl extends MirrorImpl implements VirtualMachine {
-
-	public static int RUNNING = 1;
-	public static int SUSPENDED = 2;
-	public static int TERMINATED = 3;
-	public static int DISPOSED = 4;
-	public static int DISCONNECTED = 5;
-	
-	/**
-	 * The current state
-	 */
-	private int state = 0;
-	/**
-	 * The singleton {@link NullValue}
-	 */
-	private static NullValue nullValue = null;
-	/**
-	 * The singleton {@link UndefinedValue}
-	 */
-	private static UndefinedValue undefinedValue = null;
-	
-	private EventRequestManager ermanager = new EventReqManager(this);
-	private EventQueue queue = new EventQueueImpl(this, ermanager);
-	private final DebugSession session;
-	
-	private Map threads = null;
-	private Map scripts = null;
-	private String version = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param session the backing {@link DebugSession}
-	 */
-	public VMImpl(DebugSession session) {
-		super();
-		this.session = session;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#resume()
-	 */
-	public synchronized void resume() {
-		if(state == SUSPENDED) {
-			//TODO
-			state = RUNNING;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#suspend()
-	 */
-	public synchronized void suspend() {
-		if(state == RUNNING) {
-			//TODO
-			state = SUSPENDED;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#terminate()
-	 */
-	public synchronized void terminate() {
-		if(state != TERMINATED) {
-			//TODO
-			state = TERMINATED;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#name()
-	 */
-	public String name() {
-		return NLS.bind(Messages.chrome_vm, version());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#description()
-	 */
-	public String description() {
-		return Messages.vm_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#version()
-	 */
-	public synchronized String version() {
-		if(version == null) {
-			RequestPacketImpl request = new RequestPacketImpl(Commands.VERSION, Attributes.TOOL_DEVTOOLSRVC, null);
-			Response response = sendRequest(request);
-			if(response.isSuccess()) {
-				version = (String) response.getBody().get(Attributes.DATA);
-			}
-			else if(TRACE) {
-				Tracing.writeString("VM [failed version request]" + JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-		return version;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allThreads()
-	 */
-	public synchronized List allThreads() {
-		if(threads == null) {
-			threads = Collections.synchronizedMap(new HashMap(4));
-			RequestPacketImpl request = new RequestPacketImpl(Commands.LIST_TABS, Attributes.TOOL_DEVTOOLSRVC, null);
-			Response response = sendRequest(request);
-			if(response.isSuccess()) {
-				List tabs = (List) response.getBody().get(Attributes.DATA);
-				if(tabs != null) {
-					ArrayList values = null;
-					for(Iterator i = tabs.iterator(); i.hasNext();) {
-						values = (ArrayList) i.next();
-						String url = (String)values.get(1);
-						Number id = (Number)values.get(0);
-						ThreadImpl thread = new ThreadImpl(this, id, url);
-						threads.put(id, thread);
-						attach(thread);
-					}
-				}
-			}
-			else if(TRACE) {
-				Tracing.writeString("VM [failed all_tabs request]" + JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-		return new ArrayList(threads.values());
-	}
-
-	/**
-	 * Try to attach the debugger to the v8 debugger service for the given thread (tab)
-	 * 
-	 * @param thread
-	 */
-	void attach(ThreadImpl thread) {
-		RequestPacketImpl request = new RequestPacketImpl(Commands.ATTACH, Attributes.TOOL_DEVTOOLSRVC, thread.id());
-		Response response = sendRequest(request);
-		if(response.isSuccess()) {
-			
-		}
-		else if(TRACE) {
-			Tracing.writeString("VM [failed attach request] " + JSON.serialize(request)); //$NON-NLS-1$
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allScripts()
-	 */
-	public synchronized List allScripts() {
-		if(this.scripts == null) {
-			this.scripts = Collections.synchronizedMap(new HashMap(4));
-		}
-		return new ArrayList(scripts.values());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#dispose()
-	 */
-	public synchronized void dispose() {
-		if(state != DISPOSED) {
-			//TODO
-			try {
-				if(threads != null) {
-					threads.clear();
-					threads = null;
-				}
-				if(scripts != null) {
-					scripts.clear();
-					scripts = null;
-				}
-			}
-			finally {
-				state = DISPOSED;
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfUndefined()
-	 */
-	public UndefinedValue mirrorOfUndefined() {
-		synchronized (this) {
-			if(undefinedValue == null) {
-				undefinedValue = new UndefinedImpl(this);
-			}
-		}
-		return undefinedValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfNull()
-	 */
-	public NullValue mirrorOfNull() {
-		synchronized (this) {
-			if(nullValue == null) {
-				nullValue = new NullImpl(this);
-			}
-		}
-		return nullValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(boolean)
-	 */
-	public BooleanValue mirrorOf(boolean bool) {
-		return new BooleanImpl(this, bool);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.Number)
-	 */
-	public NumberValue mirrorOf(Number number) {
-		return new NumberImpl(this, number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.String)
-	 */
-	public StringValue mirrorOf(String string) {
-		return new StringImpl(this, string);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventRequestManager()
-	 */
-	public EventRequestManager eventRequestManager() {
-		return ermanager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventQueue()
-	 */
-	public EventQueue eventQueue() {
-		return queue;
-	}
-	
-	/**
-	 * Sends a request to the underlying {@link DebugSession}, waiting
-	 * for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * 
-	 * @param request
-	 * @return the {@link CFResponse} for the request
-	 */
-	public Response sendRequest(Request request) {
-		try {
-			session.send(request);
-			return session.receiveResponse(request.getSequence(), 3000);
-		}
-		catch(DisconnectedException de) {
-			disconnectVM();
-			handleException(de.getMessage(), de.getCause());
-		}
-		catch(TimeoutException te) {
-			ChromePlugin.log(te);
-		}
-		return null;
-	}
-	
-	/**
-	 * Receives an {@link EventPacket} from the underlying {@link DebugSession}, 
-	 * waiting for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * 
-	 * @return the next {@link EventPacket} never <code>null</code>
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public Event receiveEvent() throws TimeoutException, DisconnectedException {
-		return (Event) session.receive(EventPacketImpl.EVENT, DEFAULT_TIMEOUT);
-	}
-
-	/**
-	 * Receives an {@link EventPacket} from the underlying {@link DebugSession}, 
-	 * waiting for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * @param timeout
-	 * @return the next {@link EventPacket} never <code>null</code>
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public Event receiveEvent(int timeout) throws TimeoutException, DisconnectedException {
-		return (Event) session.receive(EventPacketImpl.EVENT, timeout);
-	}
-	
-	/**
-	 * disconnects the VM
-	 */
-	public synchronized void disconnectVM() {
-		if (state == DISCONNECTED) {
-			if(TRACE) {
-				Tracing.writeString("VM [already disconnected]"); //$NON-NLS-1$
-			}
-			return;
-		}
-		if(TRACE) {
-			Tracing.writeString("VM [disconnecting]"); //$NON-NLS-1$
-		}
-		try {
-			if(threads != null) {
-				threads.clear();
-			}
-			if(scripts != null) {
-				scripts.clear();
-			}
-			this.session.dispose();
-		} finally {
-			state = DISCONNECTED;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ValueImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ValueImpl.java
deleted file mode 100644
index 37350fc..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ValueImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- *
- */
-public class ValueImpl extends MirrorImpl implements Value {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VarImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VarImpl.java
deleted file mode 100644
index 958297e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VarImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- *
- */
-public class VarImpl extends MirrorImpl implements Variable {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#name()
-	 */
-	public String name() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#value()
-	 */
-	public Value value() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isArgument()
-	 */
-	public boolean isArgument() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isVisible(org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame)
-	 */
-	public boolean isVisible(StackFrame frame) {
-		return false;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/messages.properties b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/messages.properties
deleted file mode 100644
index 4247aea..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-cannot_mirror_null_number=You cannot mirror a null Number
-chrome_vm=Chrome VM
-vm_description=The virtual machine for communication with Google Chrome for debugging JavaScript in v8
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/BreakpointReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/BreakpointReqImpl.java
deleted file mode 100644
index 39636b3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/BreakpointReqImpl.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link BreakpointRequest} impl
- * 
- * @since 1.0
- */
-public class BreakpointReqImpl extends EventReqImpl implements BreakpointRequest {
-
-	private Location location = null;
-	private ThreadReference thread = null;
-	private int hitcount = 0;
-	private String condition = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param location 
-	 * @param enabled
-	 */
-	public BreakpointReqImpl(VMImpl vm, Location location, boolean enabled) {
-		super(vm, enabled);
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
-	 */
-	public void addConditionFilter(String condition) {
-		this.condition = condition;
-	}
-
-	/**
-	 * Returns the condition for this breakpoint
-	 * 
-	 * @return the condition
-	 */
-	public synchronized String condition() {
-		return condition;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
-	 */
-	public void addHitCountFilter(int hitcount) {
-		this.hitcount = hitcount;
-	}
-	
-	/**
-	 * Returns the hit count for the breakpoint
-	 * 
-	 * @return the hit count for the breakpoint
-	 */
-	public synchronized int hitcount() {
-		return this.hitcount;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/DebuggerStatementReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/DebuggerStatementReqImpl.java
deleted file mode 100644
index 430ad69..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/DebuggerStatementReqImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link DebuggerStatementRequest} impl
- * 
- * @since 1.0
- */
-public class DebuggerStatementReqImpl extends EventReqImpl implements DebuggerStatementRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param enabled
-	 */
-	public DebuggerStatementReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-	
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqImpl.java
deleted file mode 100644
index a753210..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * Impl of {@link EventRequest}
- * 
- * @since 1.0
- */
-public class EventReqImpl extends MirrorImpl implements EventRequest {
-
-	private boolean enabled = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param enabled
-	 */
-	public EventReqImpl(VMImpl vm, boolean enabled) {
-		super(vm);
-		this.enabled = enabled;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqManager.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqManager.java
deleted file mode 100644
index a35a371..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqManager.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.MirrorImpl;
-
-/**
- * {@link EventRequestManager} for Chrome
- * 
- * @since 1.0
- */
-public class EventReqManager extends MirrorImpl implements EventRequestManager {
-
-	private List threadexits = Collections.synchronizedList(new ArrayList(4));
-	private List threadenters = Collections.synchronizedList(new ArrayList(4));
-	private List breakpoints = Collections.synchronizedList(new ArrayList(4));
-	private List debuggers = Collections.synchronizedList(new ArrayList(4));
-	private List exceptions = Collections.synchronizedList(new ArrayList(4));
-	private List loads = Collections.synchronizedList(new ArrayList(4));
-	private List steps = Collections.synchronizedList(new ArrayList(4));
-	private List suspends = Collections.synchronizedList(new ArrayList(4));
-	private List resumes = Collections.synchronizedList(new ArrayList(4));
-	private List disconnects = Collections.synchronizedList(new ArrayList(4));
-	private List deaths = Collections.synchronizedList(new ArrayList(4));
-	
-	private HashMap kind = new HashMap(10);
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying virtual machine
-	 */
-	public EventReqManager(VirtualMachine vm) {
-		super(vm);
-		kind.put(BreakpointReqImpl.class, breakpoints);
-		kind.put(DebuggerStatementReqImpl.class, debuggers);
-		kind.put(ExceptionReqImpl.class, exceptions);
-		kind.put(ScriptLoadReqImpl.class, loads);
-		kind.put(StepReqImpl.class, steps);
-		kind.put(SuspendReqImpl.class, suspends);
-		kind.put(ResumeReqImpl.class, resumes);
-		kind.put(ThreadEnterReqImpl.class, threadenters);
-		kind.put(ThreadExitReqImpl.class, threadexits);
-		kind.put(VMDisconnectReqImpl.class, disconnects);
-		kind.put(VMDeathReqImpl.class, deaths);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createBreakpointRequest(org.eclipse.wst.jsdt.debug.core.jsdi.Location)
-	 */
-	public BreakpointRequest createBreakpointRequest(Location location) {
-		BreakpointReqImpl req = new BreakpointReqImpl(chromeVM(), location, true);
-		breakpoints.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#breakpointRequests()
-	 */
-	public List breakpointRequests() {
-		return Collections.unmodifiableList(breakpoints);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createDebuggerStatementRequest()
-	 */
-	public DebuggerStatementRequest createDebuggerStatementRequest() {
-		DebuggerStatementReqImpl req = new DebuggerStatementReqImpl(chromeVM(), true);
-		debuggers.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#debuggerStatementRequests()
-	 */
-	public List debuggerStatementRequests() {
-		return Collections.unmodifiableList(debuggers);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createExceptionRequest()
-	 */
-	public ExceptionRequest createExceptionRequest() {
-		ExceptionReqImpl req = new ExceptionReqImpl(chromeVM(), true);
-		exceptions.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#exceptionRequests()
-	 */
-	public List exceptionRequests() {
-		return Collections.unmodifiableList(exceptions);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createScriptLoadRequest()
-	 */
-	public ScriptLoadRequest createScriptLoadRequest() {
-		ScriptLoadReqImpl req = new ScriptLoadReqImpl(chromeVM(), true);
-		loads.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#scriptLoadRequests()
-	 */
-	public List scriptLoadRequests() {
-		return Collections.unmodifiableList(loads);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createStepRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference, int)
-	 */
-	public StepRequest createStepRequest(ThreadReference thread, int step) {
-		StepReqImpl req = new StepReqImpl(chromeVM(), thread, step, true);
-		steps.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#stepRequests()
-	 */
-	public List stepRequests() {
-		return Collections.unmodifiableList(steps);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createSuspendRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public SuspendRequest createSuspendRequest(ThreadReference thread) {
-		SuspendReqImpl req = new SuspendReqImpl(chromeVM(), thread, true);
-		suspends.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#suspendRequests()
-	 */
-	public List suspendRequests() {
-		return Collections.unmodifiableList(suspends);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createResumeRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public ResumeRequest createResumeRequest(ThreadReference thread) {
-		ResumeReqImpl req = new ResumeReqImpl(chromeVM(), thread, true);
-		resumes.add(req);
-		return req;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#resumeRequests()
-	 */
-	public List resumeRequests() {
-		return Collections.unmodifiableList(resumes);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadEnterRequest()
-	 */
-	public ThreadEnterRequest createThreadEnterRequest() {
-		ThreadEnterReqImpl req = new ThreadEnterReqImpl(chromeVM(), true);
-		threadenters.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadEnterRequests()
-	 */
-	public List threadEnterRequests() {
-		return Collections.unmodifiableList(threadenters);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadExitRequest()
-	 */
-	public ThreadExitRequest createThreadExitRequest() {
-		ThreadExitReqImpl req = new ThreadExitReqImpl(chromeVM(), true);
-		threadexits.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadExitRequests()
-	 */
-	public List threadExitRequests() {
-		return Collections.unmodifiableList(threadexits);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	public void deleteEventRequest(EventRequest eventRequest) {
-		List requests = (List) kind.get(eventRequest.getClass());
-		if(requests != null) {
-			requests.remove(eventRequest);
-			eventRequest.setEnabled(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(java.util.List)
-	 */
-	public void deleteEventRequest(List eventRequests) {
-		for (Iterator iter = eventRequests.iterator(); iter.hasNext();) {
-			deleteEventRequest((EventRequest) iter.next());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDeathRequest()
-	 */
-	public VMDeathRequest createVMDeathRequest() {
-		VMDeathReqImpl req = new VMDeathReqImpl(chromeVM(), true);
-		deaths.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDeathRequests()
-	 */
-	public List vmDeathRequests() {
-		return Collections.unmodifiableList(deaths);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDisconnectRequest()
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest() {
-		VMDisconnectReqImpl req = new VMDisconnectReqImpl(chromeVM(), true);
-		disconnects.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDisconnectRequests()
-	 */
-	public List vmDisconnectRequests() {
-		return Collections.unmodifiableList(disconnects);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ExceptionReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ExceptionReqImpl.java
deleted file mode 100644
index d80f388..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ExceptionReqImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ExceptionRequest} impl
- * 
- * @since 1.0
- */
-public class ExceptionReqImpl extends EventReqImpl implements ExceptionRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param enabled
-	 */
-	public ExceptionReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ResumeReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ResumeReqImpl.java
deleted file mode 100644
index 3c01b73..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ResumeReqImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ResumeRequest} impl
- * 
- * @since 1.0
- */
-public class ResumeReqImpl extends EventReqImpl implements ResumeRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public ResumeReqImpl(VMImpl vm,ThreadReference thread, boolean enabled) {
-		super(vm, enabled);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ScriptLoadReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ScriptLoadReqImpl.java
deleted file mode 100644
index 72871dd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ScriptLoadReqImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ScriptLoadRequest} impl
- * 
- * @since 1.0
- */
-public class ScriptLoadReqImpl extends EventReqImpl implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public ScriptLoadReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/StepReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/StepReqImpl.java
deleted file mode 100644
index 119f69b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/StepReqImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link StepRequest} impl
- * 
- * @since 1.0
- */
-public class StepReqImpl extends EventReqImpl implements StepRequest {
-
-	private int stepkind = 0;
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param step
-	 * @param enabled
-	 */
-	public StepReqImpl(VMImpl vm, ThreadReference thread, int step, boolean enabled) {
-		super(vm, enabled);
-		this.thread = thread;
-		this.stepkind = step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#step()
-	 */
-	public int step() {
-		return stepkind;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/SuspendReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/SuspendReqImpl.java
deleted file mode 100644
index 5886faa..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/SuspendReqImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link SuspendRequest} impl
- * 
- * @since 1.0
- */
-public class SuspendReqImpl extends EventReqImpl implements SuspendRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param enabled
-	 */
-	public SuspendReqImpl(VMImpl vm, ThreadReference thread, boolean enabled) {
-		super(vm, enabled);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadEnterReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadEnterReqImpl.java
deleted file mode 100644
index 2a2fba4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadEnterReqImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ThreadEnterRequest} impl
- * 
- * @since 1.0
- */
-public class ThreadEnterReqImpl extends EventReqImpl implements ThreadEnterRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public ThreadEnterReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadExitReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadExitReqImpl.java
deleted file mode 100644
index 77617bf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadExitReqImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ThreadExitRequest} impl
- * 
- * @since 1.0
- */
-public class ThreadExitReqImpl extends EventReqImpl implements ThreadExitRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public ThreadExitReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDeathReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDeathReqImpl.java
deleted file mode 100644
index b39d3b2..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDeathReqImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link VMDeathRequest} impl
- * 
- * @since 1.0
- */
-public class VMDeathReqImpl extends EventReqImpl implements VMDeathRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public VMDeathReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDisconnectReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDisconnectReqImpl.java
deleted file mode 100644
index 1bba98d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDisconnectReqImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link VMDisconnectRequest} impl
- * 
- * @since 1.0
- */
-public class VMDisconnectReqImpl extends EventReqImpl implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public VMDisconnectReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Attributes.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Attributes.java
deleted file mode 100644
index 5cf9557..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Attributes.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-/**
- * Interface for all the attribute constants
- * 
- * @since 1.0
- */
-public interface Attributes {
-
-	/**
-	 * Result meaning everything is OK
-	 */
-	public static final int OK = 0;
-	/**
-	 * Result meaning that tab is in a state that cannot accept the sent request
-	 */
-	public static final int ILLEGAL_TAB_STATE = 1;
-	/**
-	 * Result meaning the given tab id does not exist
-	 */
-	public static final int UNKNOWN_TAB = 2;
-	/**
-	 * Result meaning the debugger encountered an error
-	 */
-	public static final int DEBUGGER_ERROR = 3;
-	/**
-	 * Result meaning the request is unknown
-	 */
-	public static final int UNKNOWN_COMMAND = 4;
-	
-	/**
-	 * The name for the development tools service
-	 * <br><br>
-	 * Value is: <code>DevToolsService</code>
-	 */
-	public static final String TOOL_DEVTOOLSRVC = "DevToolsService"; //$NON-NLS-1$
-	/**
-	 * The name for the V8 debugger service
-	 * <br><br>
-	 * Value is: <code>V8Debugger</code>
-	 */
-	public static final String TOOL_V8DEBUGGER = "V8Debugger"; //$NON-NLS-1$
-	/**
-	 * The "command" attribute
-	 */
-	public static final String COMMAND = "command"; //$NON-NLS-1$
-	/**
-	 * The "data" attribute
-	 */
-	public static final String DATA = "data"; //$NON-NLS-1$
-	/**
-	 * The "dest" attribute
-	 */
-	public static final String DESTINATION = "dest"; //$NON-NLS-1$
-	/**
-	 * The "handshake" attribute
-	 */
-	public static final String HANDSHAKE = "handshake"; //$NON-NLS-1$
-	/**
-	 * The "result" attribute
-	 */
-	public static final String RESULT = "result"; //$NON-NLS-1$
-	/**
-	 * The "type" attribute
-	 */
-	public static final String TYPE = "type"; //$NON-NLS-1$
-	/**
-	 * the "tool" attribute
-	 */
-	public static final String TOOL = "tool"; //$NON-NLS-1$
-	/**
-	 * The "value" attribute
-	 */
-	public static final String VALUE = "value"; //$NON-NLS-1$
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeSocketConnection.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeSocketConnection.java
deleted file mode 100644
index efbb8cf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeSocketConnection.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-import java.util.HashSet;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.chrome.ChromePlugin;
-import org.eclipse.wst.jsdt.debug.internal.chrome.Tracing;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-
-/**
- * A specialized {@link Connection} that communicates using {@link Socket}s
- * 
- * @since 1.0
- */
-public class ChromeSocketConnection extends SocketConnection {
-
-	public static final String HANDSHAKE = "ChromeDevToolsHandshake\r\n"; //$NON-NLS-1$
-	
-	private static final HashSet EVENTS;
-	
-	static {
-		EVENTS = new HashSet();
-		EVENTS.add(Commands.CLOSED);
-		EVENTS.add(Commands.NAVIGATED);
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param socket the underlying {@link Socket}, <code>null</code> is not accepted
-	 * 
-	 * @throws IOException
-	 */
-	public ChromeSocketConnection(Socket socket) throws IOException {
-		super(socket);
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String serialized = JSON.serialize((PacketImpl) packet);
-		if(PacketImpl.TRACE) {
-			Tracing.writeString("WRITE PACKET: "+serialized); //$NON-NLS-1$
-		}
-		Writer writer = getWriter();
-		writer.write(serialized);
-		writer.flush();
-	}
-
-	/**
-	 * Writes the standard handshake packet to connect
-	 * 
-	 * @param packet
-	 * @throws IOException
-	 */
-	public void writeHandShake() throws IOException {
-		if(PacketImpl.TRACE) {
-			Tracing.writeString("WRITE HANDSHAKE: "+HANDSHAKE); //$NON-NLS-1$
-		}
-		Writer writer = getWriter();
-		writer.write(HANDSHAKE);
-		writer.flush();
-	}
-	
-	/**
-	 * Method to wait for the socket reader to become ready after the handshake
-	 * 
-	 * @throws IOException
-	 */
-	void waitForReadyRead() throws IOException {
-		long timeout = System.currentTimeMillis() + 1000;
-		boolean timedout = System.currentTimeMillis() > timeout;
-		Reader reader = getReader();
-		while(!reader.ready() && !timedout) {
-			try {
-				Thread.sleep(100);
-				timedout = System.currentTimeMillis() > timeout;
-			} catch (InterruptedException e) {
-				ChromePlugin.log(e);
-			}
-		}
-		if(timedout) {
-			if(PacketImpl.TRACE) {
-				Tracing.writeString("HANDSHAKE: Timed out waiting for ready read from handshake"); //$NON-NLS-1$
-			}
-			//throw new IOException("Waiting for the socket to become available after receiving handshake timed out."); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Reads the {@link HandShakePacket} packet from the the stream
-	 * 
-	 * @return the {@link HandShakePacket}, never <code>null</code>
-	 * @throws IOException
-	 */
-	public boolean readHandShake() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		//read the header first
-		int c = 0;
-		boolean r = false;
-		Reader reader = getReader();
-		while((c = reader.read()) > -1) {
-			buffer.append((char)c);
-			if(r) {
-				if(c == '\n') {
-					break;
-				}
-			}
-			r = c == '\r';
-		}
-		r = false;
-		while(reader.ready() && (c = reader.read()) > -1) {
-			if(r) {
-				if(c == '\n') {
-					break;
-				}
-			}
-			r = c == '\r';
-		}
-		if(PacketImpl.TRACE) {
-			Tracing.writeString("READ HANDSHAKE: "+buffer.toString()); //$NON-NLS-1$
-		}
-		return buffer.toString().equals(HANDSHAKE);	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		int c = -1;
-		Reader reader = getReader();
-		String dest = null;
-		String tool = null;
-		String len = null;
-		boolean r = false;
-		while((c = reader.read()) > -1) {
-			if(r) {
-				if(c == '\n') {
-					String str = buffer.toString();
-					if(str.startsWith(JSON.DESTINATION_HEADER)) {
-						dest = grabAttrib(str);
-					}
-					else if(str.startsWith(JSON.TOOL_HEADER)) {
-						tool = grabAttrib(str);
-					}
-					else if(str.startsWith(JSON.CONTENT_LENGTH)) {
-						len = grabAttrib(str);
-					}
-					else if(str.equals("\r")) { //$NON-NLS-1$
-						break;
-					}
-					buffer = new StringBuffer();
-					r = false;
-				}
-				continue;
-			}
-			buffer.append((char)c);
-			r = c == '\r';
-		}
-		int length = 0;
-		try {
-			length = Integer.parseInt(len);
-		} catch (NumberFormatException e) {
-			throw new IOException("Failed to parse content length: " + len); //$NON-NLS-1$
-		}
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0) {
-				throw new EOFException();
-			}
-			n += count;
-		}
-		if(PacketImpl.TRACE) {
-			Tracing.writeString("READ PACKET: [destination - "+dest+"] [tool - "+tool+"] [length - "+length+"]"+new String(message)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-		Map json = (Map) JSON.read(new String(message));
-		json.put(Attributes.TOOL, tool);
-		json.put(Attributes.DESTINATION, dest);
-		if(json.containsKey(Attributes.RESULT)) {
-			if(EVENTS.contains(json.get(Attributes.COMMAND))) {
-				json.put(Attributes.TYPE, EventPacketImpl.EVENT);
-				return new EventPacketImpl(json);
-			}
-			json.put(Attributes.TYPE, ResponsePacketImpl.RESPONSE);
-			return new ResponsePacketImpl(json);
-		}
-		json.put(Attributes.TYPE, RequestPacketImpl.REQUEST);
-		return new RequestPacketImpl(json);
-	}
-	
-	/**
-	 * Grabs the attribute from the RHS of the header. Where all headers
-	 * have the form <code>[name]:[value]</code>.
-	 * 
-	 * @param str the string to parse
-	 * @return the <code>[value]</code> from the header
-	 */
-	String grabAttrib(String str) {
-		if(str != null) {
-			int idx = str.indexOf(':');
-			if(idx > -1) {
-				return str.substring(idx+1, str.length()-1);
-			}
-		}
-		return null;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeTransportService.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeTransportService.java
deleted file mode 100644
index 2b45905..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeTransportService.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService;
-
-
-/**
- * Implementation of a transport service that using a {@link Socket} for communication
- * 
- * @since 1.0
- */
-public class ChromeTransportService extends SocketTransportService {
-
-	static final Class serverSocketClass = ServerSocket.class; // temporary used to pre-load the ServerSocket.class
-
-	/**
-	 * Map of {@link ListenerKey} to {@link ServerSocket}s
-	 */
-	Map listeners = new HashMap();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#getConnection(java.net.Socket)
-	 */
-	public SocketConnection getConnection(Socket socket) throws IOException {
-		return new ChromeSocketConnection(socket);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAccept(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAccept(Connection connection) throws IOException {
-		if(connection instanceof ChromeSocketConnection) {
-			ChromeSocketConnection cfconn = (ChromeSocketConnection) connection;
-			if (cfconn.readHandShake()) {
-				cfconn.writeHandShake();
-			}
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAttach(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAttach(Connection connection) throws IOException {
-		if(connection instanceof ChromeSocketConnection) {
-			ChromeSocketConnection cfconn = (ChromeSocketConnection) connection;
-			cfconn.writeHandShake();
-			if (!cfconn.readHandShake()) {
-				throw new IOException("failure establishing connection"); //$NON-NLS-1$
-			}
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Commands.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Commands.java
deleted file mode 100644
index c975a37..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Commands.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-/**
- * Interface for all the command constants
- * 
- * @since 1.0
- */
-public interface Commands {
-
-	/**
-	 * The "attach" command
-	 */
-	public static final String ATTACH = "attach"; //$NON-NLS-1$
-	/**
-	 * The "closed" command
-	 */
-	public static final String CLOSED = "closed"; //$NON-NLS-1$
-	/**
-	 * The "debugger_command" command
-	 */
-	public static final String DEBUGGER_COMMAND = "debugger_command"; //$NON-NLS-1$
-	/**
-	 * The "detach" command
-	 */
-	public static final String DETACH = "detach"; //$NON-NLS-1$
-	/**
-	 * The "evaluate_javascript" command
-	 */
-	public static final String EVALUATE_JAVASCRIPT = "evaluate_javascript"; //$NON-NLS-1$
-	/**
-	 * The "list_tabs" command
-	 */
-	public static final String LIST_TABS = "list_tabs"; //$NON-NLS-1$
-	/**
-	 * The "navigated" command
-	 */
-	public static final String NAVIGATED = "navigated"; //$NON-NLS-1$
-	/**
-	 * The "ping" command
-	 */
-	public static final String PING = "ping"; //$NON-NLS-1$
-	/**
-	 * The "version" command
-	 */
-	public static final String VERSION = "version"; //$NON-NLS-1$
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/EventPacketImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/EventPacketImpl.java
deleted file mode 100644
index c2f5b02..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/EventPacketImpl.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Event;
-
-/**
- * Event packet
- * 
- * @since 1.0
- */
-public class EventPacketImpl extends PacketImpl implements Event {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String EVENT = "event"; //$NON-NLS-1$
-	
-	private String event = null;
-	protected Number result = null;
-	protected Map body = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param event
-	 * @param tool the name of the tools service that issued this event
-	 */
-	public EventPacketImpl(String event, String tool) {
-		super(EVENT, tool);
-		if(event == null) {
-			throw new IllegalArgumentException(Messages.cannot_create_packet_with_no_event);
-		}
-		this.event = event;
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json
-	 */
-	public EventPacketImpl(Map json) {
-		super(json);
-		this.event = (String) json.get(EVENT);
-		if(event == null) {
-			throw new IllegalArgumentException(Messages.no_event_found_in_json);
-		}
-		this.result = (Number) json.get(Attributes.RESULT);
-		Object data = json.get(Attributes.DATA);
-		if(data != null) {
-			this.body = new HashMap();
-			this.body.put(Attributes.DATA, data);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Event#getEvent()
-	 */
-	public String getEvent() {
-		return event;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Event#getBody()
-	 */
-	public Map getBody() {
-		if(this.body == null) {
-			return Collections.EMPTY_MAP;
-		}
-		return this.body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.chrome.transport.PacketImpl#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(Attributes.COMMAND, event);
-		json.put(Attributes.RESULT, this.result);
-		if(this.body != null) {
-			json.put(Attributes.DATA, this.body.get(Attributes.DATA));
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("EventPacketImpl: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/JSON.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/JSON.java
deleted file mode 100644
index be8e435..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/JSON.java
+++ /dev/null
@@ -1,569 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.math.BigDecimal;
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.chrome.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.NullImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.UndefinedImpl;
-
-/**
- * Class for reading / writing JSON objects
- * <br><br>
- * Chrome has the following types:
- * <ul>
- * 	<li>object</li>
- * 	<li>function</li>
- * 	<li>boolean</li>
- * 	<li>number</li>
- * 	<li>string</li>
- * 	<li>undefined</li>
- * 	<li>ref</li>
- * </ul> 
- * @since 1.0
- */
-public final class JSON {
-
-	static boolean TRACE = false;
-	
-	/**
-	 * Standard line feed / control feed terminus for Crossfire packets
-	 */
-	public static final String LINE_FEED = "\r\n"; //$NON-NLS-1$
-	/**
-	 * The default <code>Content-Length:</code> pre-amble
-	 */
-	public static final String CONTENT_LENGTH = "Content-Length:"; //$NON-NLS-1$
-	
-	/**
-	 * The default <code>Tool:</code> pre-amble
-	 */
-	public static final String TOOL_HEADER = "Tool:"; //$NON-NLS-1$
-	
-	/**
-	 * The default <code>Destination:</code> pre-amble
-	 */
-	public static final String DESTINATION_HEADER = "Destination:"; //$NON-NLS-1$
-	
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * No instantiation
-	 */
-	private JSON() {}
-	
-	/**
-	 * Writes the given key / value pair to the buffer in the form: <code>"key":["]value["]</code>
-	 * 
-	 * @param key
-	 * @param value
-	 * @param buffer
-	 */
-	public static void writeKeyValue(String key, Object value, StringBuffer buffer) {
-		writeString(key, buffer);
-		buffer.append(':');
-		writeValue(value, buffer);
-	}
-	
-	/**
-	 * Writes out the given value to the buffer. <br><br>
-	 * Values are written out as:
-	 * <ul>
-	 * 	<li>Boolean / Number: <code>value.toString()</code></li>
-	 * 	<li>String: <code>"value"</code></li>
-	 * 	<li>null: <code>null</code>
-	 * 	<li>Collection: <code>[{@link #writeValue(Object, StringBuffer)},...]</code></li>
-	 * 	<li>Map: <code>{"key":{@link #writeValue(Object, StringBuffer)},...}</code></li>
-	 * </ul>
-	 * 
-	 * @param value
-	 * @param buffer
-	 */
-	public static void writeValue(Object value, StringBuffer buffer) {
-		if (value == null) {
-			buffer.append(NullImpl.NULL);
-		}
-		else if (value instanceof Boolean || value instanceof Number) {
-			buffer.append(value.toString());
-		}
-		else if (value instanceof String) {
-			writeString((String) value, buffer);
-		}
-		else if(value instanceof Collection) {
-			writeArray((Collection) value, buffer);
-		}
-		else if(value instanceof Map) {
-			writeObject((Map) value, buffer);
-		}
-	}
-	
-	/**
-	 * Writes the given {@link String} into the given {@link StringBuffer} properly escaping
-	 * all control characters
-	 * 
-	 * @param string
-	 * @param buffer
-	 */
-	public static void writeString(String string, StringBuffer buffer) {
-		buffer.append('"');
-		int length = string.length();
-		for (int i = 0; i < length; i++) {
-			char c = string.charAt(i);
-			switch (c) {
-				case '"' :
-				case '\\' :
-				case '/' : {
-					buffer.append('\\');
-					buffer.append(c);
-					break;
-				}
-				case '\b' : {
-					buffer.append("\\b"); //$NON-NLS-1$
-					break;
-				}
-				case '\f' : {
-					buffer.append("\\f"); //$NON-NLS-1$
-					break;
-				}
-				case '\n' : {
-					buffer.append("\\n"); //$NON-NLS-1$
-					break;
-				}
-				case '\r' : {
-					buffer.append("\\r"); //$NON-NLS-1$
-					break;
-				}
-				case '\t' : {
-					buffer.append("\\t"); //$NON-NLS-1$
-					break;
-				}
-				default :
-					if (Character.isISOControl(c)) {
-						buffer.append("\\u"); //$NON-NLS-1$
-						String hexString = Integer.toHexString(c);
-						for (int j = hexString.length(); j < 4; j++) {
-							buffer.append('0');
-						}
-						buffer.append(hexString);
-					} else {
-						buffer.append(c);
-					}
-			}
-		}
-		buffer.append('"');
-	}
-
-	/**
-	 * Writes the given collection into an array string of the form: <code>[{@link #writeValue(Object, StringBuffer)},...]</code>
-	 * 
-	 * @param collection
-	 * @param buffer
-	 */
-	static void writeArray(Collection collection, StringBuffer buffer) {
-		buffer.append('[');
-		for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
-			writeValue(iterator.next(), buffer);
-			if(iterator.hasNext()) {
-				buffer.append(',');
-			}
-		}
-		buffer.append(']');
-	}
-	
-	/**
-	 * Writes an object mapping to the given buffer in the form: <code>{"key":{@link #writeValue(Object, StringBuffer)},...}</code>
-	 * 
-	 * @param map
-	 * @param buffer
-	 */
-	public static void writeObject(Map map, StringBuffer buffer) {
-		buffer.append('{');
-		for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
-			String key = (String) iterator.next();
-			writeString(key, buffer);
-			buffer.append(':');
-			writeValue(map.get(key), buffer);
-			if(iterator.hasNext()) {
-				buffer.append(',');
-			}
-		}
-		buffer.append('}');
-	}
-	
-	/**
-	 * Writes the <code>Content-Length:N</code> pre-amble to the head of the given buffer
-	 * 
-	 * @param buffer
-	 * @param length
-	 */
-	public static void writeContentLength(StringBuffer buffer, int length) {
-		StringBuffer buff = new StringBuffer(18);
-		buff.append(CONTENT_LENGTH).append(length).append(LINE_FEED);
-		buffer.insert(0, buff);
-	}
-	
-	/**
-	 * Writes the <code>Tool:name</code> pre-amble to the head of the given buffer
-	 * 
-	 * @param buffer
-	 * @param tool
-	 */
-	public static void writeToolHeader(StringBuffer buffer, String tool) {
-		StringBuffer buff = new StringBuffer(18);
-		buff.append(TOOL_HEADER).append(tool).append(LINE_FEED).append(LINE_FEED);
-		buffer.insert(0, buff);
-	}
-	
-	public static void writeDestinationHeader(StringBuffer buffer, Number destination) {
-		StringBuffer buff = new StringBuffer();
-		buff.append(DESTINATION_HEADER).append(destination).append(LINE_FEED);
-		buffer.insert(0, buff);
-	}
-	
-	/**
-	 * Serializes the given {@link PacketImpl} to a {@link String}
-	 * 
-	 * @param packet the packet to serialize
-	 * 
-	 * @return the serialized {@link String}, never <code>null</code>
-	 */
-	public static String serialize(PacketImpl packet) {
-		Object json = packet.toJSON();
-		StringBuffer buffer = new StringBuffer();
-		writeValue(json, buffer);
-		int length = buffer.toString().getBytes().length;
-		writeToolHeader(buffer, packet.tool());
-		writeContentLength(buffer, length);
-		if(packet.destination() != null) {
-			writeDestinationHeader(buffer, packet.destination());
-		}
-		if(TRACE) {
-			Tracing.writeString("SERIALIZE: " + packet.getType() +" packet as "+buffer.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Reads and returns a new object from the given json {@link String}. This method
-	 * will throw an {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param jsonString
-	 * @return the object, never <code>null</code>
-	 */
-	public static Object read(String jsonString) {
-		return parse(new StringCharacterIterator(jsonString));
-	}
-	
-	/**
-	 * Reads and returns a new object form the given {@link CharacterIterator} that corresponds to
-	 * a properly formatted json string. This method will throw an {@link IllegalStateException} if
-	 * parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return the object, never <code>null</code>
-	 */
-	public static Object parse(CharacterIterator it) {
-		parseWhitespace(it);
-		Object result = parseValue(it);
-		parseWhitespace(it);
-		if (it.current() != CharacterIterator.DONE) {
-			throw error("should be done", it); //$NON-NLS-1$
-		}
-		return result;
-	}
-	
-	/**
-	 * Creates an {@link IllegalStateException} for the given message and iterator
-	 * 
-	 * @param message the message for the exception
-	 * @param it the {@link CharacterIterator} to parse
-	 * 
-	 * @return a new {@link IllegalStateException} 
-	 */
-	private static RuntimeException error(String message, CharacterIterator it) {
-		return new IllegalStateException("[" + it.getIndex() + "] " + message); //$NON-NLS-1$//$NON-NLS-2$
-	}
-	
-	/**
-	 * Chews up whitespace from the iterator
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 */
-	private static void parseWhitespace(CharacterIterator it) {
-		char c = it.current();
-		while (Character.isWhitespace(c)) {
-			c = it.next();
-		}
-	}
-	
-	/**
-	 * Parses the {@link Object} from the {@link CharacterIterator}. This method 
-	 * delegates to the proper parsing method depending on the current iterator context.
-	 * This method will throw an {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * 
-	 * @return the new object, never <code>null</code>
-	 * @see #parseString(CharacterIterator)
-	 * @see #parseNumber(CharacterIterator)
-	 * @see #parseArray(CharacterIterator)
-	 * @see #parseObject(CharacterIterator)
-	 */
-	private static Object parseValue(CharacterIterator it) {
-		switch (it.current()) {
-			case '{' : {
-				return parseObject(it);
-			}
-			case '[' : {
-				return parseArray(it);
-			}
-			case '"' : {
-				return parseString(it);
-			}
-			case '-' :
-			case '0' :
-			case '1' :
-			case '2' :
-			case '3' :
-			case '4' :
-			case '5' :
-			case '6' :
-			case '7' :
-			case '8' :
-			case '9' : {
-				return parseNumber(it);
-			}
-			case 't' : {
-				parseText(Boolean.TRUE.toString(), it);
-				return Boolean.TRUE;
-			}
-			case 'f' : {
-				parseText(Boolean.FALSE.toString(), it);
-				return Boolean.FALSE;
-			}
-			case 'n' : {
-				parseText(NullImpl.NULL, it);
-				return null;
-			}
-			case 'u': {
-				parseText(UndefinedImpl.UNDEFINED, it);
-				return null;
-			}
-		}
-		throw error("Bad JSON starting character '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-	}
-	
-	/**
-	 * Parses the JSON string from the {@link CharacterIterator}
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return the JSON {@link String}, never <code>null</code>
-	 */
-	private static String parseString(CharacterIterator it) {
-		char c = it.next();
-		if (c == '"') {
-			it.next();
-			return ""; //$NON-NLS-1$
-		}
-		StringBuffer buffer = new StringBuffer();
-		while (c != '"') {
-			if (Character.isISOControl(c)) {
-				throw error("illegal iso control character: '" + Integer.toHexString(c) + "'", it); //$NON-NLS-1$ //$NON-NLS-2$);
-			}
-			if (c == '\\') {
-				c = it.next();
-				switch (c) {
-					case '"' :
-					case '\\' :
-					case '/' : {
-						buffer.append(c);
-						break;
-					}
-					case 'b' : {
-						buffer.append('\b');
-						break;
-					}
-					case 'f' : {
-						buffer.append('\f');
-						break;
-					}
-					case 'n' : {
-						buffer.append('\n');
-						break;
-					}
-					case 'r' : {
-						buffer.append('\r');
-						break;
-					}
-					case 't' : {
-						buffer.append('\t');
-						break;
-					}
-					case 'u' : {
-						StringBuffer unicode = new StringBuffer(4);
-						for (int i = 0; i < 4; i++) {
-							unicode.append(it.next());
-						}
-						try {
-							buffer.append((char) Integer.parseInt(unicode.toString(), 16));
-						} catch (NumberFormatException e) {
-							throw error("expected a unicode hex number but was '" + unicode.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-						}
-						break;
-					}
-					default : {
-						throw error("illegal escape character '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-					}
-				}
-			} else {
-				buffer.append(c);
-			}
-			c = it.next();
-		}
-		c = it.next();
-		return buffer.toString();
-	}
-	
-	/**
-	 * Parses an {@link Map} object from the iterator or throws an
-	 * {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return a new {@link Map} object, never <code>null</code>
-	 */
-	private static Map parseObject(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == '}') {
-			it.next();
-			return Collections.EMPTY_MAP;
-		}
-
-		Map map = new HashMap();
-		while (true) {
-			if (it.current() != '"') {
-				throw error("expected a string start '\"' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			String key = parseString(it);
-			if (map.containsKey(key)) {
-				throw error("' already defined" + "key '" + key, it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			parseWhitespace(it);
-			if (it.current() != ':') {
-				throw error("expected a pair separator ':' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			it.next();
-			parseWhitespace(it);
-			Object value = parseValue(it);
-			map.put(key, value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-			if (it.current() != '}') {
-				throw error("expected an object close '}' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			break;
-		}
-		it.next();
-		return map;
-	}
-	
-	/**
-	 * Parses an {@link ArrayList} from the given iterator or throws an
-	 * {@link IllegalStateException} if parsing fails
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return a new {@link ArrayList} object never <code>null</code>
-	 */
-	private static List parseArray(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == ']') {
-			it.next();
-			return Collections.EMPTY_LIST;
-		}
-
-		List list = new ArrayList();
-		while (true) {
-			Object value = parseValue(it);
-			list.add(value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-			if (it.current() != ']') {
-				throw error("expected an array close ']' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			break;
-		}
-		it.next();
-		return list;
-	}
-
-	/**
-	 * @param string
-	 * @param it
-	 */
-	private static void parseText(String string, CharacterIterator it) {
-		int length = string.length();
-		char c = it.current();
-		for (int i = 0; i < length; i++) {
-			if (c != string.charAt(i)) {
-				throw error("expected to parse '" + string + "' but character " + (i + 1) + " was '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$;
-			}
-			c = it.next();
-		}
-	}
-
-	/**
-	 * Parses a {@link Number} object from the given {@link CharacterIterator}
-	 * 
-	 * @param it
-	 * @return a new {@link Number}, never <code>null</code>
-	 */
-	private static Object parseNumber(CharacterIterator it) {
-		StringBuffer buffer = new StringBuffer();
-		char c = it.current();
-		while (Character.isDigit(c) || c == '-' || c == '+' || c == '.' || c == 'e' || c == 'E') {
-			buffer.append(c);
-			c = it.next();
-		}
-		try {
-			return new BigDecimal(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw error("expected a number but was '" + buffer.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Messages.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Messages.java
deleted file mode 100644
index 93ee74b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Messages.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.chrome.transport.messages"; //$NON-NLS-1$
-	public static String cannot_create_packet_with_no_event;
-	public static String cannot_create_pakcet_null_json;
-	public static String cannot_create_request_null_command;
-	public static String cannot_create_response_null_command;
-	public static String no_command_in_json_response;
-	public static String no_command_in_request_json;
-	public static String no_event_found_in_json;
-	public static String no_packet_type_in_json;
-	public static String no_tool_found_in_packet_json;
-	public static String packet_tools_service_name_cannot_be_null;
-	public static String packet_type_cannot_be_null;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/PacketImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/PacketImpl.java
deleted file mode 100644
index 3ffef9a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/PacketImpl.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-
-/**
- * Basic packet
- * 
- * @since 1.0
- */
-public class PacketImpl implements Packet {
-
-	/**
-	 * Debugging flag
-	 */
-	public static boolean TRACE = false;
-	
-	private final String type;
-	private final String tool;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param type the type of the packet
-	 * @param tool the tools service expected to handle the packet
-	 */
-	public PacketImpl(String type, String tool) {
-		if(type == null) {
-			throw new IllegalArgumentException(Messages.packet_type_cannot_be_null);
-		}
-		if(tool == null) {
-			throw new IllegalArgumentException(Messages.packet_tools_service_name_cannot_be_null);
-		}
-		this.type = type;
-		this.tool = tool;
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param existing JSON map to create a packet from
-	 */
-	public PacketImpl(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException(Messages.cannot_create_pakcet_null_json);
-		}
-		type = (String) json.get(Attributes.TYPE);
-		if(type == null) {
-			throw new IllegalArgumentException(Messages.no_packet_type_in_json);
-		}
-		tool = (String) json.get(Attributes.TOOL);
-		if(tool == null) {
-			throw new IllegalArgumentException(Messages.no_tool_found_in_packet_json);
-		}
-	}
-	
-	/**
-	 * Sets if packet transfer should be traced
-	 * @param tracing
-	 */
-	public static void setTracing(boolean tracing) {
-		TRACE = tracing;
-	}
-	
-	/**
-	 * Returns the name of the tools service expected to handle this packet
-	 * 
-	 * @return the tools service name
-	 */
-	public String tool() {
-		return tool;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#getType()
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * Returns the intended tab destination for the packet, default returns <code>null</code>
-	 * 
-	 * @return the tab id or <code>null</code>
-	 */
-	public Number destination() {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = new HashMap();
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("PacketImpl: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/RequestPacketImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/RequestPacketImpl.java
deleted file mode 100644
index e9e52bb..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/RequestPacketImpl.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Request;
-
-/**
- * Request packet
- * 
- * @since 1.0
- */
-public class RequestPacketImpl extends PacketImpl implements Request {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String REQUEST = "request"; //$NON-NLS-1$
-	private final String command;
-	private final Number destination;
-	private Map args = Collections.synchronizedMap(new HashMap(4));
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param command
-	 * @param tool the name of the tools service expected to handle the request
-	 * @param dest the tab id destination
-	 */
-	public RequestPacketImpl(String command, String tool, Number dest) {
-		super(REQUEST, tool);
-		if(command == null) {
-			throw new IllegalArgumentException(Messages.cannot_create_request_null_command);
-		}
-		this.command = command;
-		this.destination = dest;
-	}
-	
-	/**
-	 * Constructor
-	 * @param json
-	 */
-	public RequestPacketImpl(Map json) {
-		super(json);
-		this.command = (String) json.get(Attributes.COMMAND);
-		if(command == null) {
-			throw new IllegalArgumentException(Messages.no_command_in_request_json);
-		}
-		this.destination = (Number) json.get(Attributes.DESTINATION);
-	}
-
-	/**
-	 * Sets the given argument in the JSON map.
-	 * 
-	 * @param key the key for the attribute, <code>null</code> is not accepted
-	 * @param argument the value for the argument, <code>null</code> is not accepted
-	 */
-	public void setArgument(String key, Object argument) {
-		if(key == null) {
-			throw new IllegalArgumentException("The argument key cannot be null"); //$NON-NLS-1$
-		}
-		if(argument == null) {
-			throw new IllegalArgumentException("A null argument is not allowed"); //$NON-NLS-1$
-		}
-		args.put(key, argument);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getSequence()
-	 */
-	public int getSequence() {
-		return -1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.chrome.transport.PacketImpl#destination()
-	 */
-	public Number destination() {
-		return this.destination;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getArguments()
-	 */
-	public Map getArguments() {
-		return args;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(Attributes.COMMAND, command);
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("RequestPacketImpl: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ResponsePacketImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ResponsePacketImpl.java
deleted file mode 100644
index 28e25a3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ResponsePacketImpl.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * Response packet
- * 
- * @since 1.0
- */
-public class ResponsePacketImpl extends PacketImpl implements Response {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String RESPONSE = "response"; //$NON-NLS-1$
-	
-	private String command = null;
-	protected Number result = null;
-	protected Map body = null;
-	
-	/**
-	 * Constructor
-	 * @param command
-	 * @param tool the name of the tools service that issued this response
-	 */
-	public ResponsePacketImpl(String command, String tool) {
-		super(RESPONSE, tool);
-		if(command == null) {
-			throw new IllegalArgumentException(Messages.cannot_create_response_null_command);
-		}
-		this.command = command;
-	}
-	
-	/**
-	 * Constructor
-	 * @param json
-	 */
-	public ResponsePacketImpl(Map json) {
-		super(json);
-		this.command = (String) json.get(Attributes.COMMAND);
-		if(command == null) {
-			throw new IllegalArgumentException(Messages.no_command_in_json_response);
-		}
-		this.result = (Number) json.get(Attributes.RESULT);
-		Object data = json.get(Attributes.DATA);
-		if(data != null) {
-			this.body = new HashMap();
-			this.body.put(Attributes.DATA, data);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getRequestSequence()
-	 */
-	public int getRequestSequence() {
-		return -1;
-	}
-
-	/**
-	 * Returns the result of the request that caused this response
-	 * @see Attributes#OK
-	 * @see Attributes#ILLEGAL_TAB_STATE
-	 * @see Attributes#UNKNOWN_TAB
-	 * @see Attributes#DEBUGGER_ERROR
-	 * @see Attributes#UNKNOWN_COMMAND
-	 * @return the value of the result
-	 */
-	public int getResult() {
-		return this.result.intValue();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getBody()
-	 */
-	public Map getBody() {
-		if(this.body == null) {
-			return Collections.EMPTY_MAP;
-		}
-		return this.body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isSuccess()
-	 */
-	public boolean isSuccess() {
-		return this.result.intValue() == Attributes.OK;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isRunning()
-	 */
-	public boolean isRunning() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.chrome.transport.PacketImpl#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(Attributes.COMMAND, command);
-		json.put(Attributes.RESULT, this.result);
-		if(this.body != null) {
-			json.put(Attributes.DATA, this.body.get(Attributes.DATA));
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("ResponsePacketImpl: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/messages.properties b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/messages.properties
deleted file mode 100644
index dc2d70f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-cannot_create_packet_with_no_event=You cannot create an event packet with no event
-cannot_create_pakcet_null_json=You cannot create a packet from a null JSON mapping
-cannot_create_request_null_command=You cannot create a request packet with a null command
-cannot_create_response_null_command=A response packet cannot be created for a null command
-no_command_in_json_response=There was no command found in the initializing JSON map to create a response packet from
-no_command_in_request_json=There was no command found in the initializing JSON map to create a request packet from
-no_event_found_in_json=There was no event found in the initializing JSON map to create an event packet from
-no_packet_type_in_json=There was no type found in the initializing JSON map to create a packet from
-no_tool_found_in_packet_json=There was no tool found in the initializing JSON map to create a packet from
-packet_tools_service_name_cannot_be_null=Packet tool service name cannot be null
-packet_type_cannot_be_null=The type of a packet cannot be null
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/.project b/development/org.eclipse.wst.jsdt.debug.ie/.project
deleted file mode 100644
index 695dce1..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.ie.debugger</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IE Crossfire Server.sln b/development/org.eclipse.wst.jsdt.debug.ie/IE Crossfire Server.sln
deleted file mode 100644
index 87b2106..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IE Crossfire Server.sln
+++ /dev/null
@@ -1,35 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IECrossfireExtension", "IECrossfireExtension\IECrossfireExtension.vcproj", "{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}"
-	ProjectSection(ProjectDependencies) = postProject
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF} = {2B73B89A-A1B4-479B-8751-A25B9036A9AF}
-	EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IECrossfireServer", "IECrossfireServer\IECrossfireServer.vcproj", "{2B73B89A-A1B4-479B-8751-A25B9036A9AF}"
-EndProject
-Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "IECrossfireInstaller", "IECrossfireInstaller\IECrossfireInstaller.vdproj", "{CDECB8BE-5076-4AF2-9E70-D990325F9E77}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}.Debug|Win32.ActiveCfg = Debug|Win32
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}.Debug|Win32.Build.0 = Debug|Win32
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}.Release|Win32.ActiveCfg = Release|Win32
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}.Release|Win32.Build.0 = Release|Win32
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF}.Debug|Win32.ActiveCfg = Debug|Win32
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF}.Debug|Win32.Build.0 = Debug|Win32
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF}.Release|Win32.ActiveCfg = Release|Win32
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF}.Release|Win32.Build.0 = Release|Win32
-		{CDECB8BE-5076-4AF2-9E70-D990325F9E77}.Debug|Win32.ActiveCfg = Debug
-		{CDECB8BE-5076-4AF2-9E70-D990325F9E77}.Debug|Win32.Build.0 = Debug
-		{CDECB8BE-5076-4AF2-9E70-D990325F9E77}.Release|Win32.ActiveCfg = Release
-		{CDECB8BE-5076-4AF2-9E70-D990325F9E77}.Release|Win32.Build.0 = Release
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.cpp
deleted file mode 100644
index 7f4c42b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.cpp
+++ /dev/null
@@ -1,311 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "IECrossfireBHO.h"
-
-/* ----- initialize constants ----- */
-const wchar_t* IECrossfireBHO::DEBUG_START = L"crossfiredebugstart";
-const wchar_t* IECrossfireBHO::DEBUG_STOP = L"crossfiredebugstop";
-const wchar_t* IECrossfireBHO::PREFERENCE_DISABLEIEDEBUG = L"DisableScriptDebuggerIE";
-
-IECrossfireBHO::IECrossfireBHO() {
-	m_server = NULL;
-	m_eventsHooked = false;
-	m_webBrowser = NULL;
-}
-
-IECrossfireBHO::~IECrossfireBHO() {
-	DWORD threadId = GetCurrentThreadId();
-	if (m_server) {
-		m_server->contextDestroyed(threadId);
-		m_server->Release();
-	}
-}
-
-bool IECrossfireBHO::serverIsActive() {
-	if (!m_server) {
-		return false;
-	}
-	boolean isActive;
-	HRESULT hr = m_server->isActive(&isActive);
-	return SUCCEEDED(hr) && isActive;
-}
-
-//STDMETHODIMP IECrossfireBHO::displayHTML(BSTR htmlText) {
-//	VARIANT variant;
-//	variant.vt = VT_NULL;
-//	CComBSTR bstr(ABOUT_BLANK);
-//	HRESULT hr = webBrowser->Navigate(bstr, &variant, &variant, &variant, &variant);
-//	if (FAILED(hr)) {
-//		Logger::error("IECrossfireBHO.displayHTML() failed", hr);
-//		return hr;
-//	}
-//	htmlToDisplay = SysAllocStringLen(htmlText, SysStringLen(htmlText));
-//	return S_OK;
-//}
-
-void STDMETHODCALLTYPE IECrossfireBHO::OnBeforeNavigate2(IDispatch* pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, VARIANT_BOOL* Cancel) {
-	if (wcsstr(URL->bstrVal, DEBUG_STOP) && serverIsActive()) {
-		if (stopDebugging()) {
-			*Cancel = VARIANT_TRUE;
-		}
-	} else if (wcsstr(URL->bstrVal, DEBUG_START)) {
-		if (startDebugging()) {
-			*Cancel = VARIANT_TRUE;
-		}
-	}
-}
-
-void STDMETHODCALLTYPE IECrossfireBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL) {
-//	if (!htmlToDisplay || wcscmp(pvarURL->bstrVal, ABOUT_BLANK) != 0) {
-//		return;
-//	}
-//
-//	CComPtr<IUnknown> webBrowserIUnknown = NULL;
-//	HRESULT hr = webBrowser->QueryInterface(IID_IUnknown, (void**)&webBrowserIUnknown);
-//	if (SUCCEEDED(hr)) {
-//		CComPtr<IUnknown> pDispIUnknown = NULL;
-//		hr = pDisp->QueryInterface(IID_IUnknown, (void**)&pDispIUnknown );
-//		if (SUCCEEDED(hr)) {
-//			if (webBrowserIUnknown == pDispIUnknown) {
-//				/* this is the top-level page frame */
-//				wchar_t* text = (wchar_t*)htmlToDisplay;
-//				size_t length = (wcslen(text) + 1) * 2;
-//				HGLOBAL buffer = GlobalAlloc(GPTR, length);
-//				if (buffer) {
-//					wcscpy((wchar_t*)buffer, text);
-//					CComPtr<IStream> stream = NULL;
-//					HRESULT hr = CreateStreamOnHGlobal(buffer, false, &stream);
-//					if (SUCCEEDED(hr)) {
-//						CComPtr<IDispatch> document = NULL;
-//						CComPtr<IPersistStreamInit> persistStreamInit = NULL;
-//						HRESULT hr = webBrowser->get_Document(&document);
-//						if (SUCCEEDED(hr)) {
-//							hr = document->QueryInterface(IID_IPersistStreamInit, (void**)&persistStreamInit);
-//							if (SUCCEEDED(hr)) {
-//								hr = persistStreamInit->InitNew();
-//								if (SUCCEEDED(hr)) {
-//									hr = persistStreamInit->Load(stream);
-//								}
-//							}
-//						}
-//						if (FAILED(hr)) {
-//							Logger::error("IECrossfireBHO.OnDocumentComplete() failed setting page content", hr);
-//						}
-//					} else {
-//						Logger::error("IECrossfireBHO.OnDocumentComplete(): CreateStreamOnHGlobal() failed", hr);
-//					}
-//					GlobalFree(buffer);
-//				}
-//				SysFreeString(htmlToDisplay);
-//				htmlToDisplay = NULL;
-//			}
-//		}
-//	}
-//	if (FAILED(hr)) {
-//		Logger::error("IECrossfireBHO.OnDocumentComplete() failed", hr);
-//		return;
-//	}
-
-	if (!serverIsActive()) {
-		return;
-	}
-
-	CComPtr<IUnknown> webBrowserIUnknown = NULL;
-	HRESULT hr = m_webBrowser->QueryInterface(IID_IUnknown, (void**)&webBrowserIUnknown);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.OnNavigateComplete2(): QI(IUnknown)[1] failed");
-	} else {
-		CComPtr<IUnknown> pDispIUnknown = NULL;
-		hr = pDisp->QueryInterface(IID_IUnknown, (void**)&pDispIUnknown);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.OnNavigateComplete2(): QI(IUnknown)[2] failed");
-		} else {
-			if (webBrowserIUnknown == pDispIUnknown) {
-				/* this is the top-level page frame */
-				HRESULT hr = m_server->contextLoaded(GetCurrentThreadId());
-				if (FAILED(hr)) {
-					Logger::error("IECrossfireBHO.OnNavigateComplete2(): contextLoaded() failed");
-				}
-			}
-		}
-	}
-}
-
-void STDMETHODCALLTYPE IECrossfireBHO::OnNavigateComplete2(IDispatch *pDisp, VARIANT *pvarURL) {
-	if (!serverIsActive()) {
-		return;
-	}
-	CComPtr<IUnknown> webBrowserIUnknown = NULL;
-	HRESULT hr = m_webBrowser->QueryInterface(IID_IUnknown, (void**)&webBrowserIUnknown);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.OnNavigateComplete2(): QI(IUnknown)[1] failed");
-	} else {
-		CComPtr<IUnknown> pDispIUnknown = NULL;
-		hr = pDisp->QueryInterface(IID_IUnknown, (void**)&pDispIUnknown);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.OnNavigateComplete2(): QI(IUnknown)[2] failed");
-		} else {
-			if (webBrowserIUnknown == pDispIUnknown) {
-				/* this is the top-level page frame */
-				DWORD threadId = GetCurrentThreadId();
-				m_server->contextDestroyed(threadId);
-				HRESULT hr = m_server->contextCreated(threadId, pvarURL->bstrVal);
-				if (FAILED(hr)) {
-					Logger::error("IECrossfireBHO.OnNavigateComplete2(): contextCreated() failed");
-				}
-			}
-		}
-	}
-}
-
-STDMETHODIMP IECrossfireBHO::GetSite(REFIID riid, LPVOID *ppvReturn) {
-    *ppvReturn = NULL;
-	if (m_webBrowser) {
-        return m_webBrowser->QueryInterface(riid, ppvReturn);
-	}
-    return E_FAIL;
-}
-
-STDMETHODIMP IECrossfireBHO::SetSite(IUnknown* pUnkSite) {
-	HRESULT hr = S_OK;
-	if (pUnkSite) {
-		if (m_webBrowser) {
-			m_webBrowser->Release();
-			m_webBrowser = NULL;
-		}
-		hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_webBrowser);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.SetSite(): QI(IWebBrowser2) failed", hr);
-		} else {
-			hr = DispEventAdvise(m_webBrowser);
-			if (FAILED(hr)) {
-				Logger::error("IECrossfireBHO.SetSite(): DispEventAdvise() failed", hr);
-			}
-		}
-	} else {
-		if (m_eventsHooked) {
-			HRESULT hr = DispEventUnadvise(m_webBrowser);
-			if (SUCCEEDED(hr)) {
-				m_eventsHooked = false;
-			} else {
-				Logger::error("IECrossfireBHO.SetSite(): DispEventUnadvise() failed", hr);
-			}
-		}
-		m_webBrowser->Release();
-		m_webBrowser = NULL;
-	}
-
-	//return IObjectWithSiteImpl<IECrossfireBHO>::SetSite(pUnkSite);
-	return hr;
-}
-
-HRESULT IECrossfireBHO::initServer() {
-	CComPtr<IDispatch> dispatch = NULL;
-	long applicationHwnd = 0;
-	HRESULT hr = m_webBrowser->get_Application(&dispatch);
-	if (SUCCEEDED(hr)) {
-		DISPID dispId;
-		CComBSTR name("HWND");
-		hr = dispatch->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, &dispId);
-		if (SUCCEEDED(hr)) {
-			DISPPARAMS params;
-			memset(&params, 0, sizeof(DISPPARAMS));
-			VARIANT variant;
-			hr = dispatch->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &variant, NULL, NULL);
-			if (SUCCEEDED(hr)) {
-				applicationHwnd = variant.lVal;
-			}
-		}
-	}
-	if (!applicationHwnd) {
-		Logger::error("IECrossfireBHO.initServer(): failed to get the application HWND", hr);
-		return false;
-	}
-
-	CComPtr<ICrossfireServerClass> serverClass = NULL;
-	hr = CoGetClassObject(CLSID_CrossfireServer, CLSCTX_ALL, 0, IID_ICrossfireServerClass, (LPVOID*)&serverClass);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.initServer(): CoGetClassObject() failed", hr);
-		return false;
-	}
-
-	hr = serverClass->GetServer(applicationHwnd, &m_server);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.initServer(): GetController() failed", hr);
-		return false;
-	}
-
-	return true;
-}
-
-bool IECrossfireBHO::startDebugging() {
-	CComPtr<IMachineDebugManager> mdm;
-	HRESULT hr = mdm.CoCreateInstance(CLSID_MachineDebugManager, NULL, CLSCTX_ALL);
-	if (FAILED(hr)) {
-		MessageBox(NULL, L"You need the extra Active Script Debugging framework download from MS", L"Crossfire Server Startup Error", 0);
-		return false;
-	}
-
-	HKEY key;
-	hr = RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Internet Explorer\\Main", 0, KEY_READ, &key);
-	if (SUCCEEDED(hr)) {
-		wchar_t value[9];
-		DWORD size = sizeof(value);
-		hr = RegQueryValueEx(key, PREFERENCE_DISABLEIEDEBUG, NULL, NULL, (LPBYTE)value, &size);
-		if (SUCCEEDED(hr) && wcscmp(value, L"no") != 0) {
-			MessageBox(NULL, L"Internet Explorer Option \"Disable Script Debugging (Internet Explorer)\" must be unchecked for remote debugging to work.  Crossfire server has not been started.", L"Crossfire Server Startup Error", 0);
-			return false;
-		}
-	}
-	if (FAILED(hr)) {
-		Logger::error("Failed to access the DisableScriptDebuggerIE registry setting", hr);
-	}
-
-	if (!((m_server || initServer()) && !serverIsActive())) {
-		return false;
-	}
-
-	hr = m_server->start(54123);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.startDebugging(): start() failed");
-		return false;
-	}
-
-	CComBSTR url = NULL;
-	hr = m_webBrowser->get_LocationURL(&url);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.startDebugging(): get_LocationURL() failed");
-		return true;
-	}
-
-	DWORD threadId = GetCurrentThreadId();
-	hr = m_server->registerContext(threadId, url);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.startDebugging(): registerContext() failed");
-		return true;
-	}
-
-	hr = m_server->setCurrentContext(threadId);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.startDebugging(): setCurrentContext() failed");
-		return true;
-	}
-
-	return true;
-}
-
-bool IECrossfireBHO::stopDebugging() {
-	m_server->stop();
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.h
deleted file mode 100644
index 90c6e6b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include "activdbg.h"
-#include <exdispid.h>
-#include <shlguid.h>
-
-#include "IECrossfireExtension.h"
-#include "Logger.h"
-
-class ATL_NO_VTABLE IECrossfireBHO :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<IECrossfireBHO, &CLSID_IECrossfireBHO>,
-	public IObjectWithSiteImpl<IECrossfireBHO>,
-	public IIECrossfireBHO,
-	public IDispEventImpl<1, IECrossfireBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1> {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_IECrossfireBHO)
-	DECLARE_NOT_AGGREGATABLE(IECrossfireBHO)
-	BEGIN_COM_MAP(IECrossfireBHO)
-		COM_INTERFACE_ENTRY(IIECrossfireBHO)
-		COM_INTERFACE_ENTRY(IObjectWithSite)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	IECrossfireBHO();
-	~IECrossfireBHO();
-
-	/* IObjectWithSite */
-	virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, LPVOID *ppvReturn);
-	virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
-
-	/* DWebBrowserEvents2 */
-	BEGIN_SINK_MAP(IECrossfireBHO)
-		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2)
-		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
-		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete2)
-	END_SINK_MAP()
-    void STDMETHODCALLTYPE OnBeforeNavigate2(IDispatch* pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, VARIANT_BOOL* Cancel);
-	void STDMETHODCALLTYPE OnDocumentComplete(IDispatch* pDisp, VARIANT* URL);
-	void STDMETHODCALLTYPE OnNavigateComplete2(IDispatch* pDisp, VARIANT* URL);
-
-private:
-	virtual bool serverIsActive();
-	virtual HRESULT initServer();
-	bool startDebugging();
-	bool stopDebugging();
-
-	ICrossfireServer* m_server;
-	bool m_eventsHooked;
-	IWebBrowser2* m_webBrowser;
-
-	/* constants */
-	static const wchar_t* DEBUG_START;
-	static const wchar_t* DEBUG_STOP;
-	static const wchar_t* PREFERENCE_DISABLEIEDEBUG;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(IECrossfireBHO), IECrossfireBHO)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.rgs
deleted file mode 100644
index 2a35f51..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.rgs
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	IECrossfireExtension.IECrossfireBHO.1 = s 'IECrossfireBHO Class' {
-		CLSID = s '{E8779887-5AF1-4071-B4D4-6135157F142C}'
-	}
-	IECrossfireExtension.IECrossfireBHO = s 'IECrossfireBHO Class' {
-		CLSID = s '{E8779887-5AF1-4071-B4D4-6135157F142C}'
-		CurVer = s 'IECrossfireExtension.IECrossfireBHO.1'
-	}
-	NoRemove CLSID {
-		ForceRemove {E8779887-5AF1-4071-B4D4-6135157F142C} = s 'IECrossfireBHO Class' {
-			ProgID = s 'IECrossfireExtension.IECrossfireBHO.1'
-			VersionIndependentProgID = s 'IECrossfireExtension.IECrossfireBHO'
-			ForceRemove 'Programmable'
-			InprocServer32 = s '%MODULE%' {
-				val ThreadingModel = s 'Apartment'
-			}
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{3FE86E35-0025-45C7-A841-E10AFE660A7F}'
-		}
-	}
-}
-
-HKLM {
-  NoRemove SOFTWARE {
-    NoRemove Microsoft {   
-      NoRemove Windows {
-        NoRemove CurrentVersion {
-          NoRemove Explorer {
-            NoRemove 'Browser Helper Objects' {
-              ForceRemove '{E8779887-5AF1-4071-B4D4-6135157F142C}' = s 'IECrossfireBHO Class' {
-                val 'NoExplorer' = d '1'
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.cpp
deleted file mode 100644
index fd4cd02..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "resource.h"
-
-#include "IECrossfireExtension.h"
-#include "Logger.h"
-
-class CIECrossfireExtensionModule : public CAtlDllModuleT<CIECrossfireExtensionModule> {
-public :
-	DECLARE_LIBID(LIBID_IECrossfireExtensionLib)
-	DECLARE_REGISTRY_APPID_RESOURCEID(IDR_IECrossfireExtension, "{95F1ADFB-5440-462c-BAA3-9C068F1B1450}")
-};
-
-CIECrossfireExtensionModule _AtlModule;
-
-#ifdef _MANAGED
-#pragma managed(push, off)
-#endif
-
-extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) {
-	if (dwReason == DLL_PROCESS_ATTACH) {
-        DisableThreadLibraryCalls(hInstance);
-    }
-    return _AtlModule.DllMain(dwReason, lpReserved);
-}
-
-#ifdef _MANAGED
-#pragma managed(pop)
-#endif
-
-STDAPI DllCanUnloadNow() {
-    return _AtlModule.DllCanUnloadNow();
-}
-
-STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) {
-    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
-}
-
-STDAPI DllRegisterServer(void) {
-    return _AtlModule.DllRegisterServer();
-}
-
-STDAPI DllUnregisterServer(void) {
-	return _AtlModule.DllUnregisterServer();
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.def b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.def
deleted file mode 100644
index 8223fd8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.def
+++ /dev/null
@@ -1,21 +0,0 @@
-; *******************************************************************************
-; * Copyright (c) 2011 IBM Corporation and others.
-; * All rights reserved. This program and the accompanying materials
-; * are made available under the terms of the Eclipse Public License v1.0
-; * which accompanies this distribution, and is available at
-; * http://www.eclipse.org/legal/epl-v10.html
-; *
-; * Contributors:
-; *     IBM Corporation - initial API and implementation
-; *******************************************************************************
-
-
-; IECrossfireExtension.def : Declares the module parameters.
-
-LIBRARY      "IECrossfireExtension.DLL"
-
-EXPORTS
-	DllCanUnloadNow		PRIVATE
-	DllGetClassObject	PRIVATE
-	DllRegisterServer	PRIVATE
-	DllUnregisterServer	PRIVATE
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.h
deleted file mode 100644
index 0ee8c99..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.h
+++ /dev/null
@@ -1,672 +0,0 @@
-
-
-/* this ALWAYS GENERATED file contains the definitions for the interfaces */
-
-
- /* File created by MIDL compiler version 6.00.0366 */
-/* at Fri Mar 11 10:39:44 2011
- */
-/* Compiler settings for .\IECrossfireExtension.idl:
-    Oicf, W1, Zp8, env=Win32 (32b run)
-    protocol : dce , ms_ext, c_ext
-    error checks: allocation ref bounds_check enum stub_data 
-    VC __declspec() decoration level: 
-         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
-         DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING(  )
-
-#pragma warning( disable: 4049 )  /* more than 64k source lines */
-
-
-/* verify that the <rpcndr.h> version is high enough to compile this file*/
-#ifndef __REQUIRED_RPCNDR_H_VERSION__
-#define __REQUIRED_RPCNDR_H_VERSION__ 440
-#endif
-
-#include "rpc.h"
-#include "rpcndr.h"
-
-#ifndef __RPCNDR_H_VERSION__
-#error this stub requires an updated version of <rpcndr.h>
-#endif // __RPCNDR_H_VERSION__
-
-#ifndef COM_NO_WINDOWS_H
-#include "windows.h"
-#include "ole2.h"
-#endif /*COM_NO_WINDOWS_H*/
-
-#ifndef __IECrossfireExtension_h__
-#define __IECrossfireExtension_h__
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-#pragma once
-#endif
-
-/* Forward Declarations */ 
-
-#ifndef __IIECrossfireBHO_FWD_DEFINED__
-#define __IIECrossfireBHO_FWD_DEFINED__
-typedef interface IIECrossfireBHO IIECrossfireBHO;
-#endif 	/* __IIECrossfireBHO_FWD_DEFINED__ */
-
-
-#ifndef __ICrossfireServer_FWD_DEFINED__
-#define __ICrossfireServer_FWD_DEFINED__
-typedef interface ICrossfireServer ICrossfireServer;
-#endif 	/* __ICrossfireServer_FWD_DEFINED__ */
-
-
-#ifndef __ICrossfireServerClass_FWD_DEFINED__
-#define __ICrossfireServerClass_FWD_DEFINED__
-typedef interface ICrossfireServerClass ICrossfireServerClass;
-#endif 	/* __ICrossfireServerClass_FWD_DEFINED__ */
-
-
-#ifndef __IECrossfireBHO_FWD_DEFINED__
-#define __IECrossfireBHO_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class IECrossfireBHO IECrossfireBHO;
-#else
-typedef struct IECrossfireBHO IECrossfireBHO;
-#endif /* __cplusplus */
-
-#endif 	/* __IECrossfireBHO_FWD_DEFINED__ */
-
-
-#ifndef __CrossfireServer_FWD_DEFINED__
-#define __CrossfireServer_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class CrossfireServer CrossfireServer;
-#else
-typedef struct CrossfireServer CrossfireServer;
-#endif /* __cplusplus */
-
-#endif 	/* __CrossfireServer_FWD_DEFINED__ */
-
-
-#ifndef __CrossfireServerClass_FWD_DEFINED__
-#define __CrossfireServerClass_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class CrossfireServerClass CrossfireServerClass;
-#else
-typedef struct CrossfireServerClass CrossfireServerClass;
-#endif /* __cplusplus */
-
-#endif 	/* __CrossfireServerClass_FWD_DEFINED__ */
-
-
-/* header files for imported files */
-#include "oaidl.h"
-#include "ocidl.h"
-
-#ifdef __cplusplus
-extern "C"{
-#endif 
-
-void * __RPC_USER MIDL_user_allocate(size_t);
-void __RPC_USER MIDL_user_free( void * ); 
-
-#ifndef __IIECrossfireBHO_INTERFACE_DEFINED__
-#define __IIECrossfireBHO_INTERFACE_DEFINED__
-
-/* interface IIECrossfireBHO */
-/* [unique][helpstring][nonextensible][dual][uuid][object] */ 
-
-
-EXTERN_C const IID IID_IIECrossfireBHO;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("201244D7-94C6-4fb0-9948-2634523A475B")
-    IIECrossfireBHO : public IUnknown
-    {
-    public:
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IIECrossfireBHOVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            IIECrossfireBHO * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            IIECrossfireBHO * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            IIECrossfireBHO * This);
-        
-        END_INTERFACE
-    } IIECrossfireBHOVtbl;
-
-    interface IIECrossfireBHO
-    {
-        CONST_VTBL struct IIECrossfireBHOVtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IIECrossfireBHO_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IIECrossfireBHO_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IIECrossfireBHO_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-
-#endif 	/* __IIECrossfireBHO_INTERFACE_DEFINED__ */
-
-
-#ifndef __ICrossfireServer_INTERFACE_DEFINED__
-#define __ICrossfireServer_INTERFACE_DEFINED__
-
-/* interface ICrossfireServer */
-/* [unique][helpstring][nonextensible][dual][oleautomation][uuid][object] */ 
-
-
-EXTERN_C const IID IID_ICrossfireServer;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("031DB015-B1BE-4D39-84D2-D7F96D2ACBFE")
-    ICrossfireServer : public IDispatch
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE contextCreated( 
-            /* [in] */ DWORD threadId,
-            /* [string][in] */ OLECHAR *href) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE contextDestroyed( 
-            /* [in] */ DWORD threadId) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE contextLoaded( 
-            /* [in] */ DWORD threadId) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE isActive( 
-            /* [out] */ boolean *value) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE registerContext( 
-            /* [in] */ DWORD threadId,
-            /* [string][in] */ OLECHAR *href) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE setCurrentContext( 
-            /* [in] */ DWORD threadId) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE start( 
-            /* [in] */ unsigned int port) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE stop( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct ICrossfireServerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            ICrossfireServer * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            ICrossfireServer * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            ICrossfireServer * This);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( 
-            ICrossfireServer * This,
-            /* [out] */ UINT *pctinfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( 
-            ICrossfireServer * This,
-            /* [in] */ UINT iTInfo,
-            /* [in] */ LCID lcid,
-            /* [out] */ ITypeInfo **ppTInfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( 
-            ICrossfireServer * This,
-            /* [in] */ REFIID riid,
-            /* [size_is][in] */ LPOLESTR *rgszNames,
-            /* [in] */ UINT cNames,
-            /* [in] */ LCID lcid,
-            /* [size_is][out] */ DISPID *rgDispId);
-        
-        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( 
-            ICrossfireServer * This,
-            /* [in] */ DISPID dispIdMember,
-            /* [in] */ REFIID riid,
-            /* [in] */ LCID lcid,
-            /* [in] */ WORD wFlags,
-            /* [out][in] */ DISPPARAMS *pDispParams,
-            /* [out] */ VARIANT *pVarResult,
-            /* [out] */ EXCEPINFO *pExcepInfo,
-            /* [out] */ UINT *puArgErr);
-        
-        HRESULT ( STDMETHODCALLTYPE *contextCreated )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId,
-            /* [string][in] */ OLECHAR *href);
-        
-        HRESULT ( STDMETHODCALLTYPE *contextDestroyed )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId);
-        
-        HRESULT ( STDMETHODCALLTYPE *contextLoaded )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId);
-        
-        HRESULT ( STDMETHODCALLTYPE *isActive )( 
-            ICrossfireServer * This,
-            /* [out] */ boolean *value);
-        
-        HRESULT ( STDMETHODCALLTYPE *registerContext )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId,
-            /* [string][in] */ OLECHAR *href);
-        
-        HRESULT ( STDMETHODCALLTYPE *setCurrentContext )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId);
-        
-        HRESULT ( STDMETHODCALLTYPE *start )( 
-            ICrossfireServer * This,
-            /* [in] */ unsigned int port);
-        
-        HRESULT ( STDMETHODCALLTYPE *stop )( 
-            ICrossfireServer * This);
-        
-        END_INTERFACE
-    } ICrossfireServerVtbl;
-
-    interface ICrossfireServer
-    {
-        CONST_VTBL struct ICrossfireServerVtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define ICrossfireServer_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define ICrossfireServer_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define ICrossfireServer_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define ICrossfireServer_GetTypeInfoCount(This,pctinfo)	\
-    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)
-
-#define ICrossfireServer_GetTypeInfo(This,iTInfo,lcid,ppTInfo)	\
-    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-
-#define ICrossfireServer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)	\
-    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-
-#define ICrossfireServer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)	\
-    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-
-
-#define ICrossfireServer_contextCreated(This,threadId,href)	\
-    (This)->lpVtbl -> contextCreated(This,threadId,href)
-
-#define ICrossfireServer_contextDestroyed(This,threadId)	\
-    (This)->lpVtbl -> contextDestroyed(This,threadId)
-
-#define ICrossfireServer_contextLoaded(This,threadId)	\
-    (This)->lpVtbl -> contextLoaded(This,threadId)
-
-#define ICrossfireServer_isActive(This,value)	\
-    (This)->lpVtbl -> isActive(This,value)
-
-#define ICrossfireServer_registerContext(This,threadId,href)	\
-    (This)->lpVtbl -> registerContext(This,threadId,href)
-
-#define ICrossfireServer_setCurrentContext(This,threadId)	\
-    (This)->lpVtbl -> setCurrentContext(This,threadId)
-
-#define ICrossfireServer_start(This,port)	\
-    (This)->lpVtbl -> start(This,port)
-
-#define ICrossfireServer_stop(This)	\
-    (This)->lpVtbl -> stop(This)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_contextCreated_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId,
-    /* [string][in] */ OLECHAR *href);
-
-
-void __RPC_STUB ICrossfireServer_contextCreated_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_contextDestroyed_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId);
-
-
-void __RPC_STUB ICrossfireServer_contextDestroyed_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_contextLoaded_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId);
-
-
-void __RPC_STUB ICrossfireServer_contextLoaded_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_isActive_Proxy( 
-    ICrossfireServer * This,
-    /* [out] */ boolean *value);
-
-
-void __RPC_STUB ICrossfireServer_isActive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_registerContext_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId,
-    /* [string][in] */ OLECHAR *href);
-
-
-void __RPC_STUB ICrossfireServer_registerContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_setCurrentContext_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId);
-
-
-void __RPC_STUB ICrossfireServer_setCurrentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_start_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ unsigned int port);
-
-
-void __RPC_STUB ICrossfireServer_start_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_stop_Proxy( 
-    ICrossfireServer * This);
-
-
-void __RPC_STUB ICrossfireServer_stop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __ICrossfireServer_INTERFACE_DEFINED__ */
-
-
-#ifndef __ICrossfireServerClass_INTERFACE_DEFINED__
-#define __ICrossfireServerClass_INTERFACE_DEFINED__
-
-/* interface ICrossfireServerClass */
-/* [unique][helpstring][nonextensible][dual][oleautomation][uuid][object] */ 
-
-
-EXTERN_C const IID IID_ICrossfireServerClass;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("F48260BB-C061-4410-9CE1-4C5C7602690E")
-    ICrossfireServerClass : public IDispatch
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetServer( 
-            /* [in] */ unsigned long windowHandle,
-            /* [retval][out] */ ICrossfireServer **_value) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveServer( 
-            /* [in] */ unsigned long windowHandle) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct ICrossfireServerClassVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            ICrossfireServerClass * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            ICrossfireServerClass * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            ICrossfireServerClass * This);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( 
-            ICrossfireServerClass * This,
-            /* [out] */ UINT *pctinfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( 
-            ICrossfireServerClass * This,
-            /* [in] */ UINT iTInfo,
-            /* [in] */ LCID lcid,
-            /* [out] */ ITypeInfo **ppTInfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( 
-            ICrossfireServerClass * This,
-            /* [in] */ REFIID riid,
-            /* [size_is][in] */ LPOLESTR *rgszNames,
-            /* [in] */ UINT cNames,
-            /* [in] */ LCID lcid,
-            /* [size_is][out] */ DISPID *rgDispId);
-        
-        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( 
-            ICrossfireServerClass * This,
-            /* [in] */ DISPID dispIdMember,
-            /* [in] */ REFIID riid,
-            /* [in] */ LCID lcid,
-            /* [in] */ WORD wFlags,
-            /* [out][in] */ DISPPARAMS *pDispParams,
-            /* [out] */ VARIANT *pVarResult,
-            /* [out] */ EXCEPINFO *pExcepInfo,
-            /* [out] */ UINT *puArgErr);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetServer )( 
-            ICrossfireServerClass * This,
-            /* [in] */ unsigned long windowHandle,
-            /* [retval][out] */ ICrossfireServer **_value);
-        
-        HRESULT ( STDMETHODCALLTYPE *RemoveServer )( 
-            ICrossfireServerClass * This,
-            /* [in] */ unsigned long windowHandle);
-        
-        END_INTERFACE
-    } ICrossfireServerClassVtbl;
-
-    interface ICrossfireServerClass
-    {
-        CONST_VTBL struct ICrossfireServerClassVtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define ICrossfireServerClass_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define ICrossfireServerClass_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define ICrossfireServerClass_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define ICrossfireServerClass_GetTypeInfoCount(This,pctinfo)	\
-    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)
-
-#define ICrossfireServerClass_GetTypeInfo(This,iTInfo,lcid,ppTInfo)	\
-    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-
-#define ICrossfireServerClass_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)	\
-    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-
-#define ICrossfireServerClass_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)	\
-    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-
-
-#define ICrossfireServerClass_GetServer(This,windowHandle,_value)	\
-    (This)->lpVtbl -> GetServer(This,windowHandle,_value)
-
-#define ICrossfireServerClass_RemoveServer(This,windowHandle)	\
-    (This)->lpVtbl -> RemoveServer(This,windowHandle)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServerClass_GetServer_Proxy( 
-    ICrossfireServerClass * This,
-    /* [in] */ unsigned long windowHandle,
-    /* [retval][out] */ ICrossfireServer **_value);
-
-
-void __RPC_STUB ICrossfireServerClass_GetServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServerClass_RemoveServer_Proxy( 
-    ICrossfireServerClass * This,
-    /* [in] */ unsigned long windowHandle);
-
-
-void __RPC_STUB ICrossfireServerClass_RemoveServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __ICrossfireServerClass_INTERFACE_DEFINED__ */
-
-
-
-#ifndef __IECrossfireExtensionLib_LIBRARY_DEFINED__
-#define __IECrossfireExtensionLib_LIBRARY_DEFINED__
-
-/* library IECrossfireExtensionLib */
-/* [helpstring][version][uuid] */ 
-
-
-EXTERN_C const IID LIBID_IECrossfireExtensionLib;
-
-EXTERN_C const CLSID CLSID_IECrossfireBHO;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("E8779887-5AF1-4071-B4D4-6135157F142C")
-IECrossfireBHO;
-#endif
-
-EXTERN_C const CLSID CLSID_CrossfireServer;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("47836AF4-3E0C-4995-8029-FF931C5A43FC")
-CrossfireServer;
-#endif
-
-EXTERN_C const CLSID CLSID_CrossfireServerClass;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25")
-CrossfireServerClass;
-#endif
-#endif /* __IECrossfireExtensionLib_LIBRARY_DEFINED__ */
-
-/* Additional Prototypes for ALL interfaces */
-
-/* end of Additional Prototypes */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.idl b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.idl
deleted file mode 100644
index 988407d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.idl
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-import "oaidl.idl";
-import "ocidl.idl";
-
-[
-	object,
-	uuid(201244D7-94C6-4fb0-9948-2634523A475B),
-	dual,
-	nonextensible,
-	helpstring("IIECrossfireBHO Interface"),
-	pointer_default(unique)
-]
-interface IIECrossfireBHO : IUnknown {
-};
-[
-	object,
-	uuid(031DB015-B1BE-4D39-84D2-D7F96D2ACBFE),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("ICrossfireServer Interface"),
-	pointer_default(unique)
-]
-interface ICrossfireServer : IDispatch {
-	HRESULT contextCreated([in] DWORD threadId, [in, string] OLECHAR* href);
-	HRESULT contextDestroyed([in] DWORD threadId);
-	HRESULT contextLoaded([in] DWORD threadId);
-	HRESULT isActive([out] boolean* value);
-	HRESULT registerContext([in] DWORD threadId, [in, string] OLECHAR* href);
-	HRESULT setCurrentContext([in] DWORD threadId);
-	HRESULT start([in] unsigned int port);
-	HRESULT stop();
-};
-[
-	object,
-	uuid(F48260BB-C061-4410-9CE1-4C5C7602690E),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("ICrossfireServerClass Interface"),
-	pointer_default(unique)
-]
-interface ICrossfireServerClass : IDispatch {
-	HRESULT GetServer([in] unsigned long windowHandle, [out, retval] ICrossfireServer** _value);
-	HRESULT RemoveServer([in] unsigned long windowHandle);
-};
-[
-	uuid(A8FFC284-CE2C-40B5-98D1-D3112811E9D9),
-	version(1.0),
-	helpstring("IECrossfireExtension 1.0 Type Library")
-]
-library IECrossfireExtensionLib
-{
-	importlib("stdole2.tlb");
-	[
-		uuid(E8779887-5AF1-4071-B4D4-6135157F142C),
-		helpstring("IECrossfireBHO Class")
-	]
-	coclass IECrossfireBHO
-	{
-		[default] interface IIECrossfireBHO;
-	};
-	[
-		uuid(47836AF4-3E0C-4995-8029-FF931C5A43FC),
-		helpstring("CrossfireServer Class")
-	]
-	coclass CrossfireServer
-	{
-		[default] interface ICrossfireServer;
-	};
-	[
-		uuid(7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25),
-		helpstring("CrossfireServerClass Class")
-	]
-	coclass CrossfireServerClass
-	{
-		[default] interface ICrossfireServerClass;
-	};
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rc b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rc
deleted file mode 100644
index 0bd6c2f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rc
+++ /dev/null
@@ -1,81 +0,0 @@
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-#include "winres.h"
-#undef APSTUDIO_READONLY_SYMBOLS
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "#include ""winres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "1 TYPELIB ""IECrossfireExtension.tlb""\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,1
- PRODUCTVERSION 1,0,0,1
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x2L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904e4"
-        BEGIN
-            VALUE "CompanyName", "Eclipse Foundation\0"
-            VALUE "FileDescription", "IE Crossfire BHO\0"
-            VALUE "FileVersion", "1.0.0.0\0"
-            VALUE "LegalCopyright", "Copyright (c) 2011 IBM Corp.  All Rights Reserved.\0"
-            VALUE "InternalName", "IECrossfireExtension\0"
-            VALUE "OriginalFilename", "IECrossfireExtension.dll\0"
-            VALUE "ProductName", "IE Crossfire Server\0"
-            VALUE "ProductVersion", "0,0,0,0\0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1252
-    END
-END
-
-IDR_IECrossfireExtension         REGISTRY                "IECrossfireExtension.rgs"
-IDR_IECrossfireBHO               REGISTRY                "IECrossfireBHO.rgs"
-
-STRINGTABLE 
-BEGIN
-    IDS_PROJNAME            "IECrossfireExtension"
-END
-
-#endif    // English resources
-
-#ifndef APSTUDIO_INVOKED
-1 TYPELIB "IECrossfireExtension.tlb"
-
-#endif    // not APSTUDIO_INVOKED
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rgs
deleted file mode 100644
index 15f8a8d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rgs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	NoRemove AppID {
-		'%APPID%' = s 'IECrossfireExtension'
-		'IECrossfireExtension.DLL' {
-			val AppID = s '%APPID%'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcproj
deleted file mode 100644
index e43990b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcproj
+++ /dev/null
@@ -1,334 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="IECrossfireExtension"
-	ProjectGUID="{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}"
-	RootNamespace="IECrossfireExtension"
-	Keyword="AtlProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			UseOfATL="2"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				PreprocessorDefinitions="_DEBUG"
-				MkTypLibCompatible="false"
-				TargetEnvironment="1"
-				GenerateStublessProxies="true"
-				TypeLibraryName="$(IntDir)/IECrossfireExtension.tlb"
-				HeaderFileName="IECrossfireExtension.h"
-				DLLDataFileName=""
-				InterfaceIdentifierFileName="IECrossfireExtension_i.c"
-				ProxyFileName="IECrossfireExtension_p.c"
-				ValidateParameters="false"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;_USRDLL"
-				GeneratePreprocessedFile="0"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="2"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="_DEBUG"
-				Culture="1033"
-				AdditionalIncludeDirectories="$(IntDir)"
-				ResourceOutputFileName="$(IntDir)/$(InputName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				RegisterOutput="true"
-				IgnoreImportLibrary="true"
-				AdditionalDependencies="WS2_32.lib"
-				LinkIncremental="2"
-				ModuleDefinitionFile=".\IECrossfireExtension.def"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			UseOfATL="2"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				PreprocessorDefinitions="NDEBUG"
-				MkTypLibCompatible="false"
-				TargetEnvironment="1"
-				GenerateStublessProxies="true"
-				TypeLibraryName="$(IntDir)/IECrossfireExtension.tlb"
-				HeaderFileName="IECrossfireExtension.h"
-				DLLDataFileName=""
-				InterfaceIdentifierFileName="IECrossfireExtension_i.c"
-				ProxyFileName="IECrossfireExtension_p.c"
-				ValidateParameters="false"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_USRDLL"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="2"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="NDEBUG"
-				Culture="1033"
-				AdditionalIncludeDirectories="$(IntDir)"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				RegisterOutput="true"
-				IgnoreImportLibrary="true"
-				AdditionalDependencies="WS2_32.lib"
-				LinkIncremental="1"
-				ModuleDefinitionFile=".\IECrossfireExtension.def"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\IECrossfireBHO.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireExtension.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireExtension.def"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireExtension.idl"
-				>
-			</File>
-			<File
-				RelativePath=".\Logger.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\stdafx.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath=".\activdbg.h"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireBHO.h"
-				>
-			</File>
-			<File
-				RelativePath=".\Logger.h"
-				>
-			</File>
-			<File
-				RelativePath=".\Resource.h"
-				>
-			</File>
-			<File
-				RelativePath=".\stdafx.h"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath=".\IECrossfireBHO.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireExtension.rc"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireExtension.rgs"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Generated Files"
-			SourceControlFiles="false"
-			>
-			<File
-				RelativePath=".\IECrossfireExtension.h"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireExtension_i.c"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-					/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcproj
deleted file mode 100644
index 2c4f854..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcproj
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="IECrossfireExtensionPS"
-	ProjectGUID="{0B6A6526-C6C0-4619-A938-E3D90A16A9B7}"
-	RootNamespace="IECrossfireExtensionPS"
-	Keyword="AtlPSProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(ConfigurationName)PS"
-			IntermediateDirectory="$(ConfigurationName)PS"
-			ConfigurationType="2"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-				Description="Checking for required files"
-				CommandLine="if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				PreprocessorDefinitions="WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;_DEBUG"
-				RuntimeLibrary="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				RegisterOutput="true"
-				AdditionalDependencies="kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib"
-				ModuleDefinitionFile="EWExtensionPS.def"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(ConfigurationName)PS"
-			IntermediateDirectory="$(ConfigurationName)PS"
-			ConfigurationType="2"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-				Description="Checking for required files"
-				CommandLine="if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				PreprocessorDefinitions="WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG"
-				RuntimeLibrary="2"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				RegisterOutput="true"
-				AdditionalDependencies="kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib"
-				ModuleDefinitionFile="EWExtensionPS.def"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			>
-		</Filter>
-		<Filter
-			Name="Generated Files"
-			SourceControlFiles="false"
-			>
-			<File
-				RelativePath=".\dlldata.c"
-				>
-			</File>
-			<File
-				RelativePath=".\EWExtension_i.c"
-				>
-			</File>
-			<File
-				RelativePath=".\EWExtension_p.c"
-				>
-			</File>
-		</Filter>
-		<File
-			RelativePath=".\EWExtensionps.def"
-			>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension_i.c b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension_i.c
deleted file mode 100644
index 1b10257..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension_i.c
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
-
-/* link this file in with the server and any clients */
-
-
- /* File created by MIDL compiler version 6.00.0366 */
-/* at Fri Mar 11 10:39:44 2011
- */
-/* Compiler settings for .\IECrossfireExtension.idl:
-    Oicf, W1, Zp8, env=Win32 (32b run)
-    protocol : dce , ms_ext, c_ext
-    error checks: allocation ref bounds_check enum stub_data 
-    VC __declspec() decoration level: 
-         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
-         DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING(  )
-
-#pragma warning( disable: 4049 )  /* more than 64k source lines */
-
-
-#ifdef __cplusplus
-extern "C"{
-#endif 
-
-
-#include <rpc.h>
-#include <rpcndr.h>
-
-#ifdef _MIDL_USE_GUIDDEF_
-
-#ifndef INITGUID
-#define INITGUID
-#include <guiddef.h>
-#undef INITGUID
-#else
-#include <guiddef.h>
-#endif
-
-#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
-        DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
-
-#else // !_MIDL_USE_GUIDDEF_
-
-#ifndef __IID_DEFINED__
-#define __IID_DEFINED__
-
-typedef struct _IID
-{
-    unsigned long x;
-    unsigned short s1;
-    unsigned short s2;
-    unsigned char  c[8];
-} IID;
-
-#endif // __IID_DEFINED__
-
-#ifndef CLSID_DEFINED
-#define CLSID_DEFINED
-typedef IID CLSID;
-#endif // CLSID_DEFINED
-
-#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
-        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
-
-#endif !_MIDL_USE_GUIDDEF_
-
-MIDL_DEFINE_GUID(IID, IID_IIECrossfireBHO,0x201244D7,0x94C6,0x4fb0,0x99,0x48,0x26,0x34,0x52,0x3A,0x47,0x5B);
-
-
-MIDL_DEFINE_GUID(IID, IID_ICrossfireServer,0x031DB015,0xB1BE,0x4D39,0x84,0xD2,0xD7,0xF9,0x6D,0x2A,0xCB,0xFE);
-
-
-MIDL_DEFINE_GUID(IID, IID_ICrossfireServerClass,0xF48260BB,0xC061,0x4410,0x9C,0xE1,0x4C,0x5C,0x76,0x02,0x69,0x0E);
-
-
-MIDL_DEFINE_GUID(IID, LIBID_IECrossfireExtensionLib,0xA8FFC284,0xCE2C,0x40B5,0x98,0xD1,0xD3,0x11,0x28,0x11,0xE9,0xD9);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_IECrossfireBHO,0xE8779887,0x5AF1,0x4071,0xB4,0xD4,0x61,0x35,0x15,0x7F,0x14,0x2C);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_CrossfireServer,0x47836AF4,0x3E0C,0x4995,0x80,0x29,0xFF,0x93,0x1C,0x5A,0x43,0xFC);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_CrossfireServerClass,0x7C3C5D7A,0xAF4D,0x4F32,0xA3,0xC9,0x46,0x2B,0xFB,0xAF,0xDC,0x25);
-
-#undef MIDL_DEFINE_GUID
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension_p.c b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension_p.c
deleted file mode 100644
index c8ec64e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension_p.c
+++ /dev/null
@@ -1,714 +0,0 @@
-
-
-/* this ALWAYS GENERATED file contains the proxy stub code */
-
-
- /* File created by MIDL compiler version 6.00.0366 */
-/* at Fri Mar 11 10:39:44 2011
- */
-/* Compiler settings for .\IECrossfireExtension.idl:
-    Oicf, W1, Zp8, env=Win32 (32b run)
-    protocol : dce , ms_ext, c_ext
-    error checks: allocation ref bounds_check enum stub_data 
-    VC __declspec() decoration level: 
-         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
-         DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING(  )
-
-#if !defined(_M_IA64) && !defined(_M_AMD64)
-
-
-#pragma warning( disable: 4049 )  /* more than 64k source lines */
-#if _MSC_VER >= 1200
-#pragma warning(push)
-#endif
-#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */
-#pragma warning( disable: 4211 )  /* redefine extent to static */
-#pragma warning( disable: 4232 )  /* dllimport identity*/
-#pragma optimize("", off ) 
-
-#define USE_STUBLESS_PROXY
-
-
-/* verify that the <rpcproxy.h> version is high enough to compile this file*/
-#ifndef __REDQ_RPCPROXY_H_VERSION__
-#define __REQUIRED_RPCPROXY_H_VERSION__ 440
-#endif
-
-
-#include "rpcproxy.h"
-#ifndef __RPCPROXY_H_VERSION__
-#error this stub requires an updated version of <rpcproxy.h>
-#endif // __RPCPROXY_H_VERSION__
-
-
-#include "IECrossfireExtension.h"
-
-#define TYPE_FORMAT_STRING_SIZE   33                                
-#define PROC_FORMAT_STRING_SIZE   265                               
-#define TRANSMIT_AS_TABLE_SIZE    0            
-#define WIRE_MARSHAL_TABLE_SIZE   0            
-
-typedef struct _MIDL_TYPE_FORMAT_STRING
-    {
-    short          Pad;
-    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];
-    } MIDL_TYPE_FORMAT_STRING;
-
-typedef struct _MIDL_PROC_FORMAT_STRING
-    {
-    short          Pad;
-    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];
-    } MIDL_PROC_FORMAT_STRING;
-
-
-static RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 
-{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
-
-
-extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString;
-extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString;
-
-
-extern const MIDL_STUB_DESC Object_StubDesc;
-
-
-extern const MIDL_SERVER_INFO IIECrossfireBHO_ServerInfo;
-extern const MIDL_STUBLESS_PROXY_INFO IIECrossfireBHO_ProxyInfo;
-
-
-extern const MIDL_STUB_DESC Object_StubDesc;
-
-
-extern const MIDL_SERVER_INFO ICrossfireServer_ServerInfo;
-extern const MIDL_STUBLESS_PROXY_INFO ICrossfireServer_ProxyInfo;
-
-
-extern const MIDL_STUB_DESC Object_StubDesc;
-
-
-extern const MIDL_SERVER_INFO ICrossfireServerClass_ServerInfo;
-extern const MIDL_STUBLESS_PROXY_INFO ICrossfireServerClass_ProxyInfo;
-
-
-
-#if !defined(__RPC_WIN32__)
-#error  Invalid build platform for this stub.
-#endif
-
-#if !(TARGET_IS_NT40_OR_LATER)
-#error You need a Windows NT 4.0 or later to run this stub because it uses these features:
-#error   -Oif or -Oicf.
-#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.
-#error This app will die there with the RPC_X_WRONG_STUB_VERSION error.
-#endif
-
-
-static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
-    {
-        0,
-        {
-
-	/* Procedure contextCreated */
-
-			0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/*  2 */	NdrFcLong( 0x0 ),	/* 0 */
-/*  6 */	NdrFcShort( 0x7 ),	/* 7 */
-/*  8 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */
-/* 10 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 12 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 14 */	0x6,		/* Oi2 Flags:  clt must size, has return, */
-			0x3,		/* 3 */
-
-	/* Parameter threadId */
-
-/* 16 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 18 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 20 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Parameter href */
-
-/* 22 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */
-/* 24 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 26 */	NdrFcShort( 0x4 ),	/* Type Offset=4 */
-
-	/* Return value */
-
-/* 28 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 30 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 32 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure RemoveServer */
-
-
-	/* Procedure contextDestroyed */
-
-/* 34 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 36 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 40 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 42 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 44 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 46 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 48 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter windowHandle */
-
-
-	/* Parameter threadId */
-
-/* 50 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 52 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 54 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-
-	/* Return value */
-
-/* 56 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 58 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 60 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure contextLoaded */
-
-/* 62 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 64 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 68 */	NdrFcShort( 0x9 ),	/* 9 */
-/* 70 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 72 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 74 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 76 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter threadId */
-
-/* 78 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 80 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 82 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-/* 84 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 86 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 88 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure isActive */
-
-/* 90 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 92 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 96 */	NdrFcShort( 0xa ),	/* 10 */
-/* 98 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 100 */	NdrFcShort( 0x0 ),	/* 0 */
-/* 102 */	NdrFcShort( 0x21 ),	/* 33 */
-/* 104 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter value */
-
-/* 106 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */
-/* 108 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 110 */	0x3,		/* FC_SMALL */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-/* 112 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 114 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 116 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure registerContext */
-
-/* 118 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 120 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 124 */	NdrFcShort( 0xb ),	/* 11 */
-/* 126 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */
-/* 128 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 130 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 132 */	0x6,		/* Oi2 Flags:  clt must size, has return, */
-			0x3,		/* 3 */
-
-	/* Parameter threadId */
-
-/* 134 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 136 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 138 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Parameter href */
-
-/* 140 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */
-/* 142 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 144 */	NdrFcShort( 0x4 ),	/* Type Offset=4 */
-
-	/* Return value */
-
-/* 146 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 148 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 150 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure setCurrentContext */
-
-/* 152 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 154 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 158 */	NdrFcShort( 0xc ),	/* 12 */
-/* 160 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 162 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 164 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 166 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter threadId */
-
-/* 168 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 170 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 172 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-/* 174 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 176 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 178 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure start */
-
-/* 180 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 182 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 186 */	NdrFcShort( 0xd ),	/* 13 */
-/* 188 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 190 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 192 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 194 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter port */
-
-/* 196 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 198 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 200 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-/* 202 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 204 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 206 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure stop */
-
-/* 208 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 210 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 214 */	NdrFcShort( 0xe ),	/* 14 */
-/* 216 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 218 */	NdrFcShort( 0x0 ),	/* 0 */
-/* 220 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 222 */	0x4,		/* Oi2 Flags:  has return, */
-			0x1,		/* 1 */
-
-	/* Return value */
-
-/* 224 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 226 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 228 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure GetServer */
-
-/* 230 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 232 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 236 */	NdrFcShort( 0x7 ),	/* 7 */
-/* 238 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */
-/* 240 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 242 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 244 */	0x5,		/* Oi2 Flags:  srv must size, has return, */
-			0x3,		/* 3 */
-
-	/* Parameter windowHandle */
-
-/* 246 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 248 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 250 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Parameter _value */
-
-/* 252 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */
-/* 254 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 256 */	NdrFcShort( 0xa ),	/* Type Offset=10 */
-
-	/* Return value */
-
-/* 258 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 260 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 262 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-			0x0
-        }
-    };
-
-static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString =
-    {
-        0,
-        {
-			NdrFcShort( 0x0 ),	/* 0 */
-/*  2 */	
-			0x11, 0x8,	/* FC_RP [simple_pointer] */
-/*  4 */	
-			0x25,		/* FC_C_WSTRING */
-			0x5c,		/* FC_PAD */
-/*  6 */	
-			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */
-/*  8 */	0x3,		/* FC_SMALL */
-			0x5c,		/* FC_PAD */
-/* 10 */	
-			0x11, 0x10,	/* FC_RP [pointer_deref] */
-/* 12 */	NdrFcShort( 0x2 ),	/* Offset= 2 (14) */
-/* 14 */	
-			0x2f,		/* FC_IP */
-			0x5a,		/* FC_CONSTANT_IID */
-/* 16 */	NdrFcLong( 0x31db015 ),	/* 52277269 */
-/* 20 */	NdrFcShort( 0xb1be ),	/* -20034 */
-/* 22 */	NdrFcShort( 0x4d39 ),	/* 19769 */
-/* 24 */	0x84,		/* 132 */
-			0xd2,		/* 210 */
-/* 26 */	0xd7,		/* 215 */
-			0xf9,		/* 249 */
-/* 28 */	0x6d,		/* 109 */
-			0x2a,		/* 42 */
-/* 30 */	0xcb,		/* 203 */
-			0xfe,		/* 254 */
-
-			0x0
-        }
-    };
-
-
-/* Object interface: IUnknown, ver. 0.0,
-   GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
-
-
-/* Object interface: IIECrossfireBHO, ver. 0.0,
-   GUID={0x201244D7,0x94C6,0x4fb0,{0x99,0x48,0x26,0x34,0x52,0x3A,0x47,0x5B}} */
-
-#pragma code_seg(".orpc")
-static const unsigned short IIECrossfireBHO_FormatStringOffsetTable[] =
-    {
-    0
-    };
-
-static const MIDL_STUBLESS_PROXY_INFO IIECrossfireBHO_ProxyInfo =
-    {
-    &Object_StubDesc,
-    __MIDL_ProcFormatString.Format,
-    &IIECrossfireBHO_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0
-    };
-
-
-static const MIDL_SERVER_INFO IIECrossfireBHO_ServerInfo = 
-    {
-    &Object_StubDesc,
-    0,
-    __MIDL_ProcFormatString.Format,
-    &IIECrossfireBHO_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0,
-    0};
-CINTERFACE_PROXY_VTABLE(3) _IIECrossfireBHOProxyVtbl = 
-{
-    0,
-    &IID_IIECrossfireBHO,
-    IUnknown_QueryInterface_Proxy,
-    IUnknown_AddRef_Proxy,
-    IUnknown_Release_Proxy
-};
-
-const CInterfaceStubVtbl _IIECrossfireBHOStubVtbl =
-{
-    &IID_IIECrossfireBHO,
-    &IIECrossfireBHO_ServerInfo,
-    3,
-    0, /* pure interpreted */
-    CStdStubBuffer_METHODS
-};
-
-
-/* Object interface: IDispatch, ver. 0.0,
-   GUID={0x00020400,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
-
-
-/* Object interface: ICrossfireServer, ver. 0.0,
-   GUID={0x031DB015,0xB1BE,0x4D39,{0x84,0xD2,0xD7,0xF9,0x6D,0x2A,0xCB,0xFE}} */
-
-#pragma code_seg(".orpc")
-static const unsigned short ICrossfireServer_FormatStringOffsetTable[] =
-    {
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    0,
-    34,
-    62,
-    90,
-    118,
-    152,
-    180,
-    208
-    };
-
-static const MIDL_STUBLESS_PROXY_INFO ICrossfireServer_ProxyInfo =
-    {
-    &Object_StubDesc,
-    __MIDL_ProcFormatString.Format,
-    &ICrossfireServer_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0
-    };
-
-
-static const MIDL_SERVER_INFO ICrossfireServer_ServerInfo = 
-    {
-    &Object_StubDesc,
-    0,
-    __MIDL_ProcFormatString.Format,
-    &ICrossfireServer_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0,
-    0};
-CINTERFACE_PROXY_VTABLE(15) _ICrossfireServerProxyVtbl = 
-{
-    &ICrossfireServer_ProxyInfo,
-    &IID_ICrossfireServer,
-    IUnknown_QueryInterface_Proxy,
-    IUnknown_AddRef_Proxy,
-    IUnknown_Release_Proxy ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfoCount */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfo */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetIDsOfNames */ ,
-    0 /* IDispatch_Invoke_Proxy */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::contextCreated */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::contextDestroyed */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::contextLoaded */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::isActive */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::registerContext */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::setCurrentContext */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::start */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::stop */
-};
-
-
-static const PRPC_STUB_FUNCTION ICrossfireServer_table[] =
-{
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2
-};
-
-CInterfaceStubVtbl _ICrossfireServerStubVtbl =
-{
-    &IID_ICrossfireServer,
-    &ICrossfireServer_ServerInfo,
-    15,
-    &ICrossfireServer_table[-3],
-    CStdStubBuffer_DELEGATING_METHODS
-};
-
-
-/* Object interface: ICrossfireServerClass, ver. 0.0,
-   GUID={0xF48260BB,0xC061,0x4410,{0x9C,0xE1,0x4C,0x5C,0x76,0x02,0x69,0x0E}} */
-
-#pragma code_seg(".orpc")
-static const unsigned short ICrossfireServerClass_FormatStringOffsetTable[] =
-    {
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    230,
-    34
-    };
-
-static const MIDL_STUBLESS_PROXY_INFO ICrossfireServerClass_ProxyInfo =
-    {
-    &Object_StubDesc,
-    __MIDL_ProcFormatString.Format,
-    &ICrossfireServerClass_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0
-    };
-
-
-static const MIDL_SERVER_INFO ICrossfireServerClass_ServerInfo = 
-    {
-    &Object_StubDesc,
-    0,
-    __MIDL_ProcFormatString.Format,
-    &ICrossfireServerClass_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0,
-    0};
-CINTERFACE_PROXY_VTABLE(9) _ICrossfireServerClassProxyVtbl = 
-{
-    &ICrossfireServerClass_ProxyInfo,
-    &IID_ICrossfireServerClass,
-    IUnknown_QueryInterface_Proxy,
-    IUnknown_AddRef_Proxy,
-    IUnknown_Release_Proxy ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfoCount */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfo */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetIDsOfNames */ ,
-    0 /* IDispatch_Invoke_Proxy */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServerClass::GetServer */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServerClass::RemoveServer */
-};
-
-
-static const PRPC_STUB_FUNCTION ICrossfireServerClass_table[] =
-{
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    NdrStubCall2,
-    NdrStubCall2
-};
-
-CInterfaceStubVtbl _ICrossfireServerClassStubVtbl =
-{
-    &IID_ICrossfireServerClass,
-    &ICrossfireServerClass_ServerInfo,
-    9,
-    &ICrossfireServerClass_table[-3],
-    CStdStubBuffer_DELEGATING_METHODS
-};
-
-static const MIDL_STUB_DESC Object_StubDesc = 
-    {
-    0,
-    NdrOleAllocate,
-    NdrOleFree,
-    0,
-    0,
-    0,
-    0,
-    0,
-    __MIDL_TypeFormatString.Format,
-    1, /* -error bounds_check flag */
-    0x20000, /* Ndr library version */
-    0,
-    0x600016e, /* MIDL Version 6.0.366 */
-    0,
-    0,
-    0,  /* notify & notify_flag routine table */
-    0x1, /* MIDL flag */
-    0, /* cs routines */
-    0,   /* proxy/server info */
-    0   /* Reserved5 */
-    };
-
-const CInterfaceProxyVtbl * _IECrossfireExtension_ProxyVtblList[] = 
-{
-    ( CInterfaceProxyVtbl *) &_ICrossfireServerProxyVtbl,
-    ( CInterfaceProxyVtbl *) &_ICrossfireServerClassProxyVtbl,
-    ( CInterfaceProxyVtbl *) &_IIECrossfireBHOProxyVtbl,
-    0
-};
-
-const CInterfaceStubVtbl * _IECrossfireExtension_StubVtblList[] = 
-{
-    ( CInterfaceStubVtbl *) &_ICrossfireServerStubVtbl,
-    ( CInterfaceStubVtbl *) &_ICrossfireServerClassStubVtbl,
-    ( CInterfaceStubVtbl *) &_IIECrossfireBHOStubVtbl,
-    0
-};
-
-PCInterfaceName const _IECrossfireExtension_InterfaceNamesList[] = 
-{
-    "ICrossfireServer",
-    "ICrossfireServerClass",
-    "IIECrossfireBHO",
-    0
-};
-
-const IID *  _IECrossfireExtension_BaseIIDList[] = 
-{
-    &IID_IDispatch,
-    &IID_IDispatch,
-    0,
-    0
-};
-
-
-#define _IECrossfireExtension_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _IECrossfireExtension, pIID, n)
-
-int __stdcall _IECrossfireExtension_IID_Lookup( const IID * pIID, int * pIndex )
-{
-    IID_BS_LOOKUP_SETUP
-
-    IID_BS_LOOKUP_INITIAL_TEST( _IECrossfireExtension, 3, 2 )
-    IID_BS_LOOKUP_NEXT_TEST( _IECrossfireExtension, 1 )
-    IID_BS_LOOKUP_RETURN_RESULT( _IECrossfireExtension, 3, *pIndex )
-    
-}
-
-const ExtendedProxyFileInfo IECrossfireExtension_ProxyFileInfo = 
-{
-    (PCInterfaceProxyVtblList *) & _IECrossfireExtension_ProxyVtblList,
-    (PCInterfaceStubVtblList *) & _IECrossfireExtension_StubVtblList,
-    (const PCInterfaceName * ) & _IECrossfireExtension_InterfaceNamesList,
-    (const IID ** ) & _IECrossfireExtension_BaseIIDList,
-    & _IECrossfireExtension_IID_Lookup, 
-    3,
-    2,
-    0, /* table of [async_uuid] interfaces */
-    0, /* Filler1 */
-    0, /* Filler2 */
-    0  /* Filler3 */
-};
-#pragma optimize("", on )
-#if _MSC_VER >= 1200
-#pragma warning(pop)
-#endif
-
-
-#endif /* !defined(_M_IA64) && !defined(_M_AMD64)*/
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.cpp
deleted file mode 100644
index cc72e0e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "Logger.h"
-
-Logger::Logger() {
-}
-
-Logger::~Logger() {
-}
-
-void Logger::error(char* message) {
-	log(message);
-}
-
-void Logger::error(char* message, int errorCode) {
-	std::string result;
-	std::stringstream stringStream;
-	stringStream << message;
-	stringStream << ": ";
-	stringStream << errorCode;
-	result.assign(stringStream.str());
-	error((char *)result.c_str());
-}
-
-void Logger::log(char* message) {
-	SOCKET sock;
-	struct sockaddr_in server_addr;
-	struct hostent *host;
-	host = (struct hostent *)gethostbyname((char *)"127.0.0.1");
-	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
-		return;
-	}
-	server_addr.sin_family = AF_INET;
-	server_addr.sin_port = htons(54124); // TODO
-	server_addr.sin_addr = *((struct in_addr *)host->h_addr);
-    sendto(sock, message, (int)strlen(message), 0, (struct sockaddr *)&server_addr, sizeof(sockaddr_in));
-	closesocket(sock);
-}
-
-void Logger::log(wchar_t* message) {
-	size_t newSize = 0;
-	wcstombs_s(&newSize, NULL, 0, message, 0);
-    char* chars = new char[newSize];
-    wcstombs_s(&newSize, chars, newSize, message, newSize);
-	log(chars);
-	delete[] chars;
-}
-
-void Logger::log(std::wstring* message) {
-	log((wchar_t*)message->c_str());
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.h
deleted file mode 100644
index 13c49ce..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <sstream>
-#include <winsock2.h>
-
-class Logger {
-public:
-	static void error(char* message);
-	static void error(char* message, int errorCode);
-	static void log(char* message);
-	static void log(wchar_t* message);
-	static void log(std::wstring* message);
-
-protected:
-	Logger();
-	~Logger();
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/activdbg.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/activdbg.h
deleted file mode 100644
index a004b1a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/activdbg.h
+++ /dev/null
@@ -1,9918 +0,0 @@
-/* this ALWAYS GENERATED file contains the definitions for the interfaces */
-
-
-/* File created by MIDL compiler version 3.01.75 */
-/* at Fri Sep 18 16:27:25 1998
- */
-/* Compiler settings for activdbg.idl:
-    Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext
-    error checks: none
-*/
-//@@MIDL_FILE_HEADING(  )
-#include "rpc.h"
-#include "rpcndr.h"
-#ifndef COM_NO_WINDOWS_H
-#include "windows.h"
-#include "ole2.h"
-#endif /*COM_NO_WINDOWS_H*/
-
-#ifndef __activdbg_h__
-#define __activdbg_h__
-
-#ifdef __cplusplus
-extern "C"{
-#endif 
-
-/* Forward Declarations */ 
-
-#ifndef __IActiveScriptDebug_FWD_DEFINED__
-#define __IActiveScriptDebug_FWD_DEFINED__
-typedef interface IActiveScriptDebug IActiveScriptDebug;
-#endif 	/* __IActiveScriptDebug_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptSiteDebug_FWD_DEFINED__
-#define __IActiveScriptSiteDebug_FWD_DEFINED__
-typedef interface IActiveScriptSiteDebug IActiveScriptSiteDebug;
-#endif 	/* __IActiveScriptSiteDebug_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
-#define __IActiveScriptErrorDebug_FWD_DEFINED__
-typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
-#endif 	/* __IActiveScriptErrorDebug_FWD_DEFINED__ */
-
-
-#ifndef __IDebugCodeContext_FWD_DEFINED__
-#define __IDebugCodeContext_FWD_DEFINED__
-typedef interface IDebugCodeContext IDebugCodeContext;
-#endif 	/* __IDebugCodeContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpression_FWD_DEFINED__
-#define __IDebugExpression_FWD_DEFINED__
-typedef interface IDebugExpression IDebugExpression;
-#endif 	/* __IDebugExpression_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpressionContext_FWD_DEFINED__
-#define __IDebugExpressionContext_FWD_DEFINED__
-typedef interface IDebugExpressionContext IDebugExpressionContext;
-#endif 	/* __IDebugExpressionContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
-#define __IDebugExpressionCallBack_FWD_DEFINED__
-typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
-#endif 	/* __IDebugExpressionCallBack_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrame_FWD_DEFINED__
-#define __IDebugStackFrame_FWD_DEFINED__
-typedef interface IDebugStackFrame IDebugStackFrame;
-#endif 	/* __IDebugStackFrame_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
-#define __IDebugStackFrameSniffer_FWD_DEFINED__
-typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
-#endif 	/* __IDebugStackFrameSniffer_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSnifferEx_FWD_DEFINED__
-#define __IDebugStackFrameSnifferEx_FWD_DEFINED__
-typedef interface IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx;
-#endif 	/* __IDebugStackFrameSnifferEx_FWD_DEFINED__ */
-
-
-#ifndef __IDebugSyncOperation_FWD_DEFINED__
-#define __IDebugSyncOperation_FWD_DEFINED__
-typedef interface IDebugSyncOperation IDebugSyncOperation;
-#endif 	/* __IDebugSyncOperation_FWD_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperation_FWD_DEFINED__
-#define __IDebugAsyncOperation_FWD_DEFINED__
-typedef interface IDebugAsyncOperation IDebugAsyncOperation;
-#endif 	/* __IDebugAsyncOperation_FWD_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
-#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
-typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
-#endif 	/* __IDebugAsyncOperationCallBack_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
-#define __IEnumDebugCodeContexts_FWD_DEFINED__
-typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
-#endif 	/* __IEnumDebugCodeContexts_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
-#define __IEnumDebugStackFrames_FWD_DEFINED__
-typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
-#endif 	/* __IEnumDebugStackFrames_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentInfo_FWD_DEFINED__
-#define __IDebugDocumentInfo_FWD_DEFINED__
-typedef interface IDebugDocumentInfo IDebugDocumentInfo;
-#endif 	/* __IDebugDocumentInfo_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentProvider_FWD_DEFINED__
-#define __IDebugDocumentProvider_FWD_DEFINED__
-typedef interface IDebugDocumentProvider IDebugDocumentProvider;
-#endif 	/* __IDebugDocumentProvider_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocument_FWD_DEFINED__
-#define __IDebugDocument_FWD_DEFINED__
-typedef interface IDebugDocument IDebugDocument;
-#endif 	/* __IDebugDocument_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentText_FWD_DEFINED__
-#define __IDebugDocumentText_FWD_DEFINED__
-typedef interface IDebugDocumentText IDebugDocumentText;
-#endif 	/* __IDebugDocumentText_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
-#define __IDebugDocumentTextEvents_FWD_DEFINED__
-typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
-#endif 	/* __IDebugDocumentTextEvents_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
-#define __IDebugDocumentTextAuthor_FWD_DEFINED__
-typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
-#endif 	/* __IDebugDocumentTextAuthor_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
-#define __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
-typedef interface IDebugDocumentTextExternalAuthor IDebugDocumentTextExternalAuthor;
-#endif 	/* __IDebugDocumentTextExternalAuthor_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHelper_FWD_DEFINED__
-#define __IDebugDocumentHelper_FWD_DEFINED__
-typedef interface IDebugDocumentHelper IDebugDocumentHelper;
-#endif 	/* __IDebugDocumentHelper_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHost_FWD_DEFINED__
-#define __IDebugDocumentHost_FWD_DEFINED__
-typedef interface IDebugDocumentHost IDebugDocumentHost;
-#endif 	/* __IDebugDocumentHost_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentContext_FWD_DEFINED__
-#define __IDebugDocumentContext_FWD_DEFINED__
-typedef interface IDebugDocumentContext IDebugDocumentContext;
-#endif 	/* __IDebugDocumentContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugSessionProvider_FWD_DEFINED__
-#define __IDebugSessionProvider_FWD_DEFINED__
-typedef interface IDebugSessionProvider IDebugSessionProvider;
-#endif 	/* __IDebugSessionProvider_FWD_DEFINED__ */
-
-
-#ifndef __IApplicationDebugger_FWD_DEFINED__
-#define __IApplicationDebugger_FWD_DEFINED__
-typedef interface IApplicationDebugger IApplicationDebugger;
-#endif 	/* __IApplicationDebugger_FWD_DEFINED__ */
-
-
-#ifndef __IApplicationDebuggerUI_FWD_DEFINED__
-#define __IApplicationDebuggerUI_FWD_DEFINED__
-typedef interface IApplicationDebuggerUI IApplicationDebuggerUI;
-#endif 	/* __IApplicationDebuggerUI_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManager_FWD_DEFINED__
-#define __IMachineDebugManager_FWD_DEFINED__
-typedef interface IMachineDebugManager IMachineDebugManager;
-#endif 	/* __IMachineDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
-#define __IMachineDebugManagerCookie_FWD_DEFINED__
-typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
-#endif 	/* __IMachineDebugManagerCookie_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
-#define __IMachineDebugManagerEvents_FWD_DEFINED__
-typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
-#endif 	/* __IMachineDebugManagerEvents_FWD_DEFINED__ */
-
-
-#ifndef __IProcessDebugManager_FWD_DEFINED__
-#define __IProcessDebugManager_FWD_DEFINED__
-typedef interface IProcessDebugManager IProcessDebugManager;
-#endif 	/* __IProcessDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplication_FWD_DEFINED__
-#define __IRemoteDebugApplication_FWD_DEFINED__
-typedef interface IRemoteDebugApplication IRemoteDebugApplication;
-#endif 	/* __IRemoteDebugApplication_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplication_FWD_DEFINED__
-#define __IDebugApplication_FWD_DEFINED__
-typedef interface IDebugApplication IDebugApplication;
-#endif 	/* __IDebugApplication_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationEvents_FWD_DEFINED__
-#define __IRemoteDebugApplicationEvents_FWD_DEFINED__
-typedef interface IRemoteDebugApplicationEvents IRemoteDebugApplicationEvents;
-#endif 	/* __IRemoteDebugApplicationEvents_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNode_FWD_DEFINED__
-#define __IDebugApplicationNode_FWD_DEFINED__
-typedef interface IDebugApplicationNode IDebugApplicationNode;
-#endif 	/* __IDebugApplicationNode_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
-#define __IDebugApplicationNodeEvents_FWD_DEFINED__
-typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
-#endif 	/* __IDebugApplicationNodeEvents_FWD_DEFINED__ */
-
-
-#ifndef __IDebugThreadCall_FWD_DEFINED__
-#define __IDebugThreadCall_FWD_DEFINED__
-typedef interface IDebugThreadCall IDebugThreadCall;
-#endif 	/* __IDebugThreadCall_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
-#define __IRemoteDebugApplicationThread_FWD_DEFINED__
-typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
-#endif 	/* __IRemoteDebugApplicationThread_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationThread_FWD_DEFINED__
-#define __IDebugApplicationThread_FWD_DEFINED__
-typedef interface IDebugApplicationThread IDebugApplicationThread;
-#endif 	/* __IDebugApplicationThread_FWD_DEFINED__ */
-
-
-#ifndef __IDebugCookie_FWD_DEFINED__
-#define __IDebugCookie_FWD_DEFINED__
-typedef interface IDebugCookie IDebugCookie;
-#endif 	/* __IDebugCookie_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
-#define __IEnumDebugApplicationNodes_FWD_DEFINED__
-typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
-#endif 	/* __IEnumDebugApplicationNodes_FWD_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
-#define __IEnumRemoteDebugApplications_FWD_DEFINED__
-typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
-#endif 	/* __IEnumRemoteDebugApplications_FWD_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
-#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
-typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
-#endif 	/* __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__ */
-
-
-#ifndef __IDebugFormatter_FWD_DEFINED__
-#define __IDebugFormatter_FWD_DEFINED__
-typedef interface IDebugFormatter IDebugFormatter;
-#endif 	/* __IDebugFormatter_FWD_DEFINED__ */
-
-
-#ifndef __ISimpleConnectionPoint_FWD_DEFINED__
-#define __ISimpleConnectionPoint_FWD_DEFINED__
-typedef interface ISimpleConnectionPoint ISimpleConnectionPoint;
-#endif 	/* __ISimpleConnectionPoint_FWD_DEFINED__ */
-
-
-#ifndef __IDebugHelper_FWD_DEFINED__
-#define __IDebugHelper_FWD_DEFINED__
-typedef interface IDebugHelper IDebugHelper;
-#endif 	/* __IDebugHelper_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
-#define __IEnumDebugExpressionContexts_FWD_DEFINED__
-typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
-#endif 	/* __IEnumDebugExpressionContexts_FWD_DEFINED__ */
-
-
-#ifndef __IProvideExpressionContexts_FWD_DEFINED__
-#define __IProvideExpressionContexts_FWD_DEFINED__
-typedef interface IProvideExpressionContexts IProvideExpressionContexts;
-#endif 	/* __IProvideExpressionContexts_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptDebug_FWD_DEFINED__
-#define __IActiveScriptDebug_FWD_DEFINED__
-typedef interface IActiveScriptDebug IActiveScriptDebug;
-#endif 	/* __IActiveScriptDebug_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
-#define __IActiveScriptErrorDebug_FWD_DEFINED__
-typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
-#endif 	/* __IActiveScriptErrorDebug_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptSiteDebug_FWD_DEFINED__
-#define __IActiveScriptSiteDebug_FWD_DEFINED__
-typedef interface IActiveScriptSiteDebug IActiveScriptSiteDebug;
-#endif 	/* __IActiveScriptSiteDebug_FWD_DEFINED__ */
-
-
-#ifndef __IApplicationDebugger_FWD_DEFINED__
-#define __IApplicationDebugger_FWD_DEFINED__
-typedef interface IApplicationDebugger IApplicationDebugger;
-#endif 	/* __IApplicationDebugger_FWD_DEFINED__ */
-
-
-#ifndef __IApplicationDebuggerUI_FWD_DEFINED__
-#define __IApplicationDebuggerUI_FWD_DEFINED__
-typedef interface IApplicationDebuggerUI IApplicationDebuggerUI;
-#endif 	/* __IApplicationDebuggerUI_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplication_FWD_DEFINED__
-#define __IRemoteDebugApplication_FWD_DEFINED__
-typedef interface IRemoteDebugApplication IRemoteDebugApplication;
-#endif 	/* __IRemoteDebugApplication_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplication_FWD_DEFINED__
-#define __IDebugApplication_FWD_DEFINED__
-typedef interface IDebugApplication IDebugApplication;
-#endif 	/* __IDebugApplication_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentInfo_FWD_DEFINED__
-#define __IDebugDocumentInfo_FWD_DEFINED__
-typedef interface IDebugDocumentInfo IDebugDocumentInfo;
-#endif 	/* __IDebugDocumentInfo_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentProvider_FWD_DEFINED__
-#define __IDebugDocumentProvider_FWD_DEFINED__
-typedef interface IDebugDocumentProvider IDebugDocumentProvider;
-#endif 	/* __IDebugDocumentProvider_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNode_FWD_DEFINED__
-#define __IDebugApplicationNode_FWD_DEFINED__
-typedef interface IDebugApplicationNode IDebugApplicationNode;
-#endif 	/* __IDebugApplicationNode_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
-#define __IDebugApplicationNodeEvents_FWD_DEFINED__
-typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
-#endif 	/* __IDebugApplicationNodeEvents_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
-#define __IRemoteDebugApplicationThread_FWD_DEFINED__
-typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
-#endif 	/* __IRemoteDebugApplicationThread_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationThread_FWD_DEFINED__
-#define __IDebugApplicationThread_FWD_DEFINED__
-typedef interface IDebugApplicationThread IDebugApplicationThread;
-#endif 	/* __IDebugApplicationThread_FWD_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperation_FWD_DEFINED__
-#define __IDebugAsyncOperation_FWD_DEFINED__
-typedef interface IDebugAsyncOperation IDebugAsyncOperation;
-#endif 	/* __IDebugAsyncOperation_FWD_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
-#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
-typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
-#endif 	/* __IDebugAsyncOperationCallBack_FWD_DEFINED__ */
-
-
-#ifndef __IDebugCodeContext_FWD_DEFINED__
-#define __IDebugCodeContext_FWD_DEFINED__
-typedef interface IDebugCodeContext IDebugCodeContext;
-#endif 	/* __IDebugCodeContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugCookie_FWD_DEFINED__
-#define __IDebugCookie_FWD_DEFINED__
-typedef interface IDebugCookie IDebugCookie;
-#endif 	/* __IDebugCookie_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocument_FWD_DEFINED__
-#define __IDebugDocument_FWD_DEFINED__
-typedef interface IDebugDocument IDebugDocument;
-#endif 	/* __IDebugDocument_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentContext_FWD_DEFINED__
-#define __IDebugDocumentContext_FWD_DEFINED__
-typedef interface IDebugDocumentContext IDebugDocumentContext;
-#endif 	/* __IDebugDocumentContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHelper_FWD_DEFINED__
-#define __IDebugDocumentHelper_FWD_DEFINED__
-typedef interface IDebugDocumentHelper IDebugDocumentHelper;
-#endif 	/* __IDebugDocumentHelper_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHost_FWD_DEFINED__
-#define __IDebugDocumentHost_FWD_DEFINED__
-typedef interface IDebugDocumentHost IDebugDocumentHost;
-#endif 	/* __IDebugDocumentHost_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentText_FWD_DEFINED__
-#define __IDebugDocumentText_FWD_DEFINED__
-typedef interface IDebugDocumentText IDebugDocumentText;
-#endif 	/* __IDebugDocumentText_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
-#define __IDebugDocumentTextAuthor_FWD_DEFINED__
-typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
-#endif 	/* __IDebugDocumentTextAuthor_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
-#define __IDebugDocumentTextEvents_FWD_DEFINED__
-typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
-#endif 	/* __IDebugDocumentTextEvents_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
-#define __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
-typedef interface IDebugDocumentTextExternalAuthor IDebugDocumentTextExternalAuthor;
-#endif 	/* __IDebugDocumentTextExternalAuthor_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpression_FWD_DEFINED__
-#define __IDebugExpression_FWD_DEFINED__
-typedef interface IDebugExpression IDebugExpression;
-#endif 	/* __IDebugExpression_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
-#define __IDebugExpressionCallBack_FWD_DEFINED__
-typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
-#endif 	/* __IDebugExpressionCallBack_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpressionContext_FWD_DEFINED__
-#define __IDebugExpressionContext_FWD_DEFINED__
-typedef interface IDebugExpressionContext IDebugExpressionContext;
-#endif 	/* __IDebugExpressionContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugFormatter_FWD_DEFINED__
-#define __IDebugFormatter_FWD_DEFINED__
-typedef interface IDebugFormatter IDebugFormatter;
-#endif 	/* __IDebugFormatter_FWD_DEFINED__ */
-
-
-#ifndef __IDebugHelper_FWD_DEFINED__
-#define __IDebugHelper_FWD_DEFINED__
-typedef interface IDebugHelper IDebugHelper;
-#endif 	/* __IDebugHelper_FWD_DEFINED__ */
-
-
-#ifndef __IDebugSessionProvider_FWD_DEFINED__
-#define __IDebugSessionProvider_FWD_DEFINED__
-typedef interface IDebugSessionProvider IDebugSessionProvider;
-#endif 	/* __IDebugSessionProvider_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrame_FWD_DEFINED__
-#define __IDebugStackFrame_FWD_DEFINED__
-typedef interface IDebugStackFrame IDebugStackFrame;
-#endif 	/* __IDebugStackFrame_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
-#define __IDebugStackFrameSniffer_FWD_DEFINED__
-typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
-#endif 	/* __IDebugStackFrameSniffer_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSnifferEx_FWD_DEFINED__
-#define __IDebugStackFrameSnifferEx_FWD_DEFINED__
-typedef interface IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx;
-#endif 	/* __IDebugStackFrameSnifferEx_FWD_DEFINED__ */
-
-
-#ifndef __IDebugSyncOperation_FWD_DEFINED__
-#define __IDebugSyncOperation_FWD_DEFINED__
-typedef interface IDebugSyncOperation IDebugSyncOperation;
-#endif 	/* __IDebugSyncOperation_FWD_DEFINED__ */
-
-
-#ifndef __IDebugThreadCall_FWD_DEFINED__
-#define __IDebugThreadCall_FWD_DEFINED__
-typedef interface IDebugThreadCall IDebugThreadCall;
-#endif 	/* __IDebugThreadCall_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
-#define __IEnumDebugApplicationNodes_FWD_DEFINED__
-typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
-#endif 	/* __IEnumDebugApplicationNodes_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
-#define __IEnumDebugCodeContexts_FWD_DEFINED__
-typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
-#endif 	/* __IEnumDebugCodeContexts_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
-#define __IEnumDebugExpressionContexts_FWD_DEFINED__
-typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
-#endif 	/* __IEnumDebugExpressionContexts_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
-#define __IEnumDebugStackFrames_FWD_DEFINED__
-typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
-#endif 	/* __IEnumDebugStackFrames_FWD_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
-#define __IEnumRemoteDebugApplications_FWD_DEFINED__
-typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
-#endif 	/* __IEnumRemoteDebugApplications_FWD_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
-#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
-typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
-#endif 	/* __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__ */
-
-
-#ifndef __IProcessDebugManager_FWD_DEFINED__
-#define __IProcessDebugManager_FWD_DEFINED__
-typedef interface IProcessDebugManager IProcessDebugManager;
-#endif 	/* __IProcessDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __IProvideExpressionContexts_FWD_DEFINED__
-#define __IProvideExpressionContexts_FWD_DEFINED__
-typedef interface IProvideExpressionContexts IProvideExpressionContexts;
-#endif 	/* __IProvideExpressionContexts_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManager_FWD_DEFINED__
-#define __IMachineDebugManager_FWD_DEFINED__
-typedef interface IMachineDebugManager IMachineDebugManager;
-#endif 	/* __IMachineDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
-#define __IMachineDebugManagerCookie_FWD_DEFINED__
-typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
-#endif 	/* __IMachineDebugManagerCookie_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
-#define __IMachineDebugManagerEvents_FWD_DEFINED__
-typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
-#endif 	/* __IMachineDebugManagerEvents_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationEvents_FWD_DEFINED__
-#define __IRemoteDebugApplicationEvents_FWD_DEFINED__
-typedef interface IRemoteDebugApplicationEvents IRemoteDebugApplicationEvents;
-#endif 	/* __IRemoteDebugApplicationEvents_FWD_DEFINED__ */
-
-
-#ifndef __ISimpleConnectionPoint_FWD_DEFINED__
-#define __ISimpleConnectionPoint_FWD_DEFINED__
-typedef interface ISimpleConnectionPoint ISimpleConnectionPoint;
-#endif 	/* __ISimpleConnectionPoint_FWD_DEFINED__ */
-
-
-#ifndef __ProcessDebugManager_FWD_DEFINED__
-#define __ProcessDebugManager_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class ProcessDebugManager ProcessDebugManager;
-#else
-typedef struct ProcessDebugManager ProcessDebugManager;
-#endif /* __cplusplus */
-
-#endif 	/* __ProcessDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __DebugHelper_FWD_DEFINED__
-#define __DebugHelper_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class DebugHelper DebugHelper;
-#else
-typedef struct DebugHelper DebugHelper;
-#endif /* __cplusplus */
-
-#endif 	/* __DebugHelper_FWD_DEFINED__ */
-
-
-#ifndef __CDebugDocumentHelper_FWD_DEFINED__
-#define __CDebugDocumentHelper_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class CDebugDocumentHelper CDebugDocumentHelper;
-#else
-typedef struct CDebugDocumentHelper CDebugDocumentHelper;
-#endif /* __cplusplus */
-
-#endif 	/* __CDebugDocumentHelper_FWD_DEFINED__ */
-
-
-#ifndef __MachineDebugManager_FWD_DEFINED__
-#define __MachineDebugManager_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class MachineDebugManager MachineDebugManager;
-#else
-typedef struct MachineDebugManager MachineDebugManager;
-#endif /* __cplusplus */
-
-#endif 	/* __MachineDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __DefaultDebugSessionProvider_FWD_DEFINED__
-#define __DefaultDebugSessionProvider_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class DefaultDebugSessionProvider DefaultDebugSessionProvider;
-#else
-typedef struct DefaultDebugSessionProvider DefaultDebugSessionProvider;
-#endif /* __cplusplus */
-
-#endif 	/* __DefaultDebugSessionProvider_FWD_DEFINED__ */
-
-
-/* header files for imported files */
-#include "ocidl.h"
-#include "activscp.h"
-#include "dbgprop.h"
-
-void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t);
-void __RPC_USER MIDL_user_free( void __RPC_FAR * ); 
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0000
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-//=--------------------------------------------------------------------------=
-// ActivDbg.h
-//=--------------------------------------------------------------------------=
-// (C) Copyright 1996 Microsoft Corporation.  All Rights Reserved.
-//
-// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
-// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
-// PARTICULAR PURPOSE.
-//=--------------------------------------------------------------------------=
-//
-#pragma comment(lib,"uuid.lib")
-//
-// Declarations for ActiveX Script authoring/Debugging.
-//
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagBREAKPOINT_STATE
-    {	BREAKPOINT_DELETED	= 0,
-	BREAKPOINT_DISABLED	= 1,
-	BREAKPOINT_ENABLED	= 2
-    }	BREAKPOINT_STATE;
-
-typedef DWORD APPBREAKFLAGS;
-
-#define	APPBREAKFLAG_DEBUGGER_BLOCK	( 0x1 )
-
-#define	APPBREAKFLAG_DEBUGGER_HALT	( 0x2 )
-
-#define	APPBREAKFLAG_STEP	( 0x10000 )
-
-#define	APPBREAKFLAG_NESTED	( 0x20000 )
-
-#define	APPBREAKFLAG_STEPTYPE_SOURCE	( 0 )
-
-#define	APPBREAKFLAG_STEPTYPE_BYTECODE	( 0x100000 )
-
-#define	APPBREAKFLAG_STEPTYPE_MACHINE	( 0x200000 )
-
-#define	APPBREAKFLAG_STEPTYPE_MASK	( 0xf00000 )
-
-#define	APPBREAKFLAG_IN_BREAKPOINT	( 0x80000000 )
-
-typedef 
-enum tagBREAKREASON
-    {	BREAKREASON_STEP	= 0,
-	BREAKREASON_BREAKPOINT	= BREAKREASON_STEP + 1,
-	BREAKREASON_DEBUGGER_BLOCK	= BREAKREASON_BREAKPOINT + 1,
-	BREAKREASON_HOST_INITIATED	= BREAKREASON_DEBUGGER_BLOCK + 1,
-	BREAKREASON_LANGUAGE_INITIATED	= BREAKREASON_HOST_INITIATED + 1,
-	BREAKREASON_DEBUGGER_HALT	= BREAKREASON_LANGUAGE_INITIATED + 1,
-	BREAKREASON_ERROR	= BREAKREASON_DEBUGGER_HALT + 1,
-	BREAKREASON_JIT	= BREAKREASON_ERROR + 1
-    }	BREAKREASON;
-
-typedef 
-enum tagBREAKRESUME_ACTION
-    {	BREAKRESUMEACTION_ABORT	= 0,
-	BREAKRESUMEACTION_CONTINUE	= BREAKRESUMEACTION_ABORT + 1,
-	BREAKRESUMEACTION_STEP_INTO	= BREAKRESUMEACTION_CONTINUE + 1,
-	BREAKRESUMEACTION_STEP_OVER	= BREAKRESUMEACTION_STEP_INTO + 1,
-	BREAKRESUMEACTION_STEP_OUT	= BREAKRESUMEACTION_STEP_OVER + 1,
-	BREAKRESUMEACTION_IGNORE	= BREAKRESUMEACTION_STEP_OUT + 1
-    }	BREAKRESUMEACTION;
-
-typedef 
-enum tagERRORRESUMEACTION
-    {	ERRORRESUMEACTION_ReexecuteErrorStatement	= 0,
-	ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller	= ERRORRESUMEACTION_ReexecuteErrorStatement + 1,
-	ERRORRESUMEACTION_SkipErrorStatement	= ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller + 1
-    }	ERRORRESUMEACTION;
-
-typedef 
-enum tagDOCUMENTNAMETYPE
-    {	DOCUMENTNAMETYPE_APPNODE	= 0,
-	DOCUMENTNAMETYPE_TITLE	= DOCUMENTNAMETYPE_APPNODE + 1,
-	DOCUMENTNAMETYPE_FILE_TAIL	= DOCUMENTNAMETYPE_TITLE + 1,
-	DOCUMENTNAMETYPE_URL	= DOCUMENTNAMETYPE_FILE_TAIL + 1
-    }	DOCUMENTNAMETYPE;
-
-typedef WORD SOURCE_TEXT_ATTR;
-
-#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 )
-
-typedef DWORD TEXT_DOC_ATTR;
-
-#define	TEXT_DOC_ATTR_READONLY	( 0x1 )
-
-#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 )
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0000_v0_0_s_ifspec;
-
-#ifndef __IActiveScriptDebug_INTERFACE_DEFINED__
-#define __IActiveScriptDebug_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IActiveScriptDebug
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IActiveScriptDebug;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C10-CB0C-11d0-B5C9-00A0244A0E7A")
-    IActiveScriptDebug : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes( 
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetScriptletTextAttributes( 
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumCodeContextsOfPosition( 
-            /* [in] */ DWORD dwSourceContext,
-            /* [in] */ ULONG uCharacterOffset,
-            /* [in] */ ULONG uNumChars,
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IActiveScriptDebugVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IActiveScriptDebug __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IActiveScriptDebug __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IActiveScriptDebug __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScriptTextAttributes )( 
-            IActiveScriptDebug __RPC_FAR * This,
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScriptletTextAttributes )( 
-            IActiveScriptDebug __RPC_FAR * This,
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumCodeContextsOfPosition )( 
-            IActiveScriptDebug __RPC_FAR * This,
-            /* [in] */ DWORD dwSourceContext,
-            /* [in] */ ULONG uCharacterOffset,
-            /* [in] */ ULONG uNumChars,
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-        
-        END_INTERFACE
-    } IActiveScriptDebugVtbl;
-
-    interface IActiveScriptDebug
-    {
-        CONST_VTBL struct IActiveScriptDebugVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IActiveScriptDebug_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IActiveScriptDebug_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IActiveScriptDebug_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IActiveScriptDebug_GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)	\
-    (This)->lpVtbl -> GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
-
-#define IActiveScriptDebug_GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)	\
-    (This)->lpVtbl -> GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
-
-#define IActiveScriptDebug_EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc)	\
-    (This)->lpVtbl -> EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptDebug_GetScriptTextAttributes_Proxy( 
-    IActiveScriptDebug __RPC_FAR * This,
-    /* [size_is][in] */ LPCOLESTR pstrCode,
-    /* [in] */ ULONG uNumCodeChars,
-    /* [in] */ LPCOLESTR pstrDelimiter,
-    /* [in] */ DWORD dwFlags,
-    /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-
-
-void __RPC_STUB IActiveScriptDebug_GetScriptTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptDebug_GetScriptletTextAttributes_Proxy( 
-    IActiveScriptDebug __RPC_FAR * This,
-    /* [size_is][in] */ LPCOLESTR pstrCode,
-    /* [in] */ ULONG uNumCodeChars,
-    /* [in] */ LPCOLESTR pstrDelimiter,
-    /* [in] */ DWORD dwFlags,
-    /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-
-
-void __RPC_STUB IActiveScriptDebug_GetScriptletTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptDebug_EnumCodeContextsOfPosition_Proxy( 
-    IActiveScriptDebug __RPC_FAR * This,
-    /* [in] */ DWORD dwSourceContext,
-    /* [in] */ ULONG uCharacterOffset,
-    /* [in] */ ULONG uNumChars,
-    /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-
-
-void __RPC_STUB IActiveScriptDebug_EnumCodeContextsOfPosition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IActiveScriptDebug_INTERFACE_DEFINED__ */
-
-
-#ifndef __IActiveScriptSiteDebug_INTERFACE_DEFINED__
-#define __IActiveScriptSiteDebug_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IActiveScriptSiteDebug
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IActiveScriptSiteDebug;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C11-CB0C-11d0-B5C9-00A0244A0E7A")
-    IActiveScriptSiteDebug : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentContextFromPosition( 
-            /* [in] */ DWORD dwSourceContext,
-            /* [in] */ ULONG uCharacterOffset,
-            /* [in] */ ULONG uNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetApplication( 
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetRootApplicationNode( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnScriptErrorDebug( 
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-            /* [out] */ BOOL __RPC_FAR *pfEnterDebugger,
-            /* [out] */ BOOL __RPC_FAR *pfCallOnScriptErrorWhenContinuing) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IActiveScriptSiteDebugVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IActiveScriptSiteDebug __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IActiveScriptSiteDebug __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentContextFromPosition )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [in] */ DWORD dwSourceContext,
-            /* [in] */ ULONG uCharacterOffset,
-            /* [in] */ ULONG uNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetApplication )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetRootApplicationNode )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnScriptErrorDebug )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-            /* [out] */ BOOL __RPC_FAR *pfEnterDebugger,
-            /* [out] */ BOOL __RPC_FAR *pfCallOnScriptErrorWhenContinuing);
-        
-        END_INTERFACE
-    } IActiveScriptSiteDebugVtbl;
-
-    interface IActiveScriptSiteDebug
-    {
-        CONST_VTBL struct IActiveScriptSiteDebugVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IActiveScriptSiteDebug_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IActiveScriptSiteDebug_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IActiveScriptSiteDebug_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IActiveScriptSiteDebug_GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc)	\
-    (This)->lpVtbl -> GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc)
-
-#define IActiveScriptSiteDebug_GetApplication(This,ppda)	\
-    (This)->lpVtbl -> GetApplication(This,ppda)
-
-#define IActiveScriptSiteDebug_GetRootApplicationNode(This,ppdanRoot)	\
-    (This)->lpVtbl -> GetRootApplicationNode(This,ppdanRoot)
-
-#define IActiveScriptSiteDebug_OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing)	\
-    (This)->lpVtbl -> OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug_GetDocumentContextFromPosition_Proxy( 
-    IActiveScriptSiteDebug __RPC_FAR * This,
-    /* [in] */ DWORD dwSourceContext,
-    /* [in] */ ULONG uCharacterOffset,
-    /* [in] */ ULONG uNumChars,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-
-
-void __RPC_STUB IActiveScriptSiteDebug_GetDocumentContextFromPosition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug_GetApplication_Proxy( 
-    IActiveScriptSiteDebug __RPC_FAR * This,
-    /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-
-
-void __RPC_STUB IActiveScriptSiteDebug_GetApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug_GetRootApplicationNode_Proxy( 
-    IActiveScriptSiteDebug __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-
-
-void __RPC_STUB IActiveScriptSiteDebug_GetRootApplicationNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug_OnScriptErrorDebug_Proxy( 
-    IActiveScriptSiteDebug __RPC_FAR * This,
-    /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-    /* [out] */ BOOL __RPC_FAR *pfEnterDebugger,
-    /* [out] */ BOOL __RPC_FAR *pfCallOnScriptErrorWhenContinuing);
-
-
-void __RPC_STUB IActiveScriptSiteDebug_OnScriptErrorDebug_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IActiveScriptSiteDebug_INTERFACE_DEFINED__ */
-
-
-#ifndef __IActiveScriptErrorDebug_INTERFACE_DEFINED__
-#define __IActiveScriptErrorDebug_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IActiveScriptErrorDebug
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IActiveScriptErrorDebug;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C12-CB0C-11d0-B5C9-00A0244A0E7A")
-    IActiveScriptErrorDebug : public IActiveScriptError
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentContext( 
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppssc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetStackFrame( 
-            /* [out] */ IDebugStackFrame __RPC_FAR *__RPC_FAR *ppdsf) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IActiveScriptErrorDebugVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IActiveScriptErrorDebug __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IActiveScriptErrorDebug __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetExceptionInfo )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ EXCEPINFO __RPC_FAR *pexcepinfo);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourcePosition )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwSourceContext,
-            /* [out] */ ULONG __RPC_FAR *pulLineNumber,
-            /* [out] */ LONG __RPC_FAR *plCharacterPosition);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceLineText )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrSourceLine);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentContext )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppssc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetStackFrame )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ IDebugStackFrame __RPC_FAR *__RPC_FAR *ppdsf);
-        
-        END_INTERFACE
-    } IActiveScriptErrorDebugVtbl;
-
-    interface IActiveScriptErrorDebug
-    {
-        CONST_VTBL struct IActiveScriptErrorDebugVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-
-#define IActiveScriptErrorDebug_GetDocumentContext(This,ppssc)	\
-    (This)->lpVtbl -> GetDocumentContext(This,ppssc)
-
-#define IActiveScriptErrorDebug_GetStackFrame(This,ppdsf)	\
-    (This)->lpVtbl -> GetStackFrame(This,ppdsf)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptErrorDebug_GetDocumentContext_Proxy( 
-    IActiveScriptErrorDebug __RPC_FAR * This,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppssc);
-
-
-void __RPC_STUB IActiveScriptErrorDebug_GetDocumentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptErrorDebug_GetStackFrame_Proxy( 
-    IActiveScriptErrorDebug __RPC_FAR * This,
-    /* [out] */ IDebugStackFrame __RPC_FAR *__RPC_FAR *ppdsf);
-
-
-void __RPC_STUB IActiveScriptErrorDebug_GetStackFrame_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IActiveScriptErrorDebug_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugCodeContext_INTERFACE_DEFINED__
-#define __IDebugCodeContext_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugCodeContext
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugCodeContext;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C13-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugCodeContext : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentContext( 
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetBreakPoint( 
-            /* [in] */ BREAKPOINT_STATE bps) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugCodeContextVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugCodeContext __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugCodeContext __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugCodeContext __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentContext )( 
-            IDebugCodeContext __RPC_FAR * This,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetBreakPoint )( 
-            IDebugCodeContext __RPC_FAR * This,
-            /* [in] */ BREAKPOINT_STATE bps);
-        
-        END_INTERFACE
-    } IDebugCodeContextVtbl;
-
-    interface IDebugCodeContext
-    {
-        CONST_VTBL struct IDebugCodeContextVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugCodeContext_GetDocumentContext(This,ppsc)	\
-    (This)->lpVtbl -> GetDocumentContext(This,ppsc)
-
-#define IDebugCodeContext_SetBreakPoint(This,bps)	\
-    (This)->lpVtbl -> SetBreakPoint(This,bps)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugCodeContext_GetDocumentContext_Proxy( 
-    IDebugCodeContext __RPC_FAR * This,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-
-
-void __RPC_STUB IDebugCodeContext_GetDocumentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugCodeContext_SetBreakPoint_Proxy( 
-    IDebugCodeContext __RPC_FAR * This,
-    /* [in] */ BREAKPOINT_STATE bps);
-
-
-void __RPC_STUB IDebugCodeContext_SetBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugCodeContext_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugExpression_INTERFACE_DEFINED__
-#define __IDebugExpression_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugExpression
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugExpression;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C14-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugExpression : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE Start( 
-            /* [in] */ IDebugExpressionCallBack __RPC_FAR *pdecb) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryIsComplete( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetResultAsString( 
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ BSTR __RPC_FAR *pbstrResult) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetResultAsDebugProperty( 
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdp) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugExpressionVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugExpression __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugExpression __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugExpression __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Start )( 
-            IDebugExpression __RPC_FAR * This,
-            /* [in] */ IDebugExpressionCallBack __RPC_FAR *pdecb);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Abort )( 
-            IDebugExpression __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryIsComplete )( 
-            IDebugExpression __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetResultAsString )( 
-            IDebugExpression __RPC_FAR * This,
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ BSTR __RPC_FAR *pbstrResult);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetResultAsDebugProperty )( 
-            IDebugExpression __RPC_FAR * This,
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdp);
-        
-        END_INTERFACE
-    } IDebugExpressionVtbl;
-
-    interface IDebugExpression
-    {
-        CONST_VTBL struct IDebugExpressionVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_Start_Proxy( 
-    IDebugExpression __RPC_FAR * This,
-    /* [in] */ IDebugExpressionCallBack __RPC_FAR *pdecb);
-
-
-void __RPC_STUB IDebugExpression_Start_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_Abort_Proxy( 
-    IDebugExpression __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugExpression_Abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_QueryIsComplete_Proxy( 
-    IDebugExpression __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugExpression_QueryIsComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_GetResultAsString_Proxy( 
-    IDebugExpression __RPC_FAR * This,
-    /* [out] */ HRESULT __RPC_FAR *phrResult,
-    /* [out] */ BSTR __RPC_FAR *pbstrResult);
-
-
-void __RPC_STUB IDebugExpression_GetResultAsString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_GetResultAsDebugProperty_Proxy( 
-    IDebugExpression __RPC_FAR * This,
-    /* [out] */ HRESULT __RPC_FAR *phrResult,
-    /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdp);
-
-
-void __RPC_STUB IDebugExpression_GetResultAsDebugProperty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugExpression_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugExpressionContext_INTERFACE_DEFINED__
-#define __IDebugExpressionContext_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugExpressionContext
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugExpressionContext;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C15-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugExpressionContext : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE ParseLanguageText( 
-            /* [in] */ LPCOLESTR pstrCode,
-            /* [in] */ UINT nRadix,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [out] */ IDebugExpression __RPC_FAR *__RPC_FAR *ppe) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetLanguageInfo( 
-            /* [out] */ BSTR __RPC_FAR *pbstrLanguageName,
-            /* [out] */ GUID __RPC_FAR *pLanguageID) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugExpressionContextVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugExpressionContext __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugExpressionContext __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugExpressionContext __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ParseLanguageText )( 
-            IDebugExpressionContext __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrCode,
-            /* [in] */ UINT nRadix,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [out] */ IDebugExpression __RPC_FAR *__RPC_FAR *ppe);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLanguageInfo )( 
-            IDebugExpressionContext __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrLanguageName,
-            /* [out] */ GUID __RPC_FAR *pLanguageID);
-        
-        END_INTERFACE
-    } IDebugExpressionContextVtbl;
-
-    interface IDebugExpressionContext
-    {
-        CONST_VTBL struct IDebugExpressionContextVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpressionContext_ParseLanguageText_Proxy( 
-    IDebugExpressionContext __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrCode,
-    /* [in] */ UINT nRadix,
-    /* [in] */ LPCOLESTR pstrDelimiter,
-    /* [in] */ DWORD dwFlags,
-    /* [out] */ IDebugExpression __RPC_FAR *__RPC_FAR *ppe);
-
-
-void __RPC_STUB IDebugExpressionContext_ParseLanguageText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpressionContext_GetLanguageInfo_Proxy( 
-    IDebugExpressionContext __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrLanguageName,
-    /* [out] */ GUID __RPC_FAR *pLanguageID);
-
-
-void __RPC_STUB IDebugExpressionContext_GetLanguageInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugExpressionContext_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugExpressionCallBack_INTERFACE_DEFINED__
-#define __IDebugExpressionCallBack_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugExpressionCallBack
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugExpressionCallBack;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C16-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugExpressionCallBack : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onComplete( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugExpressionCallBackVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugExpressionCallBack __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugExpressionCallBack __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugExpressionCallBack __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onComplete )( 
-            IDebugExpressionCallBack __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugExpressionCallBackVtbl;
-
-    interface IDebugExpressionCallBack
-    {
-        CONST_VTBL struct IDebugExpressionCallBackVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugExpressionCallBack_onComplete(This)	\
-    (This)->lpVtbl -> onComplete(This)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpressionCallBack_onComplete_Proxy( 
-    IDebugExpressionCallBack __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugExpressionCallBack_onComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugExpressionCallBack_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugStackFrame_INTERFACE_DEFINED__
-#define __IDebugStackFrame_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugStackFrame
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugStackFrame;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C17-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugStackFrame : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetCodeContext( 
-            /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *ppcc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDescriptionString( 
-            /* [in] */ BOOL fLong,
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetLanguageString( 
-            /* [in] */ BOOL fLong,
-            /* [out] */ BSTR __RPC_FAR *pbstrLanguage) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetThread( 
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDebugProperty( 
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppDebugProp) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugStackFrameVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugStackFrame __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugStackFrame __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetCodeContext )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *ppcc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDescriptionString )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [in] */ BOOL fLong,
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLanguageString )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [in] */ BOOL fLong,
-            /* [out] */ BSTR __RPC_FAR *pbstrLanguage);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetThread )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDebugProperty )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppDebugProp);
-        
-        END_INTERFACE
-    } IDebugStackFrameVtbl;
-
-    interface IDebugStackFrame
-    {
-        CONST_VTBL struct IDebugStackFrameVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetCodeContext_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *ppcc);
-
-
-void __RPC_STUB IDebugStackFrame_GetCodeContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetDescriptionString_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [in] */ BOOL fLong,
-    /* [out] */ BSTR __RPC_FAR *pbstrDescription);
-
-
-void __RPC_STUB IDebugStackFrame_GetDescriptionString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetLanguageString_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [in] */ BOOL fLong,
-    /* [out] */ BSTR __RPC_FAR *pbstrLanguage);
-
-
-void __RPC_STUB IDebugStackFrame_GetLanguageString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetThread_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppat);
-
-
-void __RPC_STUB IDebugStackFrame_GetThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetDebugProperty_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppDebugProp);
-
-
-void __RPC_STUB IDebugStackFrame_GetDebugProperty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugStackFrame_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSniffer_INTERFACE_DEFINED__
-#define __IDebugStackFrameSniffer_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugStackFrameSniffer
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugStackFrameSniffer;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C18-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugStackFrameSniffer : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE EnumStackFrames( 
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugStackFrameSnifferVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugStackFrameSniffer __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugStackFrameSniffer __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugStackFrameSniffer __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFrames )( 
-            IDebugStackFrameSniffer __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        END_INTERFACE
-    } IDebugStackFrameSnifferVtbl;
-
-    interface IDebugStackFrameSniffer
-    {
-        CONST_VTBL struct IDebugStackFrameSnifferVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugStackFrameSniffer_EnumStackFrames(This,ppedsf)	\
-    (This)->lpVtbl -> EnumStackFrames(This,ppedsf)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrameSniffer_EnumStackFrames_Proxy( 
-    IDebugStackFrameSniffer __RPC_FAR * This,
-    /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-
-
-void __RPC_STUB IDebugStackFrameSniffer_EnumStackFrames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugStackFrameSniffer_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSnifferEx_INTERFACE_DEFINED__
-#define __IDebugStackFrameSnifferEx_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugStackFrameSnifferEx
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugStackFrameSnifferEx;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C19-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugStackFrameSnifferEx : public IDebugStackFrameSniffer
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE EnumStackFramesEx( 
-            /* [in] */ DWORD dwSpMin,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugStackFrameSnifferExVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFrames )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFramesEx )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This,
-            /* [in] */ DWORD dwSpMin,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        END_INTERFACE
-    } IDebugStackFrameSnifferExVtbl;
-
-    interface IDebugStackFrameSnifferEx
-    {
-        CONST_VTBL struct IDebugStackFrameSnifferExVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IDebugStackFrameSnifferEx_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IDebugStackFrameSnifferEx_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IDebugStackFrameSnifferEx_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IDebugStackFrameSnifferEx_EnumStackFrames(This,ppedsf)	\
-    (This)->lpVtbl -> EnumStackFrames(This,ppedsf)
-
-
-#define IDebugStackFrameSnifferEx_EnumStackFramesEx(This,dwSpMin,ppedsf)	\
-    (This)->lpVtbl -> EnumStackFramesEx(This,dwSpMin,ppedsf)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrameSnifferEx_EnumStackFramesEx_Proxy( 
-    IDebugStackFrameSnifferEx __RPC_FAR * This,
-    /* [in] */ DWORD dwSpMin,
-    /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-
-
-void __RPC_STUB IDebugStackFrameSnifferEx_EnumStackFramesEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugStackFrameSnifferEx_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugSyncOperation_INTERFACE_DEFINED__
-#define __IDebugSyncOperation_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugSyncOperation
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugSyncOperation;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1a-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugSyncOperation : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetTargetThread( 
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppatTarget) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Execute( 
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE InProgressAbort( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugSyncOperationVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugSyncOperation __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugSyncOperation __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugSyncOperation __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTargetThread )( 
-            IDebugSyncOperation __RPC_FAR * This,
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppatTarget);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Execute )( 
-            IDebugSyncOperation __RPC_FAR * This,
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *InProgressAbort )( 
-            IDebugSyncOperation __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugSyncOperationVtbl;
-
-    interface IDebugSyncOperation
-    {
-        CONST_VTBL struct IDebugSyncOperationVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugSyncOperation_GetTargetThread_Proxy( 
-    IDebugSyncOperation __RPC_FAR * This,
-    /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppatTarget);
-
-
-void __RPC_STUB IDebugSyncOperation_GetTargetThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugSyncOperation_Execute_Proxy( 
-    IDebugSyncOperation __RPC_FAR * This,
-    /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult);
-
-
-void __RPC_STUB IDebugSyncOperation_Execute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugSyncOperation_InProgressAbort_Proxy( 
-    IDebugSyncOperation __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugSyncOperation_InProgressAbort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugSyncOperation_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperation_INTERFACE_DEFINED__
-#define __IDebugAsyncOperation_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugAsyncOperation
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugAsyncOperation;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1b-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugAsyncOperation : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetSyncDebugOperation( 
-            /* [out] */ IDebugSyncOperation __RPC_FAR *__RPC_FAR *ppsdo) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Start( 
-            IDebugAsyncOperationCallBack __RPC_FAR *padocb) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryIsComplete( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetResult( 
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugAsyncOperationVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugAsyncOperation __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugAsyncOperation __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugAsyncOperation __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSyncDebugOperation )( 
-            IDebugAsyncOperation __RPC_FAR * This,
-            /* [out] */ IDebugSyncOperation __RPC_FAR *__RPC_FAR *ppsdo);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Start )( 
-            IDebugAsyncOperation __RPC_FAR * This,
-            IDebugAsyncOperationCallBack __RPC_FAR *padocb);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Abort )( 
-            IDebugAsyncOperation __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryIsComplete )( 
-            IDebugAsyncOperation __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetResult )( 
-            IDebugAsyncOperation __RPC_FAR * This,
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult);
-        
-        END_INTERFACE
-    } IDebugAsyncOperationVtbl;
-
-    interface IDebugAsyncOperation
-    {
-        CONST_VTBL struct IDebugAsyncOperationVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_GetSyncDebugOperation_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This,
-    /* [out] */ IDebugSyncOperation __RPC_FAR *__RPC_FAR *ppsdo);
-
-
-void __RPC_STUB IDebugAsyncOperation_GetSyncDebugOperation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_Start_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This,
-    IDebugAsyncOperationCallBack __RPC_FAR *padocb);
-
-
-void __RPC_STUB IDebugAsyncOperation_Start_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_Abort_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugAsyncOperation_Abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_QueryIsComplete_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugAsyncOperation_QueryIsComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_GetResult_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This,
-    /* [out] */ HRESULT __RPC_FAR *phrResult,
-    /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult);
-
-
-void __RPC_STUB IDebugAsyncOperation_GetResult_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugAsyncOperation_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__
-#define __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugAsyncOperationCallBack
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugAsyncOperationCallBack;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1c-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugAsyncOperationCallBack : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onComplete( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugAsyncOperationCallBackVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugAsyncOperationCallBack __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugAsyncOperationCallBack __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugAsyncOperationCallBack __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onComplete )( 
-            IDebugAsyncOperationCallBack __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugAsyncOperationCallBackVtbl;
-
-    interface IDebugAsyncOperationCallBack
-    {
-        CONST_VTBL struct IDebugAsyncOperationCallBackVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugAsyncOperationCallBack_onComplete(This)	\
-    (This)->lpVtbl -> onComplete(This)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperationCallBack_onComplete_Proxy( 
-    IDebugAsyncOperationCallBack __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugAsyncOperationCallBack_onComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumDebugCodeContexts_INTERFACE_DEFINED__
-#define __IEnumDebugCodeContexts_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumDebugCodeContexts
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumDebugCodeContexts;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1d-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumDebugCodeContexts : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumDebugCodeContextsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumDebugCodeContexts __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumDebugCodeContexts __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumDebugCodeContexts __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumDebugCodeContexts __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumDebugCodeContexts __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumDebugCodeContexts __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumDebugCodeContexts __RPC_FAR * This,
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-        
-        END_INTERFACE
-    } IEnumDebugCodeContextsVtbl;
-
-    interface IEnumDebugCodeContexts
-    {
-        CONST_VTBL struct IEnumDebugCodeContextsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugCodeContexts_RemoteNext_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumDebugCodeContexts_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Skip_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumDebugCodeContexts_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Reset_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumDebugCodeContexts_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Clone_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-
-
-void __RPC_STUB IEnumDebugCodeContexts_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumDebugCodeContexts_INTERFACE_DEFINED__ */
-
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0177
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-typedef struct  tagDebugStackFrameDescriptor
-    {
-    IDebugStackFrame __RPC_FAR *pdsf;
-    DWORD dwMin;
-    DWORD dwLim;
-    BOOL fFinal;
-    IUnknown __RPC_FAR *punkFinal;
-    }	DebugStackFrameDescriptor;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0177_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0177_v0_0_s_ifspec;
-
-#ifndef __IEnumDebugStackFrames_INTERFACE_DEFINED__
-#define __IEnumDebugStackFrames_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumDebugStackFrames
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumDebugStackFrames;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1e-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumDebugStackFrames : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumDebugStackFramesVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumDebugStackFrames __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumDebugStackFrames __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumDebugStackFrames __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumDebugStackFrames __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumDebugStackFrames __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumDebugStackFrames __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumDebugStackFrames __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        END_INTERFACE
-    } IEnumDebugStackFramesVtbl;
-
-    interface IEnumDebugStackFrames
-    {
-        CONST_VTBL struct IEnumDebugStackFramesVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugStackFrames_RemoteNext_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumDebugStackFrames_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Skip_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumDebugStackFrames_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Reset_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumDebugStackFrames_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Clone_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-
-
-void __RPC_STUB IEnumDebugStackFrames_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumDebugStackFrames_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentInfo_INTERFACE_DEFINED__
-#define __IDebugDocumentInfo_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentInfo
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [optimize][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentInfo;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1f-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetName( 
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentClassId( 
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentInfoVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentInfo __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentInfo __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentInfo __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocumentInfo __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocumentInfo __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        END_INTERFACE
-    } IDebugDocumentInfoVtbl;
-
-    interface IDebugDocumentInfo
-    {
-        CONST_VTBL struct IDebugDocumentInfoVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentInfo_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocumentInfo_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentInfo_GetName_Proxy( 
-    IDebugDocumentInfo __RPC_FAR * This,
-    /* [in] */ DOCUMENTNAMETYPE dnt,
-    /* [out] */ BSTR __RPC_FAR *pbstrName);
-
-
-void __RPC_STUB IDebugDocumentInfo_GetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentInfo_GetDocumentClassId_Proxy( 
-    IDebugDocumentInfo __RPC_FAR * This,
-    /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-
-
-void __RPC_STUB IDebugDocumentInfo_GetDocumentClassId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentInfo_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentProvider_INTERFACE_DEFINED__
-#define __IDebugDocumentProvider_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentProvider
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentProvider;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C20-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentProvider : public IDebugDocumentInfo
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocument( 
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppssd) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentProviderVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentProvider __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentProvider __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentProvider __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocumentProvider __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocumentProvider __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocument )( 
-            IDebugDocumentProvider __RPC_FAR * This,
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppssd);
-        
-        END_INTERFACE
-    } IDebugDocumentProviderVtbl;
-
-    interface IDebugDocumentProvider
-    {
-        CONST_VTBL struct IDebugDocumentProviderVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentProvider_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocumentProvider_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-#define IDebugDocumentProvider_GetDocument(This,ppssd)	\
-    (This)->lpVtbl -> GetDocument(This,ppssd)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentProvider_GetDocument_Proxy( 
-    IDebugDocumentProvider __RPC_FAR * This,
-    /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppssd);
-
-
-void __RPC_STUB IDebugDocumentProvider_GetDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentProvider_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocument_INTERFACE_DEFINED__
-#define __IDebugDocument_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocument
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocument;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C21-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocument : public IDebugDocumentInfo
-    {
-    public:
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocument __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocument __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocument __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocument __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocument __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        END_INTERFACE
-    } IDebugDocumentVtbl;
-
-    interface IDebugDocument
-    {
-        CONST_VTBL struct IDebugDocumentVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocument_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocument_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-
-#endif 	/* __IDebugDocument_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentText_INTERFACE_DEFINED__
-#define __IDebugDocumentText_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentText
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentText;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C22-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentText : public IDebugDocument
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentAttributes( 
-            /* [out] */ TEXT_DOC_ATTR __RPC_FAR *ptextdocattr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetSize( 
-            /* [out] */ ULONG __RPC_FAR *pcNumLines,
-            /* [out] */ ULONG __RPC_FAR *pcNumChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetPositionOfLine( 
-            /* [in] */ ULONG cLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetLineOfPosition( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *pcLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterOffsetInLine) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [full][size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetPositionOfContext( 
-            /* [in] */ IDebugDocumentContext __RPC_FAR *psc,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *cNumChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetContextOfPosition( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentTextVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentText __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentText __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentAttributes )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [out] */ TEXT_DOC_ATTR __RPC_FAR *ptextdocattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSize )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [out] */ ULONG __RPC_FAR *pcNumLines,
-            /* [out] */ ULONG __RPC_FAR *pcNumChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPositionOfLine )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ ULONG cLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLineOfPosition )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *pcLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterOffsetInLine);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetText )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [full][size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPositionOfContext )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ IDebugDocumentContext __RPC_FAR *psc,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *cNumChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetContextOfPosition )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-        
-        END_INTERFACE
-    } IDebugDocumentTextVtbl;
-
-    interface IDebugDocumentText
-    {
-        CONST_VTBL struct IDebugDocumentTextVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentText_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocumentText_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetDocumentAttributes_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [out] */ TEXT_DOC_ATTR __RPC_FAR *ptextdocattr);
-
-
-void __RPC_STUB IDebugDocumentText_GetDocumentAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetSize_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [out] */ ULONG __RPC_FAR *pcNumLines,
-    /* [out] */ ULONG __RPC_FAR *pcNumChars);
-
-
-void __RPC_STUB IDebugDocumentText_GetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetPositionOfLine_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ ULONG cLineNumber,
-    /* [out] */ ULONG __RPC_FAR *pcCharacterPosition);
-
-
-void __RPC_STUB IDebugDocumentText_GetPositionOfLine_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetLineOfPosition_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [out] */ ULONG __RPC_FAR *pcLineNumber,
-    /* [out] */ ULONG __RPC_FAR *pcCharacterOffsetInLine);
-
-
-void __RPC_STUB IDebugDocumentText_GetLineOfPosition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetText_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-    /* [full][size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-    /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-    /* [in] */ ULONG cMaxChars);
-
-
-void __RPC_STUB IDebugDocumentText_GetText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetPositionOfContext_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ IDebugDocumentContext __RPC_FAR *psc,
-    /* [out] */ ULONG __RPC_FAR *pcCharacterPosition,
-    /* [out] */ ULONG __RPC_FAR *cNumChars);
-
-
-void __RPC_STUB IDebugDocumentText_GetPositionOfContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetContextOfPosition_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumChars,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-
-
-void __RPC_STUB IDebugDocumentText_GetContextOfPosition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentText_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextEvents_INTERFACE_DEFINED__
-#define __IDebugDocumentTextEvents_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentTextEvents
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentTextEvents;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C23-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentTextEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onDestroy( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onInsertText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToInsert) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onRemoveText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToRemove) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onReplaceText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToReplace) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onUpdateTextAttributes( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToUpdate) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onUpdateDocumentAttributes( 
-            /* [in] */ TEXT_DOC_ATTR textdocattr) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentTextEventsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentTextEvents __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentTextEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onDestroy )( 
-            IDebugDocumentTextEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onInsertText )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToInsert);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onRemoveText )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToRemove);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onReplaceText )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToReplace);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onUpdateTextAttributes )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToUpdate);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onUpdateDocumentAttributes )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ TEXT_DOC_ATTR textdocattr);
-        
-        END_INTERFACE
-    } IDebugDocumentTextEventsVtbl;
-
-    interface IDebugDocumentTextEvents
-    {
-        CONST_VTBL struct IDebugDocumentTextEventsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onDestroy_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onDestroy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onInsertText_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToInsert);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onInsertText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onRemoveText_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToRemove);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onRemoveText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onReplaceText_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToReplace);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onReplaceText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onUpdateTextAttributes_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToUpdate);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onUpdateTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onUpdateDocumentAttributes_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ TEXT_DOC_ATTR textdocattr);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onUpdateDocumentAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentTextEvents_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextAuthor_INTERFACE_DEFINED__
-#define __IDebugDocumentTextAuthor_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentTextAuthor
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentTextAuthor;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C24-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentTextAuthor : public IDebugDocumentText
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE InsertText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToInsert,
-            /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToRemove) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE ReplaceText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToReplace,
-            /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentTextAuthorVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentAttributes )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [out] */ TEXT_DOC_ATTR __RPC_FAR *ptextdocattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSize )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [out] */ ULONG __RPC_FAR *pcNumLines,
-            /* [out] */ ULONG __RPC_FAR *pcNumChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPositionOfLine )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLineOfPosition )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *pcLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterOffsetInLine);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetText )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [full][size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPositionOfContext )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ IDebugDocumentContext __RPC_FAR *psc,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *cNumChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetContextOfPosition )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *InsertText )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToInsert,
-            /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveText )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToRemove);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ReplaceText )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToReplace,
-            /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]);
-        
-        END_INTERFACE
-    } IDebugDocumentTextAuthorVtbl;
-
-    interface IDebugDocumentTextAuthor
-    {
-        CONST_VTBL struct IDebugDocumentTextAuthorVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentTextAuthor_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocumentTextAuthor_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_InsertText_Proxy( 
-    IDebugDocumentTextAuthor __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToInsert,
-    /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]);
-
-
-void __RPC_STUB IDebugDocumentTextAuthor_InsertText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_RemoveText_Proxy( 
-    IDebugDocumentTextAuthor __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToRemove);
-
-
-void __RPC_STUB IDebugDocumentTextAuthor_RemoveText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_ReplaceText_Proxy( 
-    IDebugDocumentTextAuthor __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToReplace,
-    /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]);
-
-
-void __RPC_STUB IDebugDocumentTextAuthor_ReplaceText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentTextAuthor_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__
-#define __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentTextExternalAuthor
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentTextExternalAuthor;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C25-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentTextExternalAuthor : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetPathName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-            /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetFileName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrShortName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE NotifyChanged( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentTextExternalAuthorVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPathName )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-            /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetFileName )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrShortName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *NotifyChanged )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugDocumentTextExternalAuthorVtbl;
-
-    interface IDebugDocumentTextExternalAuthor
-    {
-        CONST_VTBL struct IDebugDocumentTextExternalAuthorVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_GetPathName_Proxy( 
-    IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-    /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile);
-
-
-void __RPC_STUB IDebugDocumentTextExternalAuthor_GetPathName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_GetFileName_Proxy( 
-    IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrShortName);
-
-
-void __RPC_STUB IDebugDocumentTextExternalAuthor_GetFileName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_NotifyChanged_Proxy( 
-    IDebugDocumentTextExternalAuthor __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentTextExternalAuthor_NotifyChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHelper_INTERFACE_DEFINED__
-#define __IDebugDocumentHelper_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentHelper
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentHelper;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C26-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentHelper : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE Init( 
-            /* [in] */ IDebugApplication __RPC_FAR *pda,
-            /* [string][in] */ LPCOLESTR pszShortName,
-            /* [string][in] */ LPCOLESTR pszLongName,
-            /* [in] */ TEXT_DOC_ATTR docAttr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Attach( 
-            /* [in] */ IDebugDocumentHelper __RPC_FAR *pddhParent) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Detach( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddUnicodeText( 
-            /* [string][in] */ LPCOLESTR pszText) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddDBCSText( 
-            /* [string][in] */ LPCSTR pszText) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDebugDocumentHost( 
-            /* [in] */ IDebugDocumentHost __RPC_FAR *pddh) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddDeferredText( 
-            /* [in] */ ULONG cChars,
-            /* [in] */ DWORD dwTextStartCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE DefineScriptBlock( 
-            /* [in] */ ULONG ulCharOffset,
-            /* [in] */ ULONG cChars,
-            /* [in] */ IActiveScript __RPC_FAR *pas,
-            /* [in] */ BOOL fScriptlet,
-            /* [out] */ DWORD __RPC_FAR *pdwSourceContext) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDefaultTextAttr( 
-            SOURCE_TEXT_ATTR staTextAttr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetTextAttributes( 
-            /* [in] */ ULONG ulCharOffset,
-            /* [in] */ ULONG cChars,
-            /* [size_is][length_is][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetLongName( 
-            /* [string][in] */ LPCOLESTR pszLongName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetShortName( 
-            /* [string][in] */ LPCOLESTR pszShortName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDocumentAttr( 
-            /* [in] */ TEXT_DOC_ATTR pszAttributes) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDebugApplicationNode( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdan) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetScriptBlockInfo( 
-            /* [in] */ DWORD dwSourceContext,
-            /* [out] */ IActiveScript __RPC_FAR *__RPC_FAR *ppasd,
-            /* [out] */ ULONG __RPC_FAR *piCharPos,
-            /* [out] */ ULONG __RPC_FAR *pcChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentContext( 
-            /* [in] */ ULONG iCharPos,
-            /* [in] */ ULONG cChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppddc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop( 
-            IDebugDocumentContext __RPC_FAR *pddc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentHelperVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentHelper __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentHelper __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Init )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ IDebugApplication __RPC_FAR *pda,
-            /* [string][in] */ LPCOLESTR pszShortName,
-            /* [string][in] */ LPCOLESTR pszLongName,
-            /* [in] */ TEXT_DOC_ATTR docAttr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Attach )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ IDebugDocumentHelper __RPC_FAR *pddhParent);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Detach )( 
-            IDebugDocumentHelper __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddUnicodeText )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [string][in] */ LPCOLESTR pszText);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddDBCSText )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [string][in] */ LPCSTR pszText);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDebugDocumentHost )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ IDebugDocumentHost __RPC_FAR *pddh);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddDeferredText )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ ULONG cChars,
-            /* [in] */ DWORD dwTextStartCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DefineScriptBlock )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ ULONG ulCharOffset,
-            /* [in] */ ULONG cChars,
-            /* [in] */ IActiveScript __RPC_FAR *pas,
-            /* [in] */ BOOL fScriptlet,
-            /* [out] */ DWORD __RPC_FAR *pdwSourceContext);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDefaultTextAttr )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            SOURCE_TEXT_ATTR staTextAttr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetTextAttributes )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ ULONG ulCharOffset,
-            /* [in] */ ULONG cChars,
-            /* [size_is][length_is][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetLongName )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [string][in] */ LPCOLESTR pszLongName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetShortName )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [string][in] */ LPCOLESTR pszShortName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDocumentAttr )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ TEXT_DOC_ATTR pszAttributes);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDebugApplicationNode )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdan);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScriptBlockInfo )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ DWORD dwSourceContext,
-            /* [out] */ IActiveScript __RPC_FAR *__RPC_FAR *ppasd,
-            /* [out] */ ULONG __RPC_FAR *piCharPos,
-            /* [out] */ ULONG __RPC_FAR *pcChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateDebugDocumentContext )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ ULONG iCharPos,
-            /* [in] */ ULONG cChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppddc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *BringDocumentToTop )( 
-            IDebugDocumentHelper __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *BringDocumentContextToTop )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            IDebugDocumentContext __RPC_FAR *pddc);
-        
-        END_INTERFACE
-    } IDebugDocumentHelperVtbl;
-
-    interface IDebugDocumentHelper
-    {
-        CONST_VTBL struct IDebugDocumentHelperVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IDebugDocumentHelper_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IDebugDocumentHelper_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IDebugDocumentHelper_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IDebugDocumentHelper_Init(This,pda,pszShortName,pszLongName,docAttr)	\
-    (This)->lpVtbl -> Init(This,pda,pszShortName,pszLongName,docAttr)
-
-#define IDebugDocumentHelper_Attach(This,pddhParent)	\
-    (This)->lpVtbl -> Attach(This,pddhParent)
-
-#define IDebugDocumentHelper_Detach(This)	\
-    (This)->lpVtbl -> Detach(This)
-
-#define IDebugDocumentHelper_AddUnicodeText(This,pszText)	\
-    (This)->lpVtbl -> AddUnicodeText(This,pszText)
-
-#define IDebugDocumentHelper_AddDBCSText(This,pszText)	\
-    (This)->lpVtbl -> AddDBCSText(This,pszText)
-
-#define IDebugDocumentHelper_SetDebugDocumentHost(This,pddh)	\
-    (This)->lpVtbl -> SetDebugDocumentHost(This,pddh)
-
-#define IDebugDocumentHelper_AddDeferredText(This,cChars,dwTextStartCookie)	\
-    (This)->lpVtbl -> AddDeferredText(This,cChars,dwTextStartCookie)
-
-#define IDebugDocumentHelper_DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext)	\
-    (This)->lpVtbl -> DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext)
-
-#define IDebugDocumentHelper_SetDefaultTextAttr(This,staTextAttr)	\
-    (This)->lpVtbl -> SetDefaultTextAttr(This,staTextAttr)
-
-#define IDebugDocumentHelper_SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr)	\
-    (This)->lpVtbl -> SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr)
-
-#define IDebugDocumentHelper_SetLongName(This,pszLongName)	\
-    (This)->lpVtbl -> SetLongName(This,pszLongName)
-
-#define IDebugDocumentHelper_SetShortName(This,pszShortName)	\
-    (This)->lpVtbl -> SetShortName(This,pszShortName)
-
-#define IDebugDocumentHelper_SetDocumentAttr(This,pszAttributes)	\
-    (This)->lpVtbl -> SetDocumentAttr(This,pszAttributes)
-
-#define IDebugDocumentHelper_GetDebugApplicationNode(This,ppdan)	\
-    (This)->lpVtbl -> GetDebugApplicationNode(This,ppdan)
-
-#define IDebugDocumentHelper_GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars)	\
-    (This)->lpVtbl -> GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars)
-
-#define IDebugDocumentHelper_CreateDebugDocumentContext(This,iCharPos,cChars,ppddc)	\
-    (This)->lpVtbl -> CreateDebugDocumentContext(This,iCharPos,cChars,ppddc)
-
-#define IDebugDocumentHelper_BringDocumentToTop(This)	\
-    (This)->lpVtbl -> BringDocumentToTop(This)
-
-#define IDebugDocumentHelper_BringDocumentContextToTop(This,pddc)	\
-    (This)->lpVtbl -> BringDocumentContextToTop(This,pddc)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_Init_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ IDebugApplication __RPC_FAR *pda,
-    /* [string][in] */ LPCOLESTR pszShortName,
-    /* [string][in] */ LPCOLESTR pszLongName,
-    /* [in] */ TEXT_DOC_ATTR docAttr);
-
-
-void __RPC_STUB IDebugDocumentHelper_Init_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_Attach_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ IDebugDocumentHelper __RPC_FAR *pddhParent);
-
-
-void __RPC_STUB IDebugDocumentHelper_Attach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_Detach_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentHelper_Detach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_AddUnicodeText_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [string][in] */ LPCOLESTR pszText);
-
-
-void __RPC_STUB IDebugDocumentHelper_AddUnicodeText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_AddDBCSText_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [string][in] */ LPCSTR pszText);
-
-
-void __RPC_STUB IDebugDocumentHelper_AddDBCSText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetDebugDocumentHost_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ IDebugDocumentHost __RPC_FAR *pddh);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetDebugDocumentHost_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_AddDeferredText_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ ULONG cChars,
-    /* [in] */ DWORD dwTextStartCookie);
-
-
-void __RPC_STUB IDebugDocumentHelper_AddDeferredText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_DefineScriptBlock_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ ULONG ulCharOffset,
-    /* [in] */ ULONG cChars,
-    /* [in] */ IActiveScript __RPC_FAR *pas,
-    /* [in] */ BOOL fScriptlet,
-    /* [out] */ DWORD __RPC_FAR *pdwSourceContext);
-
-
-void __RPC_STUB IDebugDocumentHelper_DefineScriptBlock_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetDefaultTextAttr_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    SOURCE_TEXT_ATTR staTextAttr);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetDefaultTextAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetTextAttributes_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ ULONG ulCharOffset,
-    /* [in] */ ULONG cChars,
-    /* [size_is][length_is][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetLongName_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [string][in] */ LPCOLESTR pszLongName);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetLongName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetShortName_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [string][in] */ LPCOLESTR pszShortName);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetShortName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetDocumentAttr_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ TEXT_DOC_ATTR pszAttributes);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetDocumentAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_GetDebugApplicationNode_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdan);
-
-
-void __RPC_STUB IDebugDocumentHelper_GetDebugApplicationNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_GetScriptBlockInfo_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ DWORD dwSourceContext,
-    /* [out] */ IActiveScript __RPC_FAR *__RPC_FAR *ppasd,
-    /* [out] */ ULONG __RPC_FAR *piCharPos,
-    /* [out] */ ULONG __RPC_FAR *pcChars);
-
-
-void __RPC_STUB IDebugDocumentHelper_GetScriptBlockInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_CreateDebugDocumentContext_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ ULONG iCharPos,
-    /* [in] */ ULONG cChars,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppddc);
-
-
-void __RPC_STUB IDebugDocumentHelper_CreateDebugDocumentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_BringDocumentToTop_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentHelper_BringDocumentToTop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_BringDocumentContextToTop_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    IDebugDocumentContext __RPC_FAR *pddc);
-
-
-void __RPC_STUB IDebugDocumentHelper_BringDocumentContextToTop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentHelper_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHost_INTERFACE_DEFINED__
-#define __IDebugDocumentHost_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentHost
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentHost;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C27-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentHost : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDeferredText( 
-            /* [in] */ DWORD dwTextStartCookie,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes( 
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnCreateDocumentContext( 
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkOuter) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetPathName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-            /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetFileName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrShortName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE NotifyChanged( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentHostVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentHost __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentHost __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDeferredText )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [in] */ DWORD dwTextStartCookie,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScriptTextAttributes )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnCreateDocumentContext )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkOuter);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPathName )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-            /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetFileName )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrShortName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *NotifyChanged )( 
-            IDebugDocumentHost __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugDocumentHostVtbl;
-
-    interface IDebugDocumentHost
-    {
-        CONST_VTBL struct IDebugDocumentHostVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetDeferredText_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [in] */ DWORD dwTextStartCookie,
-    /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-    /* [size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-    /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-    /* [in] */ ULONG cMaxChars);
-
-
-void __RPC_STUB IDebugDocumentHost_GetDeferredText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetScriptTextAttributes_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [size_is][in] */ LPCOLESTR pstrCode,
-    /* [in] */ ULONG uNumCodeChars,
-    /* [in] */ LPCOLESTR pstrDelimiter,
-    /* [in] */ DWORD dwFlags,
-    /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-
-
-void __RPC_STUB IDebugDocumentHost_GetScriptTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_OnCreateDocumentContext_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkOuter);
-
-
-void __RPC_STUB IDebugDocumentHost_OnCreateDocumentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetPathName_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-    /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile);
-
-
-void __RPC_STUB IDebugDocumentHost_GetPathName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetFileName_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrShortName);
-
-
-void __RPC_STUB IDebugDocumentHost_GetFileName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_NotifyChanged_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentHost_NotifyChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentHost_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentContext_INTERFACE_DEFINED__
-#define __IDebugDocumentContext_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentContext
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentContext;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C28-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentContext : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocument( 
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppsd) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumCodeContexts( 
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentContextVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentContext __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentContext __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentContext __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocument )( 
-            IDebugDocumentContext __RPC_FAR * This,
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppsd);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumCodeContexts )( 
-            IDebugDocumentContext __RPC_FAR * This,
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-        
-        END_INTERFACE
-    } IDebugDocumentContextVtbl;
-
-    interface IDebugDocumentContext
-    {
-        CONST_VTBL struct IDebugDocumentContextVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentContext_GetDocument(This,ppsd)	\
-    (This)->lpVtbl -> GetDocument(This,ppsd)
-
-#define IDebugDocumentContext_EnumCodeContexts(This,ppescc)	\
-    (This)->lpVtbl -> EnumCodeContexts(This,ppescc)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentContext_GetDocument_Proxy( 
-    IDebugDocumentContext __RPC_FAR * This,
-    /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppsd);
-
-
-void __RPC_STUB IDebugDocumentContext_GetDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentContext_EnumCodeContexts_Proxy( 
-    IDebugDocumentContext __RPC_FAR * This,
-    /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-
-
-void __RPC_STUB IDebugDocumentContext_EnumCodeContexts_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentContext_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugSessionProvider_INTERFACE_DEFINED__
-#define __IDebugSessionProvider_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugSessionProvider
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugSessionProvider;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C29-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugSessionProvider : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE StartDebugSession( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugSessionProviderVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugSessionProvider __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugSessionProvider __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugSessionProvider __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StartDebugSession )( 
-            IDebugSessionProvider __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda);
-        
-        END_INTERFACE
-    } IDebugSessionProviderVtbl;
-
-    interface IDebugSessionProvider
-    {
-        CONST_VTBL struct IDebugSessionProviderVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugSessionProvider_StartDebugSession(This,pda)	\
-    (This)->lpVtbl -> StartDebugSession(This,pda)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugSessionProvider_StartDebugSession_Proxy( 
-    IDebugSessionProvider __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda);
-
-
-void __RPC_STUB IDebugSessionProvider_StartDebugSession_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugSessionProvider_INTERFACE_DEFINED__ */
-
-
-#ifndef __IApplicationDebugger_INTERFACE_DEFINED__
-#define __IApplicationDebugger_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IApplicationDebugger
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IApplicationDebugger;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2a-CB0C-11d0-B5C9-00A0244A0E7A")
-    IApplicationDebugger : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE QueryAlive( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtDebugger( 
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onDebugOutput( 
-            /* [in] */ LPCOLESTR pstr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onHandleBreakPoint( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prpt,
-            /* [in] */ BREAKREASON br,
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pError) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onClose( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onDebuggerEvent( 
-            /* [in] */ REFIID riid,
-            /* [in] */ IUnknown __RPC_FAR *punk) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IApplicationDebuggerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IApplicationDebugger __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IApplicationDebugger __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryAlive )( 
-            IApplicationDebugger __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateInstanceAtDebugger )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onDebugOutput )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onHandleBreakPoint )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prpt,
-            /* [in] */ BREAKREASON br,
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pError);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onClose )( 
-            IApplicationDebugger __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onDebuggerEvent )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [in] */ IUnknown __RPC_FAR *punk);
-        
-        END_INTERFACE
-    } IApplicationDebuggerVtbl;
-
-    interface IApplicationDebugger
-    {
-        CONST_VTBL struct IApplicationDebuggerVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_QueryAlive_Proxy( 
-    IApplicationDebugger __RPC_FAR * This);
-
-
-void __RPC_STUB IApplicationDebugger_QueryAlive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_CreateInstanceAtDebugger_Proxy( 
-    IApplicationDebugger __RPC_FAR * This,
-    /* [in] */ REFCLSID rclsid,
-    /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-    /* [in] */ DWORD dwClsContext,
-    /* [in] */ REFIID riid,
-    /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-
-
-void __RPC_STUB IApplicationDebugger_CreateInstanceAtDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_onDebugOutput_Proxy( 
-    IApplicationDebugger __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstr);
-
-
-void __RPC_STUB IApplicationDebugger_onDebugOutput_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_onHandleBreakPoint_Proxy( 
-    IApplicationDebugger __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prpt,
-    /* [in] */ BREAKREASON br,
-    /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pError);
-
-
-void __RPC_STUB IApplicationDebugger_onHandleBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_onClose_Proxy( 
-    IApplicationDebugger __RPC_FAR * This);
-
-
-void __RPC_STUB IApplicationDebugger_onClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_onDebuggerEvent_Proxy( 
-    IApplicationDebugger __RPC_FAR * This,
-    /* [in] */ REFIID riid,
-    /* [in] */ IUnknown __RPC_FAR *punk);
-
-
-void __RPC_STUB IApplicationDebugger_onDebuggerEvent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IApplicationDebugger_INTERFACE_DEFINED__ */
-
-
-#ifndef __IApplicationDebuggerUI_INTERFACE_DEFINED__
-#define __IApplicationDebuggerUI_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IApplicationDebuggerUI
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IApplicationDebuggerUI;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2b-CB0C-11d0-B5C9-00A0244A0E7A")
-    IApplicationDebuggerUI : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop( 
-            /* [in] */ IDebugDocumentText __RPC_FAR *pddt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop( 
-            /* [in] */ IDebugDocumentContext __RPC_FAR *pddc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IApplicationDebuggerUIVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IApplicationDebuggerUI __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IApplicationDebuggerUI __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IApplicationDebuggerUI __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *BringDocumentToTop )( 
-            IApplicationDebuggerUI __RPC_FAR * This,
-            /* [in] */ IDebugDocumentText __RPC_FAR *pddt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *BringDocumentContextToTop )( 
-            IApplicationDebuggerUI __RPC_FAR * This,
-            /* [in] */ IDebugDocumentContext __RPC_FAR *pddc);
-        
-        END_INTERFACE
-    } IApplicationDebuggerUIVtbl;
-
-    interface IApplicationDebuggerUI
-    {
-        CONST_VTBL struct IApplicationDebuggerUIVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IApplicationDebuggerUI_BringDocumentToTop(This,pddt)	\
-    (This)->lpVtbl -> BringDocumentToTop(This,pddt)
-
-#define IApplicationDebuggerUI_BringDocumentContextToTop(This,pddc)	\
-    (This)->lpVtbl -> BringDocumentContextToTop(This,pddc)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebuggerUI_BringDocumentToTop_Proxy( 
-    IApplicationDebuggerUI __RPC_FAR * This,
-    /* [in] */ IDebugDocumentText __RPC_FAR *pddt);
-
-
-void __RPC_STUB IApplicationDebuggerUI_BringDocumentToTop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebuggerUI_BringDocumentContextToTop_Proxy( 
-    IApplicationDebuggerUI __RPC_FAR * This,
-    /* [in] */ IDebugDocumentContext __RPC_FAR *pddc);
-
-
-void __RPC_STUB IApplicationDebuggerUI_BringDocumentContextToTop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IApplicationDebuggerUI_INTERFACE_DEFINED__ */
-
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0191
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-EXTERN_C const CLSID CLSID_MachineDebugManager;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0191_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0191_v0_0_s_ifspec;
-
-#ifndef __IMachineDebugManager_INTERFACE_DEFINED__
-#define __IMachineDebugManager_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IMachineDebugManager
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IMachineDebugManager;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2c-CB0C-11d0-B5C9-00A0244A0E7A")
-    IMachineDebugManager : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE AddApplication( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveApplication( 
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumApplications( 
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IMachineDebugManagerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IMachineDebugManager __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IMachineDebugManager __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IMachineDebugManager __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddApplication )( 
-            IMachineDebugManager __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveApplication )( 
-            IMachineDebugManager __RPC_FAR * This,
-            /* [in] */ DWORD dwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumApplications )( 
-            IMachineDebugManager __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda);
-        
-        END_INTERFACE
-    } IMachineDebugManagerVtbl;
-
-    interface IMachineDebugManager
-    {
-        CONST_VTBL struct IMachineDebugManagerVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManager_AddApplication_Proxy( 
-    IMachineDebugManager __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-    /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManager_AddApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManager_RemoveApplication_Proxy( 
-    IMachineDebugManager __RPC_FAR * This,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManager_RemoveApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManager_EnumApplications_Proxy( 
-    IMachineDebugManager __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda);
-
-
-void __RPC_STUB IMachineDebugManager_EnumApplications_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IMachineDebugManager_INTERFACE_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerCookie_INTERFACE_DEFINED__
-#define __IMachineDebugManagerCookie_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IMachineDebugManagerCookie
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IMachineDebugManagerCookie;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2d-CB0C-11d0-B5C9-00A0244A0E7A")
-    IMachineDebugManagerCookie : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE AddApplication( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwDebugAppCookie,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveApplication( 
-            /* [in] */ DWORD dwDebugAppCookie,
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumApplications( 
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IMachineDebugManagerCookieVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IMachineDebugManagerCookie __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IMachineDebugManagerCookie __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IMachineDebugManagerCookie __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddApplication )( 
-            IMachineDebugManagerCookie __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwDebugAppCookie,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveApplication )( 
-            IMachineDebugManagerCookie __RPC_FAR * This,
-            /* [in] */ DWORD dwDebugAppCookie,
-            /* [in] */ DWORD dwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumApplications )( 
-            IMachineDebugManagerCookie __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda);
-        
-        END_INTERFACE
-    } IMachineDebugManagerCookieVtbl;
-
-    interface IMachineDebugManagerCookie
-    {
-        CONST_VTBL struct IMachineDebugManagerCookieVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_AddApplication_Proxy( 
-    IMachineDebugManagerCookie __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-    /* [in] */ DWORD dwDebugAppCookie,
-    /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManagerCookie_AddApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_RemoveApplication_Proxy( 
-    IMachineDebugManagerCookie __RPC_FAR * This,
-    /* [in] */ DWORD dwDebugAppCookie,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManagerCookie_RemoveApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_EnumApplications_Proxy( 
-    IMachineDebugManagerCookie __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda);
-
-
-void __RPC_STUB IMachineDebugManagerCookie_EnumApplications_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IMachineDebugManagerCookie_INTERFACE_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerEvents_INTERFACE_DEFINED__
-#define __IMachineDebugManagerEvents_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IMachineDebugManagerEvents
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IMachineDebugManagerEvents;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2e-CB0C-11d0-B5C9-00A0244A0E7A")
-    IMachineDebugManagerEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onAddApplication( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onRemoveApplication( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IMachineDebugManagerEventsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IMachineDebugManagerEvents __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IMachineDebugManagerEvents __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IMachineDebugManagerEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onAddApplication )( 
-            IMachineDebugManagerEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onRemoveApplication )( 
-            IMachineDebugManagerEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwAppCookie);
-        
-        END_INTERFACE
-    } IMachineDebugManagerEventsVtbl;
-
-    interface IMachineDebugManagerEvents
-    {
-        CONST_VTBL struct IMachineDebugManagerEventsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IMachineDebugManagerEvents_onAddApplication(This,pda,dwAppCookie)	\
-    (This)->lpVtbl -> onAddApplication(This,pda,dwAppCookie)
-
-#define IMachineDebugManagerEvents_onRemoveApplication(This,pda,dwAppCookie)	\
-    (This)->lpVtbl -> onRemoveApplication(This,pda,dwAppCookie)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerEvents_onAddApplication_Proxy( 
-    IMachineDebugManagerEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManagerEvents_onAddApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerEvents_onRemoveApplication_Proxy( 
-    IMachineDebugManagerEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManagerEvents_onRemoveApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IMachineDebugManagerEvents_INTERFACE_DEFINED__ */
-
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0194
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-EXTERN_C const CLSID CLSID_ProcessDebugManager;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0194_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0194_v0_0_s_ifspec;
-
-#ifndef __IProcessDebugManager_INTERFACE_DEFINED__
-#define __IProcessDebugManager_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IProcessDebugManager
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IProcessDebugManager;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2f-CB0C-11d0-B5C9-00A0244A0E7A")
-    IProcessDebugManager : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE CreateApplication( 
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDefaultApplication( 
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddApplication( 
-            /* [in] */ IDebugApplication __RPC_FAR *pda,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveApplication( 
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentHelper( 
-            /* [in] */ IUnknown __RPC_FAR *punkOuter,
-            /* [out] */ IDebugDocumentHelper __RPC_FAR *__RPC_FAR *pddh) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IProcessDebugManagerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IProcessDebugManager __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IProcessDebugManager __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateApplication )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDefaultApplication )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddApplication )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [in] */ IDebugApplication __RPC_FAR *pda,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveApplication )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [in] */ DWORD dwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateDebugDocumentHelper )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [in] */ IUnknown __RPC_FAR *punkOuter,
-            /* [out] */ IDebugDocumentHelper __RPC_FAR *__RPC_FAR *pddh);
-        
-        END_INTERFACE
-    } IProcessDebugManagerVtbl;
-
-    interface IProcessDebugManager
-    {
-        CONST_VTBL struct IProcessDebugManagerVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IProcessDebugManager_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IProcessDebugManager_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IProcessDebugManager_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IProcessDebugManager_CreateApplication(This,ppda)	\
-    (This)->lpVtbl -> CreateApplication(This,ppda)
-
-#define IProcessDebugManager_GetDefaultApplication(This,ppda)	\
-    (This)->lpVtbl -> GetDefaultApplication(This,ppda)
-
-#define IProcessDebugManager_AddApplication(This,pda,pdwAppCookie)	\
-    (This)->lpVtbl -> AddApplication(This,pda,pdwAppCookie)
-
-#define IProcessDebugManager_RemoveApplication(This,dwAppCookie)	\
-    (This)->lpVtbl -> RemoveApplication(This,dwAppCookie)
-
-#define IProcessDebugManager_CreateDebugDocumentHelper(This,punkOuter,pddh)	\
-    (This)->lpVtbl -> CreateDebugDocumentHelper(This,punkOuter,pddh)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_CreateApplication_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-
-
-void __RPC_STUB IProcessDebugManager_CreateApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_GetDefaultApplication_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-
-
-void __RPC_STUB IProcessDebugManager_GetDefaultApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_AddApplication_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [in] */ IDebugApplication __RPC_FAR *pda,
-    /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-
-
-void __RPC_STUB IProcessDebugManager_AddApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_RemoveApplication_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IProcessDebugManager_RemoveApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_CreateDebugDocumentHelper_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [in] */ IUnknown __RPC_FAR *punkOuter,
-    /* [out] */ IDebugDocumentHelper __RPC_FAR *__RPC_FAR *pddh);
-
-
-void __RPC_STUB IProcessDebugManager_CreateDebugDocumentHelper_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IProcessDebugManager_INTERFACE_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplication_INTERFACE_DEFINED__
-#define __IRemoteDebugApplication_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IRemoteDebugApplication
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IRemoteDebugApplication;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C30-CB0C-11d0-B5C9-00A0244A0E7A")
-    IRemoteDebugApplication : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE ResumeFromBreakPoint( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prptFocus,
-            /* [in] */ BREAKRESUMEACTION bra,
-            /* [in] */ ERRORRESUMEACTION era) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CauseBreak( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE ConnectDebugger( 
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE DisconnectDebugger( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDebugger( 
-            /* [out] */ IApplicationDebugger __RPC_FAR *__RPC_FAR *pad) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtApplication( 
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryAlive( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumThreads( 
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetRootNode( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumGlobalExpressionContexts( 
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IRemoteDebugApplicationVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ResumeFromBreakPoint )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prptFocus,
-            /* [in] */ BREAKRESUMEACTION bra,
-            /* [in] */ ERRORRESUMEACTION era);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CauseBreak )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ConnectDebugger )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DisconnectDebugger )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDebugger )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ IApplicationDebugger __RPC_FAR *__RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateInstanceAtApplication )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryAlive )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumThreads )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetRootNode )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumGlobalExpressionContexts )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-        
-        END_INTERFACE
-    } IRemoteDebugApplicationVtbl;
-
-    interface IRemoteDebugApplication
-    {
-        CONST_VTBL struct IRemoteDebugApplicationVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_ResumeFromBreakPoint_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prptFocus,
-    /* [in] */ BREAKRESUMEACTION bra,
-    /* [in] */ ERRORRESUMEACTION era);
-
-
-void __RPC_STUB IRemoteDebugApplication_ResumeFromBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_CauseBreak_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplication_CauseBreak_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_ConnectDebugger_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-
-
-void __RPC_STUB IRemoteDebugApplication_ConnectDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_DisconnectDebugger_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplication_DisconnectDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetDebugger_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ IApplicationDebugger __RPC_FAR *__RPC_FAR *pad);
-
-
-void __RPC_STUB IRemoteDebugApplication_GetDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_CreateInstanceAtApplication_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [in] */ REFCLSID rclsid,
-    /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-    /* [in] */ DWORD dwClsContext,
-    /* [in] */ REFIID riid,
-    /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-
-
-void __RPC_STUB IRemoteDebugApplication_CreateInstanceAtApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_QueryAlive_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplication_QueryAlive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_EnumThreads_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-
-
-void __RPC_STUB IRemoteDebugApplication_EnumThreads_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetName_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrName);
-
-
-void __RPC_STUB IRemoteDebugApplication_GetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetRootNode_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-
-
-void __RPC_STUB IRemoteDebugApplication_GetRootNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_EnumGlobalExpressionContexts_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-
-
-void __RPC_STUB IRemoteDebugApplication_EnumGlobalExpressionContexts_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IRemoteDebugApplication_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugApplication_INTERFACE_DEFINED__
-#define __IDebugApplication_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugApplication
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugApplication;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C32-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugApplication : public IRemoteDebugApplication
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE SetName( 
-            /* [in] */ LPCOLESTR pstrName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE StepOutComplete( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE DebugOutput( 
-            /* [in] */ LPCOLESTR pstr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE StartDebugSession( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE HandleBreakPoint( 
-            /* [in] */ BREAKREASON br,
-            /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetBreakFlags( 
-            /* [out] */ APPBREAKFLAGS __RPC_FAR *pabf,
-            /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdatSteppingThread) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetCurrentThread( 
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *pat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateAsyncDebugOperation( 
-            /* [in] */ IDebugSyncOperation __RPC_FAR *psdo,
-            /* [out] */ IDebugAsyncOperation __RPC_FAR *__RPC_FAR *ppado) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddStackFrameSniffer( 
-            /* [in] */ IDebugStackFrameSniffer __RPC_FAR *pdsfs,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveStackFrameSniffer( 
-            /* [in] */ DWORD dwCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryCurrentThreadIsDebuggerThread( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SynchronousCallInDebuggerThread( 
-            /* [in] */ IDebugThreadCall __RPC_FAR *pptc,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateApplicationNode( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanNew) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE FireDebuggerEvent( 
-            /* [in] */ REFGUID riid,
-            /* [in] */ IUnknown __RPC_FAR *punk) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE HandleRuntimeError( 
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-            /* [in] */ IActiveScriptSite __RPC_FAR *pScriptSite,
-            /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra,
-            /* [out] */ ERRORRESUMEACTION __RPC_FAR *perra,
-            /* [out] */ BOOL __RPC_FAR *pfCallOnScriptError) = 0;
-        
-        virtual BOOL STDMETHODCALLTYPE FCanJitDebug( void) = 0;
-        
-        virtual BOOL STDMETHODCALLTYPE FIsAutoJitDebugEnabled( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddGlobalExpressionContextProvider( 
-            /* [in] */ IProvideExpressionContexts __RPC_FAR *pdsfs,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveGlobalExpressionContextProvider( 
-            /* [in] */ DWORD dwCookie) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugApplicationVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ResumeFromBreakPoint )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prptFocus,
-            /* [in] */ BREAKRESUMEACTION bra,
-            /* [in] */ ERRORRESUMEACTION era);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CauseBreak )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ConnectDebugger )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DisconnectDebugger )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDebugger )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IApplicationDebugger __RPC_FAR *__RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateInstanceAtApplication )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryAlive )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumThreads )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetRootNode )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumGlobalExpressionContexts )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetName )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StepOutComplete )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DebugOutput )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StartDebugSession )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HandleBreakPoint )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ BREAKREASON br,
-            /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Close )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetBreakFlags )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ APPBREAKFLAGS __RPC_FAR *pabf,
-            /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdatSteppingThread);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetCurrentThread )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *pat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateAsyncDebugOperation )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IDebugSyncOperation __RPC_FAR *psdo,
-            /* [out] */ IDebugAsyncOperation __RPC_FAR *__RPC_FAR *ppado);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddStackFrameSniffer )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IDebugStackFrameSniffer __RPC_FAR *pdsfs,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveStackFrameSniffer )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ DWORD dwCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryCurrentThreadIsDebuggerThread )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SynchronousCallInDebuggerThread )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IDebugThreadCall __RPC_FAR *pptc,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateApplicationNode )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanNew);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *FireDebuggerEvent )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ REFGUID riid,
-            /* [in] */ IUnknown __RPC_FAR *punk);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HandleRuntimeError )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-            /* [in] */ IActiveScriptSite __RPC_FAR *pScriptSite,
-            /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra,
-            /* [out] */ ERRORRESUMEACTION __RPC_FAR *perra,
-            /* [out] */ BOOL __RPC_FAR *pfCallOnScriptError);
-        
-        BOOL ( STDMETHODCALLTYPE __RPC_FAR *FCanJitDebug )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        BOOL ( STDMETHODCALLTYPE __RPC_FAR *FIsAutoJitDebugEnabled )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddGlobalExpressionContextProvider )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IProvideExpressionContexts __RPC_FAR *pdsfs,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveGlobalExpressionContextProvider )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ DWORD dwCookie);
-        
-        END_INTERFACE
-    } IDebugApplicationVtbl;
-
-    interface IDebugApplication
-    {
-        CONST_VTBL struct IDebugApplicationVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IDebugApplication_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IDebugApplication_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IDebugApplication_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IDebugApplication_ResumeFromBreakPoint(This,prptFocus,bra,era)	\
-    (This)->lpVtbl -> ResumeFromBreakPoint(This,prptFocus,bra,era)
-
-#define IDebugApplication_CauseBreak(This)	\
-    (This)->lpVtbl -> CauseBreak(This)
-
-#define IDebugApplication_ConnectDebugger(This,pad)	\
-    (This)->lpVtbl -> ConnectDebugger(This,pad)
-
-#define IDebugApplication_DisconnectDebugger(This)	\
-    (This)->lpVtbl -> DisconnectDebugger(This)
-
-#define IDebugApplication_GetDebugger(This,pad)	\
-    (This)->lpVtbl -> GetDebugger(This,pad)
-
-#define IDebugApplication_CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)	\
-    (This)->lpVtbl -> CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
-
-#define IDebugApplication_QueryAlive(This)	\
-    (This)->lpVtbl -> QueryAlive(This)
-
-#define IDebugApplication_EnumThreads(This,pperdat)	\
-    (This)->lpVtbl -> EnumThreads(This,pperdat)
-
-#define IDebugApplication_GetName(This,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,pbstrName)
-
-#define IDebugApplication_GetRootNode(This,ppdanRoot)	\
-    (This)->lpVtbl -> GetRootNode(This,ppdanRoot)
-
-#define IDebugApplication_EnumGlobalExpressionContexts(This,ppedec)	\
-    (This)->lpVtbl -> EnumGlobalExpressionContexts(This,ppedec)
-
-
-#define IDebugApplication_SetName(This,pstrName)	\
-    (This)->lpVtbl -> SetName(This,pstrName)
-
-#define IDebugApplication_StepOutComplete(This)	\
-    (This)->lpVtbl -> StepOutComplete(This)
-
-#define IDebugApplication_DebugOutput(This,pstr)	\
-    (This)->lpVtbl -> DebugOutput(This,pstr)
-
-#define IDebugApplication_StartDebugSession(This)	\
-    (This)->lpVtbl -> StartDebugSession(This)
-
-#define IDebugApplication_HandleBreakPoint(This,br,pbra)	\
-    (This)->lpVtbl -> HandleBreakPoint(This,br,pbra)
-
-#define IDebugApplication_Close(This)	\
-    (This)->lpVtbl -> Close(This)
-
-#define IDebugApplication_GetBreakFlags(This,pabf,pprdatSteppingThread)	\
-    (This)->lpVtbl -> GetBreakFlags(This,pabf,pprdatSteppingThread)
-
-#define IDebugApplication_GetCurrentThread(This,pat)	\
-    (This)->lpVtbl -> GetCurrentThread(This,pat)
-
-#define IDebugApplication_CreateAsyncDebugOperation(This,psdo,ppado)	\
-    (This)->lpVtbl -> CreateAsyncDebugOperation(This,psdo,ppado)
-
-#define IDebugApplication_AddStackFrameSniffer(This,pdsfs,pdwCookie)	\
-    (This)->lpVtbl -> AddStackFrameSniffer(This,pdsfs,pdwCookie)
-
-#define IDebugApplication_RemoveStackFrameSniffer(This,dwCookie)	\
-    (This)->lpVtbl -> RemoveStackFrameSniffer(This,dwCookie)
-
-#define IDebugApplication_QueryCurrentThreadIsDebuggerThread(This)	\
-    (This)->lpVtbl -> QueryCurrentThreadIsDebuggerThread(This)
-
-#define IDebugApplication_SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3)	\
-    (This)->lpVtbl -> SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3)
-
-#define IDebugApplication_CreateApplicationNode(This,ppdanNew)	\
-    (This)->lpVtbl -> CreateApplicationNode(This,ppdanNew)
-
-#define IDebugApplication_FireDebuggerEvent(This,riid,punk)	\
-    (This)->lpVtbl -> FireDebuggerEvent(This,riid,punk)
-
-#define IDebugApplication_HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError)	\
-    (This)->lpVtbl -> HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError)
-
-#define IDebugApplication_FCanJitDebug(This)	\
-    (This)->lpVtbl -> FCanJitDebug(This)
-
-#define IDebugApplication_FIsAutoJitDebugEnabled(This)	\
-    (This)->lpVtbl -> FIsAutoJitDebugEnabled(This)
-
-#define IDebugApplication_AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie)	\
-    (This)->lpVtbl -> AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie)
-
-#define IDebugApplication_RemoveGlobalExpressionContextProvider(This,dwCookie)	\
-    (This)->lpVtbl -> RemoveGlobalExpressionContextProvider(This,dwCookie)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_SetName_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrName);
-
-
-void __RPC_STUB IDebugApplication_SetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_StepOutComplete_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_StepOutComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_DebugOutput_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstr);
-
-
-void __RPC_STUB IDebugApplication_DebugOutput_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_StartDebugSession_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_StartDebugSession_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_HandleBreakPoint_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ BREAKREASON br,
-    /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra);
-
-
-void __RPC_STUB IDebugApplication_HandleBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_Close_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_GetBreakFlags_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [out] */ APPBREAKFLAGS __RPC_FAR *pabf,
-    /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdatSteppingThread);
-
-
-void __RPC_STUB IDebugApplication_GetBreakFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_GetCurrentThread_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *pat);
-
-
-void __RPC_STUB IDebugApplication_GetCurrentThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_CreateAsyncDebugOperation_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IDebugSyncOperation __RPC_FAR *psdo,
-    /* [out] */ IDebugAsyncOperation __RPC_FAR *__RPC_FAR *ppado);
-
-
-void __RPC_STUB IDebugApplication_CreateAsyncDebugOperation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_AddStackFrameSniffer_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IDebugStackFrameSniffer __RPC_FAR *pdsfs,
-    /* [out] */ DWORD __RPC_FAR *pdwCookie);
-
-
-void __RPC_STUB IDebugApplication_AddStackFrameSniffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_RemoveStackFrameSniffer_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ DWORD dwCookie);
-
-
-void __RPC_STUB IDebugApplication_RemoveStackFrameSniffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_QueryCurrentThreadIsDebuggerThread_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_QueryCurrentThreadIsDebuggerThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_SynchronousCallInDebuggerThread_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IDebugThreadCall __RPC_FAR *pptc,
-    /* [in] */ DWORD dwParam1,
-    /* [in] */ DWORD dwParam2,
-    /* [in] */ DWORD dwParam3);
-
-
-void __RPC_STUB IDebugApplication_SynchronousCallInDebuggerThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_CreateApplicationNode_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanNew);
-
-
-void __RPC_STUB IDebugApplication_CreateApplicationNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_FireDebuggerEvent_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ REFGUID riid,
-    /* [in] */ IUnknown __RPC_FAR *punk);
-
-
-void __RPC_STUB IDebugApplication_FireDebuggerEvent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_HandleRuntimeError_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-    /* [in] */ IActiveScriptSite __RPC_FAR *pScriptSite,
-    /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra,
-    /* [out] */ ERRORRESUMEACTION __RPC_FAR *perra,
-    /* [out] */ BOOL __RPC_FAR *pfCallOnScriptError);
-
-
-void __RPC_STUB IDebugApplication_HandleRuntimeError_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-BOOL STDMETHODCALLTYPE IDebugApplication_FCanJitDebug_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_FCanJitDebug_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-BOOL STDMETHODCALLTYPE IDebugApplication_FIsAutoJitDebugEnabled_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_FIsAutoJitDebugEnabled_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_AddGlobalExpressionContextProvider_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IProvideExpressionContexts __RPC_FAR *pdsfs,
-    /* [out] */ DWORD __RPC_FAR *pdwCookie);
-
-
-void __RPC_STUB IDebugApplication_AddGlobalExpressionContextProvider_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_RemoveGlobalExpressionContextProvider_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ DWORD dwCookie);
-
-
-void __RPC_STUB IDebugApplication_RemoveGlobalExpressionContextProvider_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugApplication_INTERFACE_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__
-#define __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IRemoteDebugApplicationEvents
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IRemoteDebugApplicationEvents;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C33-CB0C-11d0-B5C9-00A0244A0E7A")
-    IRemoteDebugApplicationEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE OnConnectDebugger( 
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnDisconnectDebugger( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnSetName( 
-            /* [in] */ LPCOLESTR pstrName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnDebugOutput( 
-            /* [in] */ LPCOLESTR pstr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnClose( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnEnterBreakPoint( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnLeaveBreakPoint( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnCreateThread( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnDestroyThread( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnBreakFlagChange( 
-            /* [in] */ APPBREAKFLAGS abf,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdatSteppingThread) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IRemoteDebugApplicationEventsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnConnectDebugger )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnDisconnectDebugger )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnSetName )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnDebugOutput )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnClose )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnEnterBreakPoint )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnLeaveBreakPoint )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnCreateThread )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnDestroyThread )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnBreakFlagChange )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ APPBREAKFLAGS abf,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdatSteppingThread);
-        
-        END_INTERFACE
-    } IRemoteDebugApplicationEventsVtbl;
-
-    interface IRemoteDebugApplicationEvents
-    {
-        CONST_VTBL struct IRemoteDebugApplicationEventsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnConnectDebugger_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnConnectDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDisconnectDebugger_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnDisconnectDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnSetName_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrName);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnSetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDebugOutput_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstr);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnDebugOutput_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnClose_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnEnterBreakPoint_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnEnterBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnLeaveBreakPoint_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnLeaveBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnCreateThread_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnCreateThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDestroyThread_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnDestroyThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnBreakFlagChange_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ APPBREAKFLAGS abf,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdatSteppingThread);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnBreakFlagChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNode_INTERFACE_DEFINED__
-#define __IDebugApplicationNode_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugApplicationNode
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugApplicationNode;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C34-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugApplicationNode : public IDebugDocumentProvider
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE EnumChildren( 
-            /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetParent( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDocumentProvider( 
-            /* [in] */ IDebugDocumentProvider __RPC_FAR *pddp) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Attach( 
-            /* [in] */ IDebugApplicationNode __RPC_FAR *pdanParent) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Detach( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugApplicationNodeVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugApplicationNode __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugApplicationNode __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocument )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppssd);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumChildren )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetParent )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDocumentProvider )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [in] */ IDebugDocumentProvider __RPC_FAR *pddp);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Close )( 
-            IDebugApplicationNode __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Attach )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [in] */ IDebugApplicationNode __RPC_FAR *pdanParent);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Detach )( 
-            IDebugApplicationNode __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugApplicationNodeVtbl;
-
-    interface IDebugApplicationNode
-    {
-        CONST_VTBL struct IDebugApplicationNodeVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugApplicationNode_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugApplicationNode_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-#define IDebugApplicationNode_GetDocument(This,ppssd)	\
-    (This)->lpVtbl -> GetDocument(This,ppssd)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_EnumChildren_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This,
-    /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp);
-
-
-void __RPC_STUB IDebugApplicationNode_EnumChildren_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_GetParent_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp);
-
-
-void __RPC_STUB IDebugApplicationNode_GetParent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_SetDocumentProvider_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This,
-    /* [in] */ IDebugDocumentProvider __RPC_FAR *pddp);
-
-
-void __RPC_STUB IDebugApplicationNode_SetDocumentProvider_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Close_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationNode_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Attach_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This,
-    /* [in] */ IDebugApplicationNode __RPC_FAR *pdanParent);
-
-
-void __RPC_STUB IDebugApplicationNode_Attach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Detach_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationNode_Detach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugApplicationNode_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNodeEvents_INTERFACE_DEFINED__
-#define __IDebugApplicationNodeEvents_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugApplicationNodeEvents
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugApplicationNodeEvents;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C35-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugApplicationNodeEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onAddChild( 
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onRemoveChild( 
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onDetach( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onAttach( 
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpParent) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugApplicationNodeEventsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onAddChild )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This,
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onRemoveChild )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This,
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onDetach )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onAttach )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This,
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpParent);
-        
-        END_INTERFACE
-    } IDebugApplicationNodeEventsVtbl;
-
-    interface IDebugApplicationNodeEvents
-    {
-        CONST_VTBL struct IDebugApplicationNodeEventsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onAddChild_Proxy( 
-    IDebugApplicationNodeEvents __RPC_FAR * This,
-    /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild);
-
-
-void __RPC_STUB IDebugApplicationNodeEvents_onAddChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onRemoveChild_Proxy( 
-    IDebugApplicationNodeEvents __RPC_FAR * This,
-    /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild);
-
-
-void __RPC_STUB IDebugApplicationNodeEvents_onRemoveChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onDetach_Proxy( 
-    IDebugApplicationNodeEvents __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationNodeEvents_onDetach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onAttach_Proxy( 
-    IDebugApplicationNodeEvents __RPC_FAR * This,
-    /* [in] */ IDebugApplicationNode __RPC_FAR *prddpParent);
-
-
-void __RPC_STUB IDebugApplicationNodeEvents_onAttach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugApplicationNodeEvents_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugThreadCall_INTERFACE_DEFINED__
-#define __IDebugThreadCall_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugThreadCall
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugThreadCall;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C36-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugThreadCall : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE ThreadCallHandler( 
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugThreadCallVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugThreadCall __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugThreadCall __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugThreadCall __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ThreadCallHandler )( 
-            IDebugThreadCall __RPC_FAR * This,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3);
-        
-        END_INTERFACE
-    } IDebugThreadCallVtbl;
-
-    interface IDebugThreadCall
-    {
-        CONST_VTBL struct IDebugThreadCallVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IDebugThreadCall_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IDebugThreadCall_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IDebugThreadCall_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IDebugThreadCall_ThreadCallHandler(This,dwParam1,dwParam2,dwParam3)	\
-    (This)->lpVtbl -> ThreadCallHandler(This,dwParam1,dwParam2,dwParam3)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugThreadCall_ThreadCallHandler_Proxy( 
-    IDebugThreadCall __RPC_FAR * This,
-    /* [in] */ DWORD dwParam1,
-    /* [in] */ DWORD dwParam2,
-    /* [in] */ DWORD dwParam3);
-
-
-void __RPC_STUB IDebugThreadCall_ThreadCallHandler_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugThreadCall_INTERFACE_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationThread_INTERFACE_DEFINED__
-#define __IRemoteDebugApplicationThread_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IRemoteDebugApplicationThread
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-typedef DWORD THREAD_STATE;
-
-#define	THREAD_STATE_RUNNING	( 0x1 )
-
-#define	THREAD_STATE_SUSPENDED	( 0x2 )
-
-#define	THREAD_BLOCKED	( 0x4 )
-
-#define	THREAD_OUT_OF_CONTEXT	( 0x8 )
-
-
-EXTERN_C const IID IID_IRemoteDebugApplicationThread;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C37-CB0C-11d0-B5C9-00A0244A0E7A")
-    IRemoteDebugApplicationThread : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetSystemThreadId( 
-            /* [out] */ DWORD __RPC_FAR *dwThreadId) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetApplication( 
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *pprda) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumStackFrames( 
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDescription( 
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription,
-            /* [out] */ BSTR __RPC_FAR *pbstrState) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetNextStatement( 
-            /* [in] */ IDebugStackFrame __RPC_FAR *pStackFrame,
-            /* [in] */ IDebugCodeContext __RPC_FAR *pCodeContext) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetState( 
-            /* [out] */ DWORD __RPC_FAR *pState) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Suspend( 
-            /* [out] */ DWORD __RPC_FAR *pdwCount) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Resume( 
-            /* [out] */ DWORD __RPC_FAR *pdwCount) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetSuspendCount( 
-            /* [out] */ DWORD __RPC_FAR *pdwCount) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IRemoteDebugApplicationThreadVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSystemThreadId )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *dwThreadId);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetApplication )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *pprda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFrames )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDescription )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription,
-            /* [out] */ BSTR __RPC_FAR *pbstrState);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetNextStatement )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ IDebugStackFrame __RPC_FAR *pStackFrame,
-            /* [in] */ IDebugCodeContext __RPC_FAR *pCodeContext);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetState )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pState);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Suspend )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Resume )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSuspendCount )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        END_INTERFACE
-    } IRemoteDebugApplicationThreadVtbl;
-
-    interface IRemoteDebugApplicationThread
-    {
-        CONST_VTBL struct IRemoteDebugApplicationThreadVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetSystemThreadId_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *dwThreadId);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetSystemThreadId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetApplication_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *pprda);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_EnumStackFrames_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_EnumStackFrames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetDescription_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrDescription,
-    /* [out] */ BSTR __RPC_FAR *pbstrState);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_SetNextStatement_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [in] */ IDebugStackFrame __RPC_FAR *pStackFrame,
-    /* [in] */ IDebugCodeContext __RPC_FAR *pCodeContext);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_SetNextStatement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetState_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *pState);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_Suspend_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *pdwCount);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_Suspend_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_Resume_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *pdwCount);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_Resume_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetSuspendCount_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *pdwCount);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetSuspendCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IRemoteDebugApplicationThread_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugApplicationThread_INTERFACE_DEFINED__
-#define __IDebugApplicationThread_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugApplicationThread
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugApplicationThread;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C38-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugApplicationThread : public IRemoteDebugApplicationThread
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE SynchronousCallIntoThread( 
-            /* [in] */ IDebugThreadCall __RPC_FAR *pstcb,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryIsCurrentThread( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryIsDebuggerThread( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDescription( 
-            /* [in] */ LPCOLESTR pstrDescription) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetStateString( 
-            /* [in] */ LPCOLESTR pstrState) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugApplicationThreadVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugApplicationThread __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugApplicationThread __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSystemThreadId )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *dwThreadId);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetApplication )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *pprda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFrames )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDescription )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription,
-            /* [out] */ BSTR __RPC_FAR *pbstrState);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetNextStatement )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ IDebugStackFrame __RPC_FAR *pStackFrame,
-            /* [in] */ IDebugCodeContext __RPC_FAR *pCodeContext);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetState )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pState);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Suspend )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Resume )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSuspendCount )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SynchronousCallIntoThread )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ IDebugThreadCall __RPC_FAR *pstcb,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryIsCurrentThread )( 
-            IDebugApplicationThread __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryIsDebuggerThread )( 
-            IDebugApplicationThread __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDescription )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrDescription);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetStateString )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrState);
-        
-        END_INTERFACE
-    } IDebugApplicationThreadVtbl;
-
-    interface IDebugApplicationThread
-    {
-        CONST_VTBL struct IDebugApplicationThreadVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-
-#define IDebugApplicationThread_SynchronousCallIntoThread(This,pstcb,dwParam1,dwParam2,dwParam3)	\
-    (This)->lpVtbl -> SynchronousCallIntoThread(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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SynchronousCallIntoThread_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This,
-    /* [in] */ IDebugThreadCall __RPC_FAR *pstcb,
-    /* [in] */ DWORD dwParam1,
-    /* [in] */ DWORD dwParam2,
-    /* [in] */ DWORD dwParam3);
-
-
-void __RPC_STUB IDebugApplicationThread_SynchronousCallIntoThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_QueryIsCurrentThread_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationThread_QueryIsCurrentThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_QueryIsDebuggerThread_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationThread_QueryIsDebuggerThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SetDescription_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrDescription);
-
-
-void __RPC_STUB IDebugApplicationThread_SetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SetStateString_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrState);
-
-
-void __RPC_STUB IDebugApplicationThread_SetStateString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugApplicationThread_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugCookie_INTERFACE_DEFINED__
-#define __IDebugCookie_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugCookie
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][local][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugCookie;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C39-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugCookie : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE SetDebugCookie( 
-            /* [in] */ DWORD dwDebugAppCookie) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugCookieVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugCookie __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugCookie __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugCookie __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDebugCookie )( 
-            IDebugCookie __RPC_FAR * This,
-            /* [in] */ DWORD dwDebugAppCookie);
-        
-        END_INTERFACE
-    } IDebugCookieVtbl;
-
-    interface IDebugCookie
-    {
-        CONST_VTBL struct IDebugCookieVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugCookie_SetDebugCookie(This,dwDebugAppCookie)	\
-    (This)->lpVtbl -> SetDebugCookie(This,dwDebugAppCookie)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugCookie_SetDebugCookie_Proxy( 
-    IDebugCookie __RPC_FAR * This,
-    /* [in] */ DWORD dwDebugAppCookie);
-
-
-void __RPC_STUB IDebugCookie_SetDebugCookie_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugCookie_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumDebugApplicationNodes_INTERFACE_DEFINED__
-#define __IEnumDebugApplicationNodes_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumDebugApplicationNodes
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumDebugApplicationNodes;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3a-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumDebugApplicationNodes : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumDebugApplicationNodesVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This,
-            /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp);
-        
-        END_INTERFACE
-    } IEnumDebugApplicationNodesVtbl;
-
-    interface IEnumDebugApplicationNodes
-    {
-        CONST_VTBL struct IEnumDebugApplicationNodesVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugApplicationNodes_RemoteNext_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumDebugApplicationNodes_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Skip_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumDebugApplicationNodes_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Reset_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumDebugApplicationNodes_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Clone_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp);
-
-
-void __RPC_STUB IEnumDebugApplicationNodes_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumDebugApplicationNodes_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplications_INTERFACE_DEFINED__
-#define __IEnumRemoteDebugApplications_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumRemoteDebugApplications
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumRemoteDebugApplications;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3b-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumRemoteDebugApplications : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppessd) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumRemoteDebugApplicationsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppessd);
-        
-        END_INTERFACE
-    } IEnumRemoteDebugApplicationsVtbl;
-
-    interface IEnumRemoteDebugApplications
-    {
-        CONST_VTBL struct IEnumRemoteDebugApplicationsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumRemoteDebugApplications_RemoteNext_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumRemoteDebugApplications_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Skip_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumRemoteDebugApplications_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Reset_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumRemoteDebugApplications_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Clone_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppessd);
-
-
-void __RPC_STUB IEnumRemoteDebugApplications_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumRemoteDebugApplications_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__
-#define __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumRemoteDebugApplicationThreads
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumRemoteDebugApplicationThreads;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3c-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumRemoteDebugApplicationThreads : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdat,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumRemoteDebugApplicationThreadsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdat,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-        
-        END_INTERFACE
-    } IEnumRemoteDebugApplicationThreadsVtbl;
-
-    interface IEnumRemoteDebugApplicationThreads
-    {
-        CONST_VTBL struct IEnumRemoteDebugApplicationThreadsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumRemoteDebugApplicationThreads_RemoteNext_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *ppdat,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumRemoteDebugApplicationThreads_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Skip_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumRemoteDebugApplicationThreads_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Reset_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumRemoteDebugApplicationThreads_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Clone_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-
-
-void __RPC_STUB IEnumRemoteDebugApplicationThreads_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugFormatter_INTERFACE_DEFINED__
-#define __IDebugFormatter_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugFormatter
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugFormatter;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C05-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugFormatter : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetStringForVariant( 
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ ULONG nRadix,
-            /* [out] */ BSTR __RPC_FAR *pbstrValue) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetVariantForString( 
-            /* [in] */ LPCOLESTR pwstrValue,
-            /* [out] */ VARIANT __RPC_FAR *pvar) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetStringForVarType( 
-            /* [in] */ VARTYPE vt,
-            /* [in] */ TYPEDESC __RPC_FAR *ptdescArrayType,
-            /* [out] */ BSTR __RPC_FAR *pbstr) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugFormatterVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugFormatter __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugFormatter __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugFormatter __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetStringForVariant )( 
-            IDebugFormatter __RPC_FAR * This,
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ ULONG nRadix,
-            /* [out] */ BSTR __RPC_FAR *pbstrValue);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetVariantForString )( 
-            IDebugFormatter __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pwstrValue,
-            /* [out] */ VARIANT __RPC_FAR *pvar);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetStringForVarType )( 
-            IDebugFormatter __RPC_FAR * This,
-            /* [in] */ VARTYPE vt,
-            /* [in] */ TYPEDESC __RPC_FAR *ptdescArrayType,
-            /* [out] */ BSTR __RPC_FAR *pbstr);
-        
-        END_INTERFACE
-    } IDebugFormatterVtbl;
-
-    interface IDebugFormatter
-    {
-        CONST_VTBL struct IDebugFormatterVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugFormatter_GetStringForVariant_Proxy( 
-    IDebugFormatter __RPC_FAR * This,
-    /* [in] */ VARIANT __RPC_FAR *pvar,
-    /* [in] */ ULONG nRadix,
-    /* [out] */ BSTR __RPC_FAR *pbstrValue);
-
-
-void __RPC_STUB IDebugFormatter_GetStringForVariant_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugFormatter_GetVariantForString_Proxy( 
-    IDebugFormatter __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pwstrValue,
-    /* [out] */ VARIANT __RPC_FAR *pvar);
-
-
-void __RPC_STUB IDebugFormatter_GetVariantForString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugFormatter_GetStringForVarType_Proxy( 
-    IDebugFormatter __RPC_FAR * This,
-    /* [in] */ VARTYPE vt,
-    /* [in] */ TYPEDESC __RPC_FAR *ptdescArrayType,
-    /* [out] */ BSTR __RPC_FAR *pbstr);
-
-
-void __RPC_STUB IDebugFormatter_GetStringForVarType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugFormatter_INTERFACE_DEFINED__ */
-
-
-#ifndef __ISimpleConnectionPoint_INTERFACE_DEFINED__
-#define __ISimpleConnectionPoint_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: ISimpleConnectionPoint
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_ISimpleConnectionPoint;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3e-CB0C-11d0-B5C9-00A0244A0E7A")
-    ISimpleConnectionPoint : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetEventCount( 
-            /* [out] */ ULONG __RPC_FAR *pulCount) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE DescribeEvents( 
-            /* [in] */ ULONG iEvent,
-            /* [in] */ ULONG cEvents,
-            /* [length_is][size_is][out] */ DISPID __RPC_FAR *prgid,
-            /* [length_is][size_is][out] */ BSTR __RPC_FAR *prgbstr,
-            /* [out] */ ULONG __RPC_FAR *pcEventsFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Advise( 
-            /* [in] */ IDispatch __RPC_FAR *pdisp,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Unadvise( 
-            /* [in] */ DWORD dwCookie) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct ISimpleConnectionPointVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            ISimpleConnectionPoint __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            ISimpleConnectionPoint __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetEventCount )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [out] */ ULONG __RPC_FAR *pulCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DescribeEvents )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [in] */ ULONG iEvent,
-            /* [in] */ ULONG cEvents,
-            /* [length_is][size_is][out] */ DISPID __RPC_FAR *prgid,
-            /* [length_is][size_is][out] */ BSTR __RPC_FAR *prgbstr,
-            /* [out] */ ULONG __RPC_FAR *pcEventsFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Advise )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [in] */ IDispatch __RPC_FAR *pdisp,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Unadvise )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [in] */ DWORD dwCookie);
-        
-        END_INTERFACE
-    } ISimpleConnectionPointVtbl;
-
-    interface ISimpleConnectionPoint
-    {
-        CONST_VTBL struct ISimpleConnectionPointVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_GetEventCount_Proxy( 
-    ISimpleConnectionPoint __RPC_FAR * This,
-    /* [out] */ ULONG __RPC_FAR *pulCount);
-
-
-void __RPC_STUB ISimpleConnectionPoint_GetEventCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_DescribeEvents_Proxy( 
-    ISimpleConnectionPoint __RPC_FAR * This,
-    /* [in] */ ULONG iEvent,
-    /* [in] */ ULONG cEvents,
-    /* [length_is][size_is][out] */ DISPID __RPC_FAR *prgid,
-    /* [length_is][size_is][out] */ BSTR __RPC_FAR *prgbstr,
-    /* [out] */ ULONG __RPC_FAR *pcEventsFetched);
-
-
-void __RPC_STUB ISimpleConnectionPoint_DescribeEvents_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_Advise_Proxy( 
-    ISimpleConnectionPoint __RPC_FAR * This,
-    /* [in] */ IDispatch __RPC_FAR *pdisp,
-    /* [out] */ DWORD __RPC_FAR *pdwCookie);
-
-
-void __RPC_STUB ISimpleConnectionPoint_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_Unadvise_Proxy( 
-    ISimpleConnectionPoint __RPC_FAR * This,
-    /* [in] */ DWORD dwCookie);
-
-
-void __RPC_STUB ISimpleConnectionPoint_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __ISimpleConnectionPoint_INTERFACE_DEFINED__ */
-
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0209
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-EXTERN_C const CLSID CLSID_DebugHelper;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0209_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0209_v0_0_s_ifspec;
-
-#ifndef __IDebugHelper_INTERFACE_DEFINED__
-#define __IDebugHelper_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugHelper
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugHelper;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3f-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugHelper : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE CreatePropertyBrowser( 
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ LPCOLESTR bstrName,
-            /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreatePropertyBrowserEx( 
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ LPCOLESTR bstrName,
-            /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-            /* [in] */ IDebugFormatter __RPC_FAR *pdf,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateSimpleConnectionPoint( 
-            /* [in] */ IDispatch __RPC_FAR *pdisp,
-            /* [out] */ ISimpleConnectionPoint __RPC_FAR *__RPC_FAR *ppscp) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugHelperVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugHelper __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugHelper __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugHelper __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreatePropertyBrowser )( 
-            IDebugHelper __RPC_FAR * This,
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ LPCOLESTR bstrName,
-            /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreatePropertyBrowserEx )( 
-            IDebugHelper __RPC_FAR * This,
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ LPCOLESTR bstrName,
-            /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-            /* [in] */ IDebugFormatter __RPC_FAR *pdf,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateSimpleConnectionPoint )( 
-            IDebugHelper __RPC_FAR * This,
-            /* [in] */ IDispatch __RPC_FAR *pdisp,
-            /* [out] */ ISimpleConnectionPoint __RPC_FAR *__RPC_FAR *ppscp);
-        
-        END_INTERFACE
-    } IDebugHelperVtbl;
-
-    interface IDebugHelper
-    {
-        CONST_VTBL struct IDebugHelperVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugHelper_CreatePropertyBrowser_Proxy( 
-    IDebugHelper __RPC_FAR * This,
-    /* [in] */ VARIANT __RPC_FAR *pvar,
-    /* [in] */ LPCOLESTR bstrName,
-    /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-    /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob);
-
-
-void __RPC_STUB IDebugHelper_CreatePropertyBrowser_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugHelper_CreatePropertyBrowserEx_Proxy( 
-    IDebugHelper __RPC_FAR * This,
-    /* [in] */ VARIANT __RPC_FAR *pvar,
-    /* [in] */ LPCOLESTR bstrName,
-    /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-    /* [in] */ IDebugFormatter __RPC_FAR *pdf,
-    /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob);
-
-
-void __RPC_STUB IDebugHelper_CreatePropertyBrowserEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugHelper_CreateSimpleConnectionPoint_Proxy( 
-    IDebugHelper __RPC_FAR * This,
-    /* [in] */ IDispatch __RPC_FAR *pdisp,
-    /* [out] */ ISimpleConnectionPoint __RPC_FAR *__RPC_FAR *ppscp);
-
-
-void __RPC_STUB IDebugHelper_CreateSimpleConnectionPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugHelper_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumDebugExpressionContexts_INTERFACE_DEFINED__
-#define __IEnumDebugExpressionContexts_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumDebugExpressionContexts
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumDebugExpressionContexts;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C40-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumDebugExpressionContexts : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *ppdec,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumDebugExpressionContextsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *ppdec,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This,
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-        
-        END_INTERFACE
-    } IEnumDebugExpressionContextsVtbl;
-
-    interface IEnumDebugExpressionContexts
-    {
-        CONST_VTBL struct IEnumDebugExpressionContextsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugExpressionContexts_RemoteNext_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *pprgdec,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumDebugExpressionContexts_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Skip_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumDebugExpressionContexts_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Reset_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumDebugExpressionContexts_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Clone_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-
-
-void __RPC_STUB IEnumDebugExpressionContexts_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumDebugExpressionContexts_INTERFACE_DEFINED__ */
-
-
-#ifndef __IProvideExpressionContexts_INTERFACE_DEFINED__
-#define __IProvideExpressionContexts_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IProvideExpressionContexts
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IProvideExpressionContexts;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C41-CB0C-11d0-B5C9-00A0244A0E7A")
-    IProvideExpressionContexts : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE EnumExpressionContexts( 
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IProvideExpressionContextsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IProvideExpressionContexts __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IProvideExpressionContexts __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IProvideExpressionContexts __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumExpressionContexts )( 
-            IProvideExpressionContexts __RPC_FAR * This,
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-        
-        END_INTERFACE
-    } IProvideExpressionContextsVtbl;
-
-    interface IProvideExpressionContexts
-    {
-        CONST_VTBL struct IProvideExpressionContextsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IProvideExpressionContexts_EnumExpressionContexts(This,ppedec)	\
-    (This)->lpVtbl -> EnumExpressionContexts(This,ppedec)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IProvideExpressionContexts_EnumExpressionContexts_Proxy( 
-    IProvideExpressionContexts __RPC_FAR * This,
-    /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-
-
-void __RPC_STUB IProvideExpressionContexts_EnumExpressionContexts_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IProvideExpressionContexts_INTERFACE_DEFINED__ */
-
-
-
-#ifndef __ProcessDebugManagerLib_LIBRARY_DEFINED__
-#define __ProcessDebugManagerLib_LIBRARY_DEFINED__
-
-/****************************************
- * Generated header for library: ProcessDebugManagerLib
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [helpstring][version][uuid] */ 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-EXTERN_C const CLSID CLSID_CDebugDocumentHelper;
-
-EXTERN_C const IID LIBID_ProcessDebugManagerLib;
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_ProcessDebugManager;
-
-class DECLSPEC_UUID("78a51822-51f4-11d0-8f20-00805f2cd064")
-ProcessDebugManager;
-#endif
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_DebugHelper;
-
-class DECLSPEC_UUID("0BFCC060-8C1D-11d0-ACCD-00AA0060275C")
-DebugHelper;
-#endif
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_CDebugDocumentHelper;
-
-class DECLSPEC_UUID("83B8BCA6-687C-11D0-A405-00AA0060275C")
-CDebugDocumentHelper;
-#endif
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_MachineDebugManager;
-
-class DECLSPEC_UUID("0C0A3666-30C9-11D0-8F20-00805F2CD064")
-MachineDebugManager;
-#endif
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_DefaultDebugSessionProvider;
-
-class DECLSPEC_UUID("834128a2-51f4-11d0-8f20-00805f2cd064")
-DefaultDebugSessionProvider;
-#endif
-#endif /* __ProcessDebugManagerLib_LIBRARY_DEFINED__ */
-
-/* Additional Prototypes for ALL interfaces */
-
-unsigned long             __RPC_USER  BSTR_UserSize(     unsigned long __RPC_FAR *, unsigned long            , BSTR __RPC_FAR * ); 
-unsigned char __RPC_FAR * __RPC_USER  BSTR_UserMarshal(  unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); 
-unsigned char __RPC_FAR * __RPC_USER  BSTR_UserUnmarshal(unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); 
-void                      __RPC_USER  BSTR_UserFree(     unsigned long __RPC_FAR *, BSTR __RPC_FAR * ); 
-
-/* [local] */ HRESULT __stdcall IEnumDebugCodeContexts_Next_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugCodeContexts_Next_Stub( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumDebugStackFrames_Next_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugStackFrames_Next_Stub( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumDebugApplicationNodes_Next_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugApplicationNodes_Next_Stub( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumRemoteDebugApplications_Next_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumRemoteDebugApplications_Next_Stub( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumRemoteDebugApplicationThreads_Next_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdat,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumRemoteDebugApplicationThreads_Next_Stub( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *ppdat,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumDebugExpressionContexts_Next_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *ppdec,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugExpressionContexts_Next_Stub( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *pprgdec,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-
-/* end of Additional Prototypes */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/dlldata.c b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/dlldata.c
deleted file mode 100644
index 4762f3a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/dlldata.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*********************************************************
-   DllData file -- generated by MIDL compiler 
-
-        DO NOT ALTER THIS FILE
-
-   This file is regenerated by MIDL on every IDL file compile.
-
-   To completely reconstruct this file, delete it and rerun MIDL
-   on all the IDL files in this DLL, specifying this file for the
-   /dlldata command line option
-
-*********************************************************/
-
-#define PROXY_DELEGATION
-
-#include <rpcproxy.h>
-
-#ifdef __cplusplus
-extern "C"   {
-#endif
-
-EXTERN_PROXY_FILE( IECrossfireExtension )
-
-
-PROXYFILE_LIST_START
-/* Start of list */
-  REFERENCE_PROXY_FILE( IECrossfireExtension ),
-/* End of list */
-PROXYFILE_LIST_END
-
-
-DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
-
-#ifdef __cplusplus
-}  /*extern "C" */
-#endif
-
-/* end of generated dlldata file */
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/resource.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/resource.h
deleted file mode 100644
index 34b3017..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/resource.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by IECrossfireExtension.rc
-//
-#define IDS_PROJNAME                    100
-#define IDR_IECrossfireExtension                 101
-#define IDR_IECrossfireBHO                       102
-
-// Next default values for new objects
-// 
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        201
-#define _APS_NEXT_COMMAND_VALUE         32768
-#define _APS_NEXT_CONTROL_VALUE         201
-#define _APS_NEXT_SYMED_VALUE           111
-#endif
-#endif
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.cpp
deleted file mode 100644
index 48c2ce4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-// stdafx.cpp : source file that includes just the standard includes
-// IECrossfireExtension.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.h
deleted file mode 100644
index bfd1557..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently,
-// but are changed infrequently
-
-#pragma once
-
-#ifndef STRICT
-#define STRICT
-#endif
-
-// Modify the following defines if you have to target a platform prior to the ones specified below.
-// Refer to MSDN for the latest info on corresponding values for different platforms.
-#ifndef WINVER				// Allow use of features specific to Windows XP or later.
-#define WINVER 0x0501		// Change this to the appropriate value to target other versions of Windows.
-#endif
-
-#ifndef _WIN32_WINNT		// Allow use of features specific to Windows XP or later.                   
-#define _WIN32_WINNT 0x0501	// Change this to the appropriate value to target other versions of Windows.
-#endif						
-
-#ifndef _WIN32_WINDOWS		// Allow use of features specific to Windows 98 or later.
-#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
-#endif
-
-#ifndef _WIN32_IE			// Allow use of features specific to IE 6.0 or later.
-#define _WIN32_IE 0x0600	// Change this to the appropriate value to target other versions of IE.
-#endif
-
-#define _ATL_APARTMENT_THREADED
-#define _ATL_NO_AUTOMATIC_NAMESPACE
-
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS	// some CString constructors will be explicit
-
-
-#include "resource.h"
-#include <atlbase.h>
-#include <atlcom.h>
-
-using namespace ATL;
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.i b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.i
deleted file mode 100644
index 72ee680..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.i
+++ /dev/null
@@ -1,260876 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-#pragma warning(disable: 4505) 
-#pragma warning(disable: 4710) 
-#pragma warning(disable: 4514) 
-
-
-
-#pragma warning(disable: 4511) 
-#pragma warning(disable: 4512) 
-
-
-#pragma warning(disable: 4355) 
-
-
-
-
-#pragma warning(disable: 4702) 
-
-
-
-
-
-#pragma warning(disable : 4668)	
-#pragma warning(disable : 4820)	
-#pragma warning(disable : 4917)	
-
-#pragma warning(disable : 4217)	
-
-#pragma warning(disable: 4127) 
-#pragma warning(disable: 4097) 
-#pragma warning(disable: 4786) 
-#pragma warning(disable: 4291) 
-#pragma warning(disable: 4201) 
-#pragma warning(disable: 4103) 
-#pragma warning(disable: 4268) 
-
-#pragma warning (push)
-#pragma warning(disable: 4571) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-#pragma warning(disable : 4619)	
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-    
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(linker,"/manifestdependency:\"type='win32' "            \
-        "name='" "Microsoft.VC80" ".DebugCRT' "         \
-        "version='" "8.0.50727.4053" "' "                          \
-        "processorArchitecture='x86' "                                  \
-        "publicKeyToken='" "1fc8b3b9a1e18e3b" "'\"")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef __w64 unsigned int   uintptr_t;
-
-
-
-
-
-
-
-
-typedef char *  va_list;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-  
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-  
- 
-
-
-
-
-
-
-
- 
-  
-  
- 
-
-
-
-
-
-
-
- 
-  
-   
-  
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef __w64 unsigned int   size_t;
-
-
-
-
-
-
-typedef size_t rsize_t;
-
-
-
-
-
-
-
-
-typedef __w64 int            intptr_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef __w64 int            ptrdiff_t;
-
-
-
-
-
-
-
-
-
-
-typedef unsigned short wint_t;
-typedef unsigned short wctype_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("This name was supported during some Whidbey pre-releases. Instead, use the standard name errno_t.")) typedef int errcode;
-
-
-
-
-typedef int errno_t;
-
-
-
-typedef __w64 long __time32_t;   
-
-
-
-
-
-typedef __int64 __time64_t;     
-
-
-
-
-
-
-
-
-typedef __time64_t time_t;      
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct threadlocaleinfostruct;
-struct threadmbcinfostruct;
-typedef struct threadlocaleinfostruct * pthreadlocinfo;
-typedef struct threadmbcinfostruct * pthreadmbcinfo;
-struct __lc_time_data;
-
-typedef struct localeinfo_struct
-{
-    pthreadlocinfo locinfo;
-    pthreadmbcinfo mbcinfo;
-} _locale_tstruct, *_locale_t;
-
-
-typedef struct tagLC_ID {
-        unsigned short wLanguage;
-        unsigned short wCountry;
-        unsigned short wCodePage;
-} LC_ID, *LPLC_ID;
-
-
-
-
-typedef struct threadlocaleinfostruct {
-        int refcount;
-        unsigned int lc_codepage;
-        unsigned int lc_collate_cp;
-        unsigned long lc_handle[6]; 
-        LC_ID lc_id[6];
-        struct {
-            char *locale;
-            wchar_t *wlocale;
-            int *refcount;
-            int *wrefcount;
-        } lc_category[6];
-        int lc_clike;
-        int mb_cur_max;
-        int * lconv_intl_refcount;
-        int * lconv_num_refcount;
-        int * lconv_mon_refcount;
-        struct lconv * lconv;
-        int * ctype1_refcount;
-        unsigned short * ctype1;
-        const unsigned short * pctype;
-        const unsigned char * pclmap;
-        const unsigned char * pcumap;
-        struct __lc_time_data * lc_time_curr;
-} threadlocinfo;
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-__declspec(dllimport) extern int * __cdecl _errno(void);
-
-
-errno_t __cdecl _set_errno(     int _Value);
-errno_t __cdecl _get_errno(     int * _Value);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-namespace Inconsistent_definition_of_symbol__ATL_MIXED
-{
-	struct _Please_define_it_the_same_throughout_your_project { };
-}
-
-
-
-
-
-
-
-
-
-
-
-namespace Inconsistent_definition_of_symbol__ATL_MIXED
-{
-	__declspec(selectany) _Please_define_it_the_same_throughout_your_project clash = _Please_define_it_the_same_throughout_your_project ();
-}
-
-
-namespace Define_the_symbol__ATL_MIXED
-{
-
-
-
-
-#pragma comment(linker, "/include:??3@YAXPAX@Z")
-
-
-
-	struct Thank_you { virtual void one(){} };
-
-	__declspec(selectany) Thank_you clash = Thank_you();
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C++"
-{
-template <typename _CountofType, size_t _SizeOfArray>
-char (*__countof_helper( _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	
-	
-	
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _heapinfo {
-        int * _pentry;
-        size_t _size;
-        int _useflag;
-        } _HEAPINFO;
-
-
-
-
-
-
-extern __declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_amblksiz" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) unsigned int _amblksiz;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)   __declspec(noalias) __declspec(restrict)         void * __cdecl calloc(     size_t _NumOfElements,      size_t _SizeOfElements);
-__declspec(dllimport)                     __declspec(noalias)                                                                             void   __cdecl free(       void * _Memory);
-__declspec(dllimport)   __declspec(noalias) __declspec(restrict)                                   void * __cdecl malloc(     size_t _Size);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                void * __cdecl realloc(       void * _Memory,      size_t _NewSize);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _recalloc(       void * _Memory,      size_t _Count,      size_t _Size);
-__declspec(dllimport)                     __declspec(noalias)                                                                             void   __cdecl _aligned_free(       void * _Memory);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_malloc(     size_t _Size,      size_t _Alignment);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_offset_malloc(     size_t _Size,      size_t _Alignment,      size_t _Offset);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_realloc(       void * _Memory,      size_t _Size,      size_t _Alignment);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _aligned_recalloc(       void * _Memory,      size_t _Count,      size_t _Size,      size_t _Alignment);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_offset_realloc(       void * _Memory,      size_t _Size,      size_t _Alignment,      size_t _Offset);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _aligned_offset_recalloc(       void * _Memory,      size_t _Count,      size_t _Size,      size_t _Alignment,      size_t _Offset);
-__declspec(dllimport)                                                                                                size_t __cdecl _aligned_msize(     void * _Memory,      size_t _Alignment,      size_t _Offset);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int     __cdecl _resetstkoflw (void);
-
-
-
-__declspec(dllimport) unsigned long __cdecl _set_malloc_crt_max_wait(     unsigned long _NewValue);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)      void *  __cdecl _expand(     void * _Memory,      size_t _NewSize);
-__declspec(dllimport)  size_t  __cdecl _msize(     void * _Memory);
-
-
-
-
-
-
-   void *          __cdecl _alloca(     size_t _Size);
-__declspec(dllimport)  size_t  __cdecl _get_sbh_threshold(void);
-__declspec(dllimport) int     __cdecl _set_sbh_threshold(     size_t _NewValue);
-__declspec(dllimport) errno_t __cdecl _set_amblksiz(     size_t _Value);
-__declspec(dllimport) errno_t __cdecl _get_amblksiz(     size_t * _Value);
-__declspec(dllimport)  int     __cdecl _heapadd(     void * _Memory,      size_t _Size);
-__declspec(dllimport)  int     __cdecl _heapchk(void);
-__declspec(dllimport)  int     __cdecl _heapmin(void);
-__declspec(dllimport) int     __cdecl _heapset(     unsigned int _Fill);
-__declspec(dllimport)  int     __cdecl _heapwalk(     _HEAPINFO * _EntryInfo);
-__declspec(dllimport) size_t  __cdecl _heapused(size_t * _Used, size_t * _Commit);
-
-__declspec(dllimport) intptr_t __cdecl _get_heap_handle(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef char __static_assert_t[ (sizeof(unsigned int) <= 8) ];
-
-
-__inline void *_MarkAllocaS(        void *_Ptr, unsigned int _Marker)
-{
-    if (_Ptr)
-    {
-        *((unsigned int*)_Ptr) = _Marker;
-        _Ptr = (char*)_Ptr + 8;
-    }
-    return _Ptr;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(noalias) __inline void __cdecl _freea(       void * _Memory)
-{
-    unsigned int _Marker;
-    if (_Memory)
-    {
-        _Memory = (char*)_Memory - 8;
-        _Marker = *(unsigned int *)_Memory;
-        if (_Marker == 0xDDDD)
-        {
-            free(_Memory);
-        }
-
-
-
-
-
-
-    }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef int (__cdecl * _onexit_t)(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _div_t {
-        int quot;
-        int rem;
-} div_t;
-
-typedef struct _ldiv_t {
-        long quot;
-        long rem;
-} ldiv_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(4)
-typedef struct {
-    unsigned char ld[10];
-} _LDOUBLE;
-#pragma pack()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-        double x;
-} _CRT_DOUBLE;
-
-typedef struct {
-    float f;
-} _CRT_FLOAT;
-
-
-
-
-
-typedef struct {
-        
-
-
-        long double x;
-} _LONGDOUBLE;
-
-
-
-#pragma pack(4)
-typedef struct {
-    unsigned char ld12[12];
-} _LDBL12;
-#pragma pack()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern int __mb_cur_max;
-
-
-
-
-__declspec(dllimport) int __cdecl ___mb_cur_max_func(void);
-__declspec(dllimport) int __cdecl ___mb_cur_max_l_func(_locale_t);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__cdecl *_purecall_handler)(void); 
-
-
-__declspec(dllimport) _purecall_handler __cdecl _set_purecall_handler(       _purecall_handler _Handler);
-__declspec(dllimport) _purecall_handler __cdecl _get_purecall_handler();
-
-
-
-extern "C++"
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-typedef void (__cdecl *_invalid_parameter_handler)(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t); 
-
-
-__declspec(dllimport) _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(       _invalid_parameter_handler _Handler);
-__declspec(dllimport) _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void);
-
-
-
-extern "C++"
-{
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) unsigned long * __cdecl __doserrno(void);
-
-
-errno_t __cdecl _set_doserrno(     unsigned long _Value);
-errno_t __cdecl _get_doserrno(     unsigned long * _Value);
-
-
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char ** __cdecl __sys_errlist(void);
-
-
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int * __cdecl __sys_nerr(void);
-
-
-
-
-__declspec(dllimport) int *          __cdecl __p___argc(void);
-__declspec(dllimport) char ***       __cdecl __p___argv(void);
-__declspec(dllimport) wchar_t ***    __cdecl __p___wargv(void);
-__declspec(dllimport) char ***       __cdecl __p__environ(void);
-__declspec(dllimport) wchar_t ***    __cdecl __p__wenviron(void);
-__declspec(dllimport) char **        __cdecl __p__pgmptr(void);
-__declspec(dllimport) wchar_t **     __cdecl __p__wpgmptr(void);
-
-
-
-
-
-__declspec(dllimport) extern int __argc;          
-__declspec(dllimport) extern char ** __argv;      
-__declspec(dllimport) extern wchar_t ** __wargv;  
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern char ** _environ;    
-__declspec(dllimport) extern wchar_t ** _wenviron;    
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_pgmptr" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern char * _pgmptr;      
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_wpgmptr" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern wchar_t * _wpgmptr;  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-errno_t __cdecl _get_pgmptr(       char ** _Value);
-errno_t __cdecl _get_wpgmptr(       wchar_t ** _Value);
-
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_fmode" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern int _fmode;          
-
-
-
-
-
-__declspec(dllimport) errno_t __cdecl _set_fmode(     int _Mode);
-__declspec(dllimport) errno_t __cdecl _get_fmode(     int * _PMode);
-
-
-
-#pragma warning(push)
-#pragma warning(disable:4141)
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_osplatform" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))	__declspec(dllimport) extern unsigned int _osplatform;
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_osver" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))			__declspec(dllimport) extern unsigned int _osver;
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winver" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winver;
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winmajor" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winmajor;
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winminor" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winminor;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(pop)
-
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_osplatform(     unsigned int * _Value);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_osver(     unsigned int * _Value);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winver(     unsigned int * _Value);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winmajor(     unsigned int * _Value);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winminor(     unsigned int * _Value);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) __declspec(noreturn) void __cdecl exit(     int _Code);
-__declspec(dllimport) __declspec(noreturn) void __cdecl _exit(     int _Code);
-__declspec(dllimport) void __cdecl abort(void);
-
-
-__declspec(dllimport) unsigned int __cdecl _set_abort_behavior(     unsigned int _Flags,      unsigned int _Mask);
-
-
-
-        int     __cdecl abs(     int _X);
-        long    __cdecl labs(     long _X);
-
-
-
-        __int64    __cdecl _abs64(__int64);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        int    __cdecl atexit(void (__cdecl *)(void));
-
-
-
-__declspec(dllimport)  double  __cdecl atof(       const char *_String);
-__declspec(dllimport)  double  __cdecl _atof_l(       const char *_String,        _locale_t _Locale);
-
-__declspec(dllimport)   int    __cdecl atoi(       const char *_Str);
-__declspec(dllimport)  int    __cdecl _atoi_l(       const char *_Str,        _locale_t _Locale);
-__declspec(dllimport)  long   __cdecl atol(       const char *_Str);
-__declspec(dllimport)  long   __cdecl _atol_l(       const char *_Str,        _locale_t _Locale);
-
-
-
-__declspec(dllimport)  void * __cdecl bsearch_s(     const void * _Key,        const void * _Base, 
-             rsize_t _NumOfElements,      rsize_t _SizeOfElements,
-             int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void * _Context);
-
-__declspec(dllimport)  void * __cdecl bsearch(     const void * _Key,        const void * _Base, 
-             size_t _NumOfElements,      size_t _SizeOfElements,
-             int (__cdecl * _PtFuncCompare)(const void *, const void *));
-
-
-__declspec(dllimport) void __cdecl qsort_s(       void * _Base, 
-             rsize_t _NumOfElements,      rsize_t _SizeOfElements,
-             int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void *_Context);
-
-__declspec(dllimport) void __cdecl qsort(       void * _Base, 
-	     size_t _NumOfElements,      size_t _SizeOfElements, 
-             int (__cdecl * _PtFuncCompare)(const void *, const void *));
-
-         unsigned short __cdecl _byteswap_ushort(     unsigned short _Short);
-         unsigned long  __cdecl _byteswap_ulong (     unsigned long _Long);
-
-         unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);
-
-__declspec(dllimport)  div_t  __cdecl div(     int _Numerator,      int _Denominator);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_dupenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl getenv(       const char * _VarName);
-
-__declspec(dllimport)  errno_t __cdecl getenv_s(     size_t * _ReturnSize,        char * _DstBuf,      rsize_t _DstSize,        const char * _VarName);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl getenv_s(     size_t * _ReturnSize,      char (&_Dest)[_Size],        const char * _VarName) { return getenv_s(_ReturnSize, _Dest, _Size, _VarName); } }
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _dupenv_s(                     char **_PBuffer,        size_t * _PBufferSizeInBytes,        const char * _VarName);
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _itoa_s(     int _Value,        char * _DstBuf,      size_t _Size,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _itoa_s(     int _Value,      char (&_Dest)[_Size],      int _Radix) { return _itoa_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_itoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _itoa( int _Value,  char *_Dest,  int _Radix);
-
-__declspec(dllimport)  errno_t __cdecl _i64toa_s(     __int64 _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_i64toa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _i64toa(     __int64 _Val,      char * _DstBuf,      int _Radix);
-__declspec(dllimport)  errno_t __cdecl _ui64toa_s(     unsigned __int64 _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ui64toa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _ui64toa(     unsigned __int64 _Val,      char * _DstBuf,      int _Radix);
-__declspec(dllimport)  __int64 __cdecl _atoi64(       const char * _String);
-__declspec(dllimport)  __int64 __cdecl _atoi64_l(       const char * _String,        _locale_t _Locale);
-__declspec(dllimport)  __int64 __cdecl _strtoi64(       const char * _String,                    char ** _EndPtr,      int _Radix);
-__declspec(dllimport)  __int64 __cdecl _strtoi64_l(       const char * _String,                    char ** _EndPtr,      int _Radix,        _locale_t _Locale);
-__declspec(dllimport)  unsigned __int64 __cdecl _strtoui64(       const char * _String,                    char ** _EndPtr,      int _Radix);
-__declspec(dllimport)  unsigned __int64 __cdecl _strtoui64_l(       const char * _String,                    char ** _EndPtr,      int  _Radix,        _locale_t _Locale);
-
-__declspec(dllimport)  ldiv_t __cdecl ldiv(     long _Numerator,      long _Denominator);
-
-extern "C++"
-{
-    inline ldiv_t  div(     long _A1,      long _A2)
-    {
-        return ldiv(_A1, _A2);
-    }
-}
-
-__declspec(dllimport)  errno_t __cdecl _ltoa_s(     long _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ltoa_s(     long _Value,      char (&_Dest)[_Size],      int _Radix) { return _ltoa_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _ltoa( long _Value,  char *_Dest,  int _Radix);
-__declspec(dllimport)  int    __cdecl mblen(           const char * _Ch,      size_t _MaxCount);
-__declspec(dllimport)  int    __cdecl _mblen_l(           const char * _Ch,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbstrlen(       const char * _Str);
-__declspec(dllimport)  size_t __cdecl _mbstrlen_l(       const char *_Str,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbstrnlen(       const char *_Str,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _mbstrnlen_l(       const char *_Str,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) int    __cdecl mbtowc(     wchar_t * _DstCh,            const char * _SrcCh,      size_t _SrcSizeInBytes);
-__declspec(dllimport) int    __cdecl _mbtowc_l(     wchar_t * _DstCh,            const char * _SrcCh,      size_t _SrcSizeInBytes,        _locale_t _Locale);
-__declspec(dllimport)  errno_t __cdecl mbstowcs_s(       size_t * _PtNumOfCharConverted,          wchar_t * _DstBuf,      size_t _SizeInWords,          const char * _SrcBuf,      size_t _MaxCount );
-extern "C++" { template <size_t _Size> inline errno_t __cdecl mbstowcs_s(       size_t * _PtNumOfCharConverted,        wchar_t (&_Dest)[_Size],        const char * _Source,      size_t _MaxCount) { return mbstowcs_s(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "mbstowcs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl mbstowcs( wchar_t *_Dest,  const char * _Source,  size_t _MaxCount);
-
-__declspec(dllimport)  errno_t __cdecl _mbstowcs_s_l(       size_t * _PtNumOfCharConverted,          wchar_t * _DstBuf,      size_t _SizeInWords,          const char * _SrcBuf,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbstowcs_s_l(       size_t * _PtNumOfCharConverted,      wchar_t (&_Dest)[_Size],        const char * _Source,      size_t _MaxCount,        _locale_t _Locale) { return _mbstowcs_s_l(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstowcs_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl _mbstowcs_l(       wchar_t *_Dest,        const char * _Source,      size_t _MaxCount,        _locale_t _Locale);
-
-__declspec(dllimport)  int    __cdecl rand(void);
-
-
-
-
-__declspec(dllimport)  int    __cdecl _set_error_mode(     int _Mode);
-
-__declspec(dllimport) void   __cdecl srand(     unsigned int _Seed);
-__declspec(dllimport)  double __cdecl strtod(       const char * _Str,                    char ** _EndPtr);
-__declspec(dllimport)  double __cdecl _strtod_l(       const char * _Str,                    char ** _EndPtr,        _locale_t _Locale);
-__declspec(dllimport)  long   __cdecl strtol(       const char * _Str,                    char ** _EndPtr,      int _Radix );
-__declspec(dllimport)  long   __cdecl _strtol_l(       const char *_Str,                    char **_EndPtr,      int _Radix,        _locale_t _Locale);
-__declspec(dllimport)  unsigned long __cdecl strtoul(       const char * _Str,                    char ** _EndPtr,      int _Radix);
-__declspec(dllimport)  unsigned long __cdecl _strtoul_l(const char * _Str,                    char **_EndPtr,      int _Radix,        _locale_t _Locale);
-
-
-__declspec(dllimport) int __cdecl system(         const char * _Command);
-
-__declspec(dllimport)  errno_t __cdecl _ultoa_s(     unsigned long _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ultoa_s(     unsigned long _Value,      char (&_Dest)[_Size],      int _Radix) { return _ultoa_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _ultoa( unsigned long _Value,  char *_Dest,  int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "wctomb_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int    __cdecl wctomb(         char * _MbCh,        wchar_t _WCh);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctomb_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int    __cdecl _wctomb_l(       char * _MbCh,      wchar_t _WCh,        _locale_t _Locale);
-
-__declspec(dllimport)  errno_t __cdecl wctomb_s(       int * _SizeConverted,          char * _MbCh,      rsize_t _SizeInBytes,      wchar_t _WCh);
-
-__declspec(dllimport)  errno_t __cdecl _wctomb_s_l(       int * _SizeConverted,          char * _MbCh,      size_t _SizeInBytes,      wchar_t _WCh,        _locale_t _Locale);
-__declspec(dllimport)  errno_t __cdecl wcstombs_s(       size_t * _PtNumOfCharConverted,          char * _Dst,      size_t _DstSizeInBytes,        const wchar_t * _Src,      size_t _MaxCountInBytes);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcstombs_s(       size_t * _PtNumOfCharConverted,        char (&_Dest)[_Size],        const wchar_t * _Source,      size_t _MaxCount) { return wcstombs_s(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcstombs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcstombs( char *_Dest,  const wchar_t * _Source,  size_t _MaxCount);
-__declspec(dllimport)  errno_t __cdecl _wcstombs_s_l(       size_t * _PtNumOfCharConverted,          char * _Dst,      size_t _DstSizeInBytes,        const wchar_t * _Src,      size_t _MaxCountInBytes,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcstombs_s_l(       size_t * _PtNumOfCharConverted,        char (&_Dest)[_Size],        const wchar_t * _Source,      size_t _MaxCount,        _locale_t _Locale) { return _wcstombs_s_l(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcstombs_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl _wcstombs_l(       char *_Dest,        const wchar_t * _Source,      size_t _MaxCount,        _locale_t _Locale);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _itow_s (     int _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _itow_s(     int _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _itow_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_itow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _itow( int _Value,  wchar_t *_Dest,  int _Radix);
-__declspec(dllimport)  errno_t __cdecl _ltow_s (     long _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ltow_s(     long _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _ltow_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _ltow( long _Value,  wchar_t *_Dest,  int _Radix);
-__declspec(dllimport)  errno_t __cdecl _ultow_s (     unsigned long _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ultow_s(     unsigned long _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _ultow_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _ultow( unsigned long _Value,  wchar_t *_Dest,  int _Radix);
-__declspec(dllimport)  double __cdecl wcstod(       const wchar_t * _Str,                    wchar_t ** _EndPtr);
-__declspec(dllimport)  double __cdecl _wcstod_l(       const wchar_t *_Str,                    wchar_t ** _EndPtr,        _locale_t _Locale);
-__declspec(dllimport)  long   __cdecl wcstol(       const wchar_t *_Str,                    wchar_t ** _EndPtr, int _Radix);
-__declspec(dllimport)  long   __cdecl _wcstol_l(       const wchar_t *_Str,                    wchar_t **_EndPtr, int _Radix,        _locale_t _Locale);
-__declspec(dllimport)  unsigned long __cdecl wcstoul(       const wchar_t *_Str,                    wchar_t ** _EndPtr, int _Radix);
-__declspec(dllimport)  unsigned long __cdecl _wcstoul_l(       const wchar_t *_Str,                    wchar_t **_EndPtr, int _Radix,        _locale_t _Locale);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wdupenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  wchar_t * __cdecl _wgetenv(       const wchar_t * _VarName);
-__declspec(dllimport)  errno_t __cdecl _wgetenv_s(     size_t * _ReturnSize,        wchar_t * _DstBuf,      size_t _DstSizeInWords,        const wchar_t * _VarName);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wgetenv_s(     size_t * _ReturnSize,      wchar_t (&_Dest)[_Size],        const wchar_t * _VarName) { return _wgetenv_s(_ReturnSize, _Dest, _Size, _VarName); } }
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _wdupenv_s(                     wchar_t **_Buffer,        size_t *_BufferSizeInWords,        const wchar_t *_VarName);
-
-
-
-
-
-
-
-__declspec(dllimport) int __cdecl _wsystem(         const wchar_t * _Command);
-
-__declspec(dllimport)  double __cdecl _wtof(       const wchar_t *_Str);
-__declspec(dllimport)  double __cdecl _wtof_l(       const wchar_t *_Str,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wtoi(       const wchar_t *_Str);
-__declspec(dllimport)  int __cdecl _wtoi_l(       const wchar_t *_Str,        _locale_t _Locale);
-__declspec(dllimport)  long __cdecl _wtol(       const wchar_t *_Str);
-__declspec(dllimport)  long __cdecl _wtol_l(       const wchar_t *_Str,        _locale_t _Locale);
-
-
-__declspec(dllimport)  errno_t __cdecl _i64tow_s(     __int64 _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_i65tow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _i64tow(     __int64 _Val,      wchar_t * _DstBuf,      int _Radix);
-__declspec(dllimport)  errno_t __cdecl _ui64tow_s(     unsigned __int64 _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ui64tow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _ui64tow(     unsigned __int64 _Val,      wchar_t * _DstBuf,      int _Radix);
-__declspec(dllimport)  __int64   __cdecl _wtoi64(       const wchar_t *_Str);
-__declspec(dllimport)  __int64   __cdecl _wtoi64_l(       const wchar_t *_Str,        _locale_t _Locale);
-__declspec(dllimport)  __int64   __cdecl _wcstoi64(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix);
-__declspec(dllimport)  __int64   __cdecl _wcstoi64_l(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix,        _locale_t _Locale);
-__declspec(dllimport)  unsigned __int64  __cdecl _wcstoui64(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix);
-__declspec(dllimport)  unsigned __int64  __cdecl _wcstoui64_l(       const wchar_t *_Str ,                    wchar_t ** _EndPtr,      int _Radix,        _locale_t _Locale);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  char * __cdecl _fullpath(         char * _FullPath,        const char * _Path,      size_t _SizeInBytes);
-
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _ecvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDights,      int * _PtDec,      int * _PtSign);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ecvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits,      int * _PtDec,      int * _PtSign) { return _ecvt_s(_Dest, _Size, _Value, _NumOfDigits, _PtDec, _PtSign); } }
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ecvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _ecvt(     double _Val,      int _NumOfDigits,      int * _PtDec,      int * _PtSign);
-__declspec(dllimport)  errno_t __cdecl _fcvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _fcvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits,      int * _PtDec,      int * _PtSign) { return _fcvt_s(_Dest, _Size, _Value, _NumOfDigits, _PtDec, _PtSign); } }
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _fcvt(     double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
-__declspec(dllimport) errno_t __cdecl _gcvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDigits);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _gcvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits) { return _gcvt_s(_Dest, _Size, _Value, _NumOfDigits); } }
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_gcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _gcvt(     double _Val,      int _NumOfDigits,      char * _DstBuf);
-
-__declspec(dllimport)  int __cdecl _atodbl(     _CRT_DOUBLE * _Result,        char * _Str);
-__declspec(dllimport)  int __cdecl _atoldbl(     _LDOUBLE * _Result,        char * _Str);
-__declspec(dllimport)  int __cdecl _atoflt(     _CRT_FLOAT * _Result,        char * _Str);
-__declspec(dllimport)  int __cdecl _atodbl_l(     _CRT_DOUBLE * _Result,        char * _Str,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _atoldbl_l(     _LDOUBLE * _Result,        char * _Str,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _atoflt_l(     _CRT_FLOAT * _Result,        char * _Str,        _locale_t _Locale);
-         unsigned long __cdecl _lrotl(     unsigned long _Val,      int _Shift);
-         unsigned long __cdecl _lrotr(     unsigned long _Val,      int _Shift);
-__declspec(dllimport)  errno_t   __cdecl _makepath_s(       char * _PathResult,        size_t _Size,          const char * _Drive,          const char * _Dir,          const char * _Filename,
-                 const char * _Ext);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _makepath_s(     char (&_Path)[_Size],          const char * _Drive,          const char * _Dir,          const char * _Filename,          const char * _Ext) { return _makepath_s(_Path, _Size, _Drive, _Dir, _Filename, _Ext); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_makepath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _makepath( char *_Path,  const char * _Drive,  const char * _Dir,  const char * _Filename,  const char * _Ext);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        _onexit_t __cdecl _onexit(       _onexit_t _Func);
-
-        
-
-
-__declspec(dllimport) void __cdecl perror(         const char * _ErrMsg);
-
-__declspec(dllimport)  int    __cdecl _putenv(       const char * _EnvString);
-__declspec(dllimport)  errno_t __cdecl _putenv_s(       const char * _Name,        const char * _Value);
-         unsigned int __cdecl _rotl(     unsigned int _Val,      int _Shift);
-
-         unsigned __int64 __cdecl _rotl64(     unsigned __int64 _Val,      int _Shift);
-
-         unsigned int __cdecl _rotr(     unsigned int _Val,      int _Shift);
-
-         unsigned __int64 __cdecl _rotr64(     unsigned __int64 _Val,      int _Shift);
-
-__declspec(dllimport) errno_t __cdecl _searchenv_s(       const char * _Filename,        const char * _EnvVar,        char * _ResultPath,      size_t _SizeInBytes);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _searchenv_s(       const char * _Filename,        const char * _EnvVar,      char (&_ResultPath)[_Size]) { return _searchenv_s(_Filename, _EnvVar, _ResultPath, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_searchenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _searchenv( const char * _Filename,  const char * _EnvVar,  char *_ResultPath);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_splitpath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void   __cdecl _splitpath(       const char * _FullPath,        char * _Drive,        char * _Dir,        char * _Filename,        char * _Ext);
-__declspec(dllimport)  errno_t  __cdecl _splitpath_s(       const char * _FullPath, 
-		         char * _Drive,      size_t _DriveSize, 
-		         char * _Dir,      size_t _DirSize, 
-		         char * _Filename,      size_t _FilenameSize, 
-		         char * _Ext,      size_t _ExtSize);
-extern "C++" { template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> inline errno_t __cdecl _splitpath_s(     const char *_Dest,        char (&_Drive)[_DriveSize],        char (&_Dir)[_DirSize],        char (&_Name)[_NameSize],        char (&_Ext)[_ExtSize]) { return _splitpath_s(_Dest, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); } }
-
-__declspec(dllimport) void   __cdecl _swab(           char * _Buf1,            char * _Buf2, int _SizeInBytes);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  wchar_t * __cdecl _wfullpath(         wchar_t * _FullPath,        const wchar_t * _Path,      size_t _SizeInWords);
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _wmakepath_s(       wchar_t * _PathResult,        size_t _SizeInWords,          const wchar_t * _Drive,          const wchar_t * _Dir,          const wchar_t * _Filename,
-                 const wchar_t * _Ext);        
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wmakepath_s(     wchar_t (&_ResultPath)[_Size],          const wchar_t * _Drive,          const wchar_t * _Dir,          const wchar_t * _Filename,          const wchar_t * _Ext) { return _wmakepath_s(_ResultPath, _Size, _Drive, _Dir, _Filename, _Ext); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wmakepath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _wmakepath( wchar_t *_ResultPath,  const wchar_t * _Drive,  const wchar_t * _Dir,  const wchar_t * _Filename,  const wchar_t * _Ext);
-
-
-__declspec(dllimport) void __cdecl _wperror(         const wchar_t * _ErrMsg);
-
-__declspec(dllimport)  int    __cdecl _wputenv(       const wchar_t * _EnvString);
-__declspec(dllimport)  errno_t __cdecl _wputenv_s(       const wchar_t * _Name,        const wchar_t * _Value);
-__declspec(dllimport) errno_t __cdecl _wsearchenv_s(       const wchar_t * _Filename,        const wchar_t * _EnvVar,        wchar_t * _ResultPath,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wsearchenv_s(       const wchar_t * _Filename,        const wchar_t * _EnvVar,      wchar_t (&_ResultPath)[_Size]) { return _wsearchenv_s(_Filename, _EnvVar, _ResultPath, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsearchenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _wsearchenv( const wchar_t * _Filename,  const wchar_t * _EnvVar,  wchar_t *_ResultPath);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsplitpath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void   __cdecl _wsplitpath(       const wchar_t * _FullPath,        wchar_t * _Drive,        wchar_t * _Dir,        wchar_t * _Filename,        wchar_t * _Ext);
-__declspec(dllimport) errno_t __cdecl _wsplitpath_s(       const wchar_t * _FullPath, 
-		         wchar_t * _Drive,      size_t _DriveSizeInWords, 
-		         wchar_t * _Dir,      size_t _DirSizeInWords, 
-		         wchar_t * _Filename,      size_t _FilenameSizeInWords, 
-		         wchar_t * _Ext,      size_t _ExtSizeInWords);
-extern "C++" { template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> inline errno_t __cdecl _wsplitpath_s(     const wchar_t *_Path,        wchar_t (&_Drive)[_DriveSize],        wchar_t (&_Dir)[_DirSize],        wchar_t (&_Name)[_NameSize],        wchar_t (&_Ext)[_ExtSize]) { return _wsplitpath_s(_Path, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); } }
-
-
-
-
-
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "SetErrorMode" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _seterrormode(     int _Mode);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "Beep" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _beep(     unsigned _Frequency,      unsigned _Duration);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "Sleep" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _sleep(     unsigned long _Duration);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable: 4141)  
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ecvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ecvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport)  char * __cdecl ecvt(     double _Val,      int _NumOfDigits,      int * _PtDec,      int * _PtSign);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fcvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport)  char * __cdecl fcvt(     double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_gcvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl gcvt(     double _Val,      int _NumOfDigits,      char * _DstBuf);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_itoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_itoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl itoa(     int _Val,      char * _DstBuf,      int _Radix);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ltoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl ltoa(     long _Val,      char * _DstBuf,      int _Radix);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_putenv" ". See online help for details.")) 									__declspec(dllimport)  int    __cdecl putenv(       const char * _EnvString);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_swab" ". See online help for details."))										__declspec(dllimport) void   __cdecl swab(           char * _Buf1,           char * _Buf2,      int _SizeInBytes);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ultoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))	__declspec(dllimport) char * __cdecl ultoa(     unsigned long _Val,      char * _Dstbuf,      int _Radix);
-#pragma warning(pop)
-_onexit_t __cdecl onexit(       _onexit_t _Func);
-
-
-
-
-
-
-}
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
- 
-
-
-
-
-
-typedef void *_HFILE; 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef int (__cdecl * _CRT_REPORT_HOOK)(int, char *, int *);
-typedef int (__cdecl * _CRT_REPORT_HOOKW)(int, wchar_t *, int *);
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-typedef int (__cdecl * _CRT_ALLOC_HOOK)(int, void *, size_t, int, long, const unsigned char *, int);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__cdecl * _CRT_DUMP_CLIENT)(void *, size_t);
-
-
-
-
-
-
-
-struct _CrtMemBlockHeader;
-typedef struct _CrtMemState
-{
-        struct _CrtMemBlockHeader * pBlockHeader;
-        size_t lCounts[5];
-        size_t lSizes[5];
-        size_t lHighWaterCount;
-        size_t lTotalCount;
-} _CrtMemState;
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-__declspec(dllimport) extern long _crtAssertBusy;
-
-
-
-__declspec(dllimport) _CRT_REPORT_HOOK __cdecl _CrtGetReportHook(
-    void
-    );
-
-
-
-
-
-
-
-__declspec(dllimport) _CRT_REPORT_HOOK __cdecl _CrtSetReportHook(
-           _CRT_REPORT_HOOK _PFnNewHook
-        );
-
-__declspec(dllimport) int __cdecl _CrtSetReportHook2(
-             int _Mode,
-               _CRT_REPORT_HOOK _PFnNewHook
-        );
-
-__declspec(dllimport) int __cdecl _CrtSetReportHookW2(
-             int _Mode,
-               _CRT_REPORT_HOOKW _PFnNewHook
-        );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __cdecl _CrtSetReportMode(
-             int _ReportType,
-               int _ReportMode 
-        );
-
-__declspec(dllimport) _HFILE __cdecl _CrtSetReportFile(
-             int _ReportType,
-               _HFILE _ReportFile 
-        );
-
-__declspec(dllimport) int __cdecl _CrtDbgReport(
-             int _ReportType,
-                 const char * _Filename,
-             int _Linenumber,
-                 const char * _ModuleName,
-                 const char * _Format,
-        ...);
-
-__declspec(dllimport) size_t __cdecl _CrtSetDebugFillThreshold(
-             size_t _NewDebugFillThreshold
-        );
-
-
-
-
-__declspec(dllimport) int __cdecl _CrtDbgReportW(
-             int _ReportType,
-                 const wchar_t * _Filename,
-             int _LineNumber,
-                 const wchar_t * _ModuleName,
-                 const wchar_t * _Format,
-        ...);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern long _crtBreakAlloc;      
-
-
-__declspec(dllimport) long __cdecl _CrtSetBreakAlloc(
-             long _BreakAlloc 
-        );
-
-
-
-
-
-__declspec(dllimport)      void * __cdecl _malloc_dbg(
-             size_t _Size,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _calloc_dbg(
-             size_t _NumOfElements,
-             size_t _SizeOfElements,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _realloc_dbg(
-               void * _Memory,
-             size_t _NewSize,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _recalloc_dbg
-(
-               void * _Memory,
-             size_t _NumOfElements,
-             size_t _SizeOfElements,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-);
-
-__declspec(dllimport)      void * __cdecl _expand_dbg(
-               void * _Memory,
-             size_t _NewSize,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport) void __cdecl _free_dbg(
-               void * _Memory,
-             int _BlockType
-        );
-
-__declspec(dllimport) size_t __cdecl _msize_dbg (
-             void * _Memory,
-             int _BlockType
-        );
-
-__declspec(dllimport) size_t __cdecl _aligned_msize_dbg (
-             void * _Memory,
-             size_t _Alignment,
-             size_t _Offset
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_malloc_dbg(
-             size_t _Size,
-             size_t _Alignment,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_realloc_dbg(
-               void * _Memory,
-             size_t _Size,
-             size_t _Alignment,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_recalloc_dbg
-(
-               void * _Memory,
-             size_t _NumOfElements,
-             size_t _SizeOfElements,
-             size_t _Alignment,
-                 const char * _Filename,
-             int _LineNumber
-);
-
-__declspec(dllimport)      void * __cdecl _aligned_offset_malloc_dbg(
-             size_t _Size,
-             size_t _Alignment,
-             size_t _Offset,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_offset_realloc_dbg(
-               void * _Memory,
-             size_t _Size,
-             size_t _Alignment,
-             size_t _Offset,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_offset_recalloc_dbg
-(
-               void * _Memory,
-             size_t _NumOfElements,
-             size_t _SizeOfElements,
-             size_t _Alignment,
-             size_t _Offset,
-                 const char * _Filename,
-             int _LineNumber
-);
-
-__declspec(dllimport) void __cdecl _aligned_free_dbg(
-               void * _Memory
-        );
-
-__declspec(dllimport)         char * __cdecl _strdup_dbg(
-                 const char * _Str,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wcsdup_dbg(
-                 const wchar_t * _Str,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         char * __cdecl _tempnam_dbg(
-                 const char * _DirName,
-                 const char * _FilePrefix,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wtempnam_dbg(
-                 const wchar_t * _DirName,
-                 const wchar_t * _FilePrefix,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         char * __cdecl _fullpath_dbg(
-                 char * _FullPath, 
-               const char * _Path, 
-             size_t _SizeInBytes,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wfullpath_dbg(
-                 wchar_t * _FullPath, 
-               const wchar_t * _Path, 
-             size_t _SizeInWords,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         char * __cdecl _getcwd_dbg(
-                 char * _DstBuf,
-             int _SizeInBytes,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wgetcwd_dbg(
-                 wchar_t * _DstBuf,
-             int _SizeInWords,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         char * __cdecl _getdcwd_dbg(
-             int _Drive,
-                 char * _DstBuf,
-             int _SizeInBytes,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wgetdcwd_dbg(
-             int _Drive,
-                 wchar_t * _DstBuf,
-             int _SizeInWords,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-        char * __cdecl _getdcwd_lk_dbg(
-             int _Drive,
-                 char * _DstBuf,
-             int _SizeInBytes,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-        wchar_t * __cdecl _wgetdcwd_lk_dbg(
-             int _Drive,
-                 wchar_t * _DstBuf,
-             int _SizeInWords,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)  errno_t __cdecl _dupenv_s_dbg(
-                             char ** _PBuffer,
-               size_t * _PBufferSizeInBytes,
-               const char * _VarName,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)  errno_t __cdecl _wdupenv_s_dbg(
-                             wchar_t ** _PBuffer,
-               size_t * _PBufferSizeInWords,
-               const wchar_t * _VarName,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-__declspec(dllimport) _CRT_ALLOC_HOOK __cdecl _CrtGetAllocHook
-(
-    void
-);
-
-
-
-
-
-
-
-__declspec(dllimport) _CRT_ALLOC_HOOK __cdecl _CrtSetAllocHook
-(
-           _CRT_ALLOC_HOOK _PfnNewHook
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern int _crtDbgFlag;
-
-
-__declspec(dllimport) int __cdecl _CrtCheckMemory(
-        void
-        );
-
-__declspec(dllimport) int __cdecl _CrtSetDbgFlag(
-             int _NewFlag
-        );
-
-__declspec(dllimport) void __cdecl _CrtDoForAllClientObjects(
-             void (__cdecl *_PFn)(void *, void *),
-        void * _Context
-        );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _CrtIsValidPointer(
-               const void * _Ptr,
-             unsigned int _Bytes,
-             int _ReadWrite
-        );
-
-__declspec(dllimport)  int __cdecl _CrtIsValidHeapPointer(
-               const void * _HeapPtr
-        );
-
-__declspec(dllimport) int __cdecl _CrtIsMemoryBlock(
-               const void * _Memory,
-             unsigned int _Bytes,
-               long * _RequestNumber,
-               char ** _Filename,
-               int * _LineNumber
-        );
-
-__declspec(dllimport)  int __cdecl _CrtReportBlockType(
-               const void * _Memory
-        );
-
-
- 
-
-
-
-
-
-
-__declspec(dllimport) _CRT_DUMP_CLIENT __cdecl _CrtGetDumpClient
-(
-    void
-);
-
-
-
-
-
-
-
-__declspec(dllimport) _CRT_DUMP_CLIENT __cdecl _CrtSetDumpClient
-(
-           _CRT_DUMP_CLIENT _PFnNewDump
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  void __cdecl _CrtMemCheckpoint(
-             _CrtMemState * _State
-        );
-
-__declspec(dllimport)  int __cdecl _CrtMemDifference(
-             _CrtMemState * _State,
-             const _CrtMemState * _OldState,
-             const _CrtMemState * _NewState
-        );
-
-__declspec(dllimport) void __cdecl _CrtMemDumpAllObjectsSince(
-               const _CrtMemState * _State
-        );
-
-__declspec(dllimport) void __cdecl _CrtMemDumpStatistics(
-             const _CrtMemState * _State
-        );
-
-__declspec(dllimport) int __cdecl _CrtDumpMemoryLeaks(
-        void
-        );
-
-__declspec(dllimport) int __cdecl _CrtSetCheckCount(
-             int _CheckCount
-        );
-
-__declspec(dllimport) int __cdecl _CrtGetCheckCount(
-        void
-        );
-
-
-
-
-}
-
-
-
-extern "C++" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
- 
-  void * __cdecl operator new[](size_t _Size);
-
-  void * __cdecl operator new(
-        size_t _Size,
-        int,
-        const char *,
-        int
-        );
-
-  void * __cdecl operator new[](
-        size_t _Size,
-        int,
-        const char *,
-        int
-        );
-
-
-void __cdecl operator delete[](void *);
-
-inline void __cdecl operator delete(void * _P, int, const char *, int)
-        { ::operator delete(_P); }
-
-inline void __cdecl operator delete[](void * _P, int, const char *, int)
-        { ::operator delete[](_P); }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4514)
-
-#pragma warning(disable:4103)
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4001)
-#pragma warning(disable:4201)
-#pragma warning(disable:4214)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-typedef enum _EXCEPTION_DISPOSITION {
-    ExceptionContinueExecution,
-    ExceptionContinueSearch,
-    ExceptionNestedException,
-    ExceptionCollidedUnwind
-} EXCEPTION_DISPOSITION;
-
-
-
-
-
-
-
-
-
-
-
-struct _EXCEPTION_RECORD;
-struct _CONTEXT;
-
-EXCEPTION_DISPOSITION __cdecl _except_handler (
-         struct _EXCEPTION_RECORD *_ExceptionRecord,
-         void * _EstablisherFrame,
-         struct _CONTEXT *_ContextRecord,
-         void * _DispatcherContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-unsigned long __cdecl _exception_code(void);
-void *        __cdecl _exception_info(void);
-int           __cdecl _abnormal_termination(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long ULONG;
-typedef ULONG *PULONG;
-typedef unsigned short USHORT;
-typedef USHORT *PUSHORT;
-typedef unsigned char UCHAR;
-typedef UCHAR *PUCHAR;
-typedef char *PSZ;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long       DWORD;
-typedef int                 BOOL;
-typedef unsigned char       BYTE;
-typedef unsigned short      WORD;
-typedef float               FLOAT;
-typedef FLOAT               *PFLOAT;
-typedef BOOL            *PBOOL;
-typedef BOOL             *LPBOOL;
-typedef BYTE            *PBYTE;
-typedef BYTE             *LPBYTE;
-typedef int             *PINT;
-typedef int              *LPINT;
-typedef WORD            *PWORD;
-typedef WORD             *LPWORD;
-typedef long             *LPLONG;
-typedef DWORD           *PDWORD;
-typedef DWORD            *LPDWORD;
-typedef void             *LPVOID;
-typedef const void       *LPCVOID;
-
-typedef int                 INT;
-typedef unsigned int        UINT;
-typedef unsigned int        *PUINT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) const unsigned short * __cdecl __pctype_func(void);
-
-__declspec(dllimport) extern const unsigned short *_pctype;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern const unsigned short _wctype[];
-
-
-__declspec(dllimport) const wctype_t * __cdecl __pwctype_func(void);
-
-__declspec(dllimport) extern const wctype_t *_pwctype;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _isctype(     int _C,      int _Type);
-__declspec(dllimport)  int __cdecl _isctype_l(     int _C,      int _Type,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isalpha(     int _C);
-__declspec(dllimport)  int __cdecl _isalpha_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isupper(     int _C);
-__declspec(dllimport)  int __cdecl _isupper_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl islower(     int _C);
-__declspec(dllimport)  int __cdecl _islower_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isdigit(     int _C);
-__declspec(dllimport)  int __cdecl _isdigit_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl isxdigit(     int _C);
-__declspec(dllimport)  int __cdecl _isxdigit_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isspace(     int _C);
-__declspec(dllimport)  int __cdecl _isspace_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl ispunct(     int _C);
-__declspec(dllimport)  int __cdecl _ispunct_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isalnum(     int _C);
-__declspec(dllimport)  int __cdecl _isalnum_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl isprint(     int _C);
-__declspec(dllimport)  int __cdecl _isprint_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl isgraph(     int _C);
-__declspec(dllimport)  int __cdecl _isgraph_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iscntrl(     int _C);
-__declspec(dllimport)  int __cdecl _iscntrl_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl toupper(     int _C);
- __declspec(dllimport)  int __cdecl tolower(     int _C);
- __declspec(dllimport)  int __cdecl _tolower(     int _C);
-__declspec(dllimport)  int __cdecl _tolower_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl _toupper(     int _C);
-__declspec(dllimport)  int __cdecl _toupper_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl __isascii(     int _C);
-__declspec(dllimport)  int __cdecl __toascii(     int _C);
-__declspec(dllimport)  int __cdecl __iscsymf(     int _C);
-__declspec(dllimport)  int __cdecl __iscsym(     int _C);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl iswalpha(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswalpha_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswupper(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswupper_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswlower(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswlower_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswdigit(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswdigit_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswxdigit(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswxdigit_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswspace(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswspace_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswpunct(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswpunct_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswalnum(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswalnum_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswprint(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswprint_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswgraph(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswgraph_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswcntrl(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswcntrl_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswascii(     wint_t _C);
-__declspec(dllimport)  int __cdecl isleadbyte(     int _C);
-__declspec(dllimport)  int __cdecl _isleadbyte_l(     int _C,        _locale_t _Locale);
-
-__declspec(dllimport)  wint_t __cdecl towupper(     wint_t _C);
-__declspec(dllimport)  wint_t __cdecl _towupper_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  wint_t __cdecl towlower(     wint_t _C);
-__declspec(dllimport)  wint_t __cdecl _towlower_l(     wint_t _C,        _locale_t _Locale); 
-__declspec(dllimport)  int __cdecl iswctype(     wint_t _C,      wctype_t _Type);
-__declspec(dllimport)  int __cdecl _iswctype_l(     wint_t _C,      wctype_t _Type,        _locale_t _Locale);
-
-__declspec(dllimport)  int __cdecl __iswcsymf(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswcsymf_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl __iswcsym(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswcsym_l(     wint_t _C,        _locale_t _Locale);
-
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "iswctype" " instead. See online help for details.")) __declspec(dllimport) int __cdecl is_wctype(     wint_t _C,      wctype_t _Type);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __cdecl _chvalidator(     int _Ch,      int _Mask);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-int __cdecl _chvalidator_l(       _locale_t,      int _Ch,      int _Mask);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long POINTER_64_INT;
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-typedef signed char         INT8, *PINT8;
-typedef signed short        INT16, *PINT16;
-typedef signed int          INT32, *PINT32;
-typedef signed __int64      INT64, *PINT64;
-typedef unsigned char       UINT8, *PUINT8;
-typedef unsigned short      UINT16, *PUINT16;
-typedef unsigned int        UINT32, *PUINT32;
-typedef unsigned __int64    UINT64, *PUINT64;
-
-
-
-
-
-typedef signed int LONG32, *PLONG32;
-
-
-
-
-
-typedef unsigned int ULONG32, *PULONG32;
-typedef unsigned int DWORD32, *PDWORD32;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    typedef __w64 int INT_PTR, *PINT_PTR;
-    typedef __w64 unsigned int UINT_PTR, *PUINT_PTR;
-
-    typedef __w64 long LONG_PTR, *PLONG_PTR;
-    typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR;
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned short UHALF_PTR, *PUHALF_PTR;
-typedef short HALF_PTR, *PHALF_PTR;
-typedef __w64 long SHANDLE_PTR;
-typedef __w64 unsigned long HANDLE_PTR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline
-void * __ptr64
-PtrToPtr64(
-    const void *p
-    )
-{
-    return((void * __ptr64) (unsigned __int64) (ULONG_PTR)p );
-}
-
-__inline
-void *
-Ptr64ToPtr(
-    const void * __ptr64 p
-    )
-{
-    return((void *) (ULONG_PTR) (unsigned __int64) p);
-}
-
-__inline
-void * __ptr64
-HandleToHandle64(
-    const void *h
-    )
-{
-    return((void * __ptr64) h );
-}
-
-__inline
-void *
-Handle64ToHandle(
-    const void * __ptr64 h
-    )
-{
-    return((void *) (ULONG_PTR) (unsigned __int64) h );
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ULONG_PTR SIZE_T, *PSIZE_T;
-typedef LONG_PTR SSIZE_T, *PSSIZE_T;
-
-
-
-
-
-typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
-
-
-
-
-
-typedef __int64 LONG64, *PLONG64;
-
-
-
-
-
-
-typedef unsigned __int64 ULONG64, *PULONG64;
-typedef unsigned __int64 DWORD64, *PDWORD64;
-
-
-
-
-
-typedef ULONG_PTR KAFFINITY;
-typedef KAFFINITY *PKAFFINITY;
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void *PVOID;
-typedef void * __ptr64 PVOID64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef char CHAR;
-typedef short SHORT;
-typedef long LONG;
-
-
-
-
-
-
-
-typedef wchar_t WCHAR;    
-
-
-
-
-
-typedef WCHAR *PWCHAR, *LPWCH, *PWCH;
-typedef const WCHAR *LPCWCH, *PCWCH;
-typedef  WCHAR *NWPSTR, *LPWSTR, *PWSTR;
-typedef  PWSTR *PZPWSTR;
-typedef  const PWSTR *PCZPWSTR;
-typedef  WCHAR  *LPUWSTR, *PUWSTR;
-typedef  const WCHAR *LPCWSTR, *PCWSTR;
-typedef  PCWSTR *PZPCWSTR;
-typedef  const WCHAR  *LPCUWSTR, *PCUWSTR;
-
-
-
-
-typedef CHAR *PCHAR, *LPCH, *PCH;
-typedef const CHAR *LPCCH, *PCCH;
-
-typedef  CHAR *NPSTR, *LPSTR, *PSTR;
-typedef  PSTR *PZPSTR;
-typedef  const PSTR *PCZPSTR;
-typedef  const CHAR *LPCSTR, *PCSTR;
-typedef  PCSTR *PZPCSTR;
-
-
-
-
-
-
-
-typedef WCHAR TCHAR, *PTCHAR;
-typedef WCHAR TBYTE , *PTBYTE ;
-
-
-
-typedef LPWSTR LPTCH, PTCH;
-typedef LPWSTR PTSTR, LPTSTR;
-typedef LPCWSTR PCTSTR, LPCTSTR;
-typedef LPUWSTR PUTSTR, LPUTSTR;
-typedef LPCUWSTR PCUTSTR, LPCUTSTR;
-typedef LPWSTR LP;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef SHORT *PSHORT;  
-typedef LONG *PLONG;    
-
-
-typedef void *HANDLE;
-
-
-
-
-
-typedef HANDLE *PHANDLE;
-
-
-
-
-
-typedef BYTE   FCHAR;
-typedef WORD   FSHORT;
-typedef DWORD  FLONG;
-
-
-
-
-
-typedef LONG HRESULT;
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef char CCHAR;          
-typedef DWORD LCID;         
-typedef PDWORD PLCID;       
-typedef WORD   LANGID;      
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FLOAT128 {
-    __int64 LowPart;
-    __int64 HighPart;
-} FLOAT128;
-
-typedef FLOAT128 *PFLOAT128;
-
-
-
-
-
-
-
-
-
-typedef __int64 LONGLONG;
-typedef unsigned __int64 ULONGLONG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LONGLONG *PLONGLONG;
-typedef ULONGLONG *PULONGLONG;
-
-
-
-typedef LONGLONG USN;
-
-
-
-
-typedef union _LARGE_INTEGER {
-    struct {
-        DWORD LowPart;
-        LONG HighPart;
-    };
-    struct {
-        DWORD LowPart;
-        LONG HighPart;
-    } u;
-
-    LONGLONG QuadPart;
-} LARGE_INTEGER;
-
-typedef LARGE_INTEGER *PLARGE_INTEGER;
-
-
-
-
-typedef union _ULARGE_INTEGER {
-    struct {
-        DWORD LowPart;
-        DWORD HighPart;
-    };
-    struct {
-        DWORD LowPart;
-        DWORD HighPart;
-    } u;
-
-    ULONGLONG QuadPart;
-} ULARGE_INTEGER;
-
-typedef ULARGE_INTEGER *PULARGE_INTEGER;
-
-
-
-
-
-
-
-
-typedef struct _LUID {
-    DWORD LowPart;
-    LONG HighPart;
-} LUID, *PLUID;
-
-
-typedef ULONGLONG  DWORDLONG;
-typedef DWORDLONG *PDWORDLONG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ULONGLONG
-__stdcall
-Int64ShllMod32 (
-    ULONGLONG Value,
-    DWORD ShiftCount
-    );
-
-LONGLONG
-__stdcall
-Int64ShraMod32 (
-    LONGLONG Value,
-    DWORD ShiftCount
-    );
-
-ULONGLONG
-__stdcall
-Int64ShrlMod32 (
-    ULONGLONG Value,
-    DWORD ShiftCount
-    );
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4035 4793)               
-
-__inline ULONGLONG
-__stdcall
-Int64ShllMod32 (
-    ULONGLONG Value,
-    DWORD ShiftCount
-    )
-{
-    __asm    {
-        mov     ecx, ShiftCount
-        mov     eax, dword ptr [Value]
-        mov     edx, dword ptr [Value+4]
-        shld    edx, eax, cl
-        shl     eax, cl
-    }
-}
-
-__inline LONGLONG
-__stdcall
-Int64ShraMod32 (
-    LONGLONG Value,
-    DWORD ShiftCount
-    )
-{
-    __asm {
-        mov     ecx, ShiftCount
-        mov     eax, dword ptr [Value]
-        mov     edx, dword ptr [Value+4]
-        shrd    eax, edx, cl
-        sar     edx, cl
-    }
-}
-
-__inline ULONGLONG
-__stdcall
-Int64ShrlMod32 (
-    ULONGLONG Value,
-    DWORD ShiftCount
-    )
-{
-    __asm    {
-        mov     ecx, ShiftCount
-        mov     eax, dword ptr [Value]
-        mov     edx, dword ptr [Value+4]
-        shrd    eax, edx, cl
-        shr     edx, cl
-    }
-}
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-unsigned int
-__cdecl
-_rotl (
-     unsigned int Value,
-     int Shift
-    );
-
-unsigned __int64
-__cdecl
-_rotl64 (
-     unsigned __int64 Value,
-     int Shift
-    );
-
-unsigned int
-__cdecl
-_rotr (
-     unsigned int Value,
-     int Shift
-    );
-
-unsigned __int64
-__cdecl
-_rotr64 (
-     unsigned __int64 Value,
-     int Shift
-    );
-
-#pragma intrinsic(_rotl)
-#pragma intrinsic(_rotl64)
-#pragma intrinsic(_rotr)
-#pragma intrinsic(_rotr64)
-
-
-
-
-}
-
-
-
-
-
-
-typedef BYTE  BOOLEAN;           
-typedef BOOLEAN *PBOOLEAN;       
-
-
-
-
-
-typedef struct _LIST_ENTRY {
-   struct _LIST_ENTRY *Flink;
-   struct _LIST_ENTRY *Blink;
-} LIST_ENTRY, *PLIST_ENTRY, * PRLIST_ENTRY;
-
-
-
-
-
-
-typedef struct _SINGLE_LIST_ENTRY {
-    struct _SINGLE_LIST_ENTRY *Next;
-} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
-
-
-
-
-
-typedef struct LIST_ENTRY32 {
-    DWORD Flink;
-    DWORD Blink;
-} LIST_ENTRY32;
-typedef LIST_ENTRY32 *PLIST_ENTRY32;
-
-typedef struct LIST_ENTRY64 {
-    ULONGLONG Flink;
-    ULONGLONG Blink;
-} LIST_ENTRY64;
-typedef LIST_ENTRY64 *PLIST_ENTRY64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _GUID {
-    unsigned long  Data1;
-    unsigned short Data2;
-    unsigned short Data3;
-    unsigned char  Data4[ 8 ];
-} GUID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef GUID *LPGUID;
-
-
-
-
-typedef const GUID *LPCGUID;
-
-
-
-
-
-typedef GUID IID;
-typedef IID *LPIID;
-
-
-typedef GUID CLSID;
-typedef CLSID *LPCLSID;
-
-
-typedef GUID FMTID;
-typedef FMTID *LPFMTID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) void *  __cdecl _memccpy(        void * _Dst,      const void * _Src,      int _Val,      size_t _MaxCount);
-__declspec(dllimport)  const void *  __cdecl memchr(          const void * _Buf ,      int _Val,      size_t _MaxCount);
-__declspec(dllimport)  int     __cdecl _memicmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);
-__declspec(dllimport)  int     __cdecl _memicmp_l(         const void * _Buf1,          const void * _Buf2,      size_t _Size,        _locale_t _Locale);
-         int     __cdecl memcmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);
-         void *  __cdecl memcpy(         void * _Dst,          const void * _Src,      size_t _Size);
-
-__declspec(dllimport) errno_t  __cdecl memcpy_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
-
-        void *  __cdecl memset(         void * _Dst,      int _Val,      size_t _Size);
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_memccpy" ". See online help for details.")) __declspec(dllimport) void * __cdecl memccpy(       void * _Dst,          const void * _Src,      int _Val,      size_t _Size);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_memicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl memicmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _strset_s(           char * _Dst,      size_t _DstSize,      int _Value);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strset_s(           char (&_Dest)[_Size],      int _Value) { return _strset_s(_Dest, _Size, _Value); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _strset( char *_Dest,  int _Value);
-
-__declspec(dllimport)  errno_t __cdecl strcpy_s(       char * _Dst,      rsize_t _DstSize,        const char * _Src);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strcpy_s(       char (&_Dest)[_Size],        const char * _Source) { return strcpy_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strcpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl strcpy( char *_Dest,  const char * _Source);
-
-__declspec(dllimport)  errno_t __cdecl strcat_s(           char * _Dst,      rsize_t _DstSize,        const char * _Src);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strcat_s(           char (&_Dest)[_Size],        const char * _Source) { return strcat_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strcat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl strcat( char *_Dest,  const char * _Source);
-         int     __cdecl strcmp(       const char * _Str1,        const char * _Str2);
-         size_t  __cdecl strlen(       const char * _Str);
-__declspec(dllimport)  size_t  __cdecl strnlen(       const char * _Str,      size_t _MaxCount);
-
-static __inline  size_t  __cdecl strnlen_s(        const char * _Str,      size_t _MaxCount)
-{
-    return strnlen(_Str, _MaxCount);
-}
-
-
-__declspec(dllimport)  errno_t __cdecl memmove_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
-
-
-
-
-
-__declspec(dllimport)  void *  __cdecl memmove(         void * _Dst,          const void * _Src,      size_t _Size);
-
-
-
-
-
-
-
-__declspec(dllimport)  char *  __cdecl _strdup(         const char * _Src);
-
-
-
-
-
-__declspec(dllimport)  const char *  __cdecl strchr(       const char * _Str,      int _Val);
-__declspec(dllimport)  int     __cdecl _stricmp(        const char * _Str1,         const char * _Str2);
-__declspec(dllimport)  int     __cdecl _strcmpi(        const char * _Str1,         const char * _Str2);
-__declspec(dllimport)  int     __cdecl _stricmp_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int     __cdecl strcoll(        const char * _Str1,         const  char * _Str2);
-__declspec(dllimport)  int     __cdecl _strcoll_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int     __cdecl _stricoll(        const char * _Str1,         const char * _Str2);
-__declspec(dllimport)  int     __cdecl _stricoll_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int     __cdecl _strncoll  (       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int     __cdecl _strncoll_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int     __cdecl _strnicoll (       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int     __cdecl _strnicoll_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  size_t  __cdecl strcspn(        const char * _Str,         const char * _Control);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strerror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl _strerror(         const char * _ErrMsg);
-__declspec(dllimport)  errno_t __cdecl _strerror_s(       char * _Buf,      size_t _SizeInBytes,          const char * _ErrMsg);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strerror_s(     char (&_Buffer)[_Size],          const char * _ErrorMessage) { return _strerror_s(_Buffer, _Size, _ErrorMessage); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl strerror(     int);
-
-__declspec(dllimport)  errno_t __cdecl strerror_s(       char * _Buf,      size_t _SizeInBytes,      int _ErrNum);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strerror_s(     char (&_Buffer)[_Size],      int _ErrorMessage) { return strerror_s(_Buffer, _Size, _ErrorMessage); } }
-__declspec(dllimport)  errno_t __cdecl _strlwr_s(           char * _Str,      size_t _Size);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strlwr_s(           char (&_String)[_Size]) { return _strlwr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strlwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strlwr( char *_String);
-__declspec(dllimport)  errno_t __cdecl _strlwr_s_l(           char * _Str,      size_t _Size,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strlwr_s_l(           char (&_String)[_Size],        _locale_t _Locale) { return _strlwr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strlwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strlwr_l(         char *_String,        _locale_t _Locale);
-
-__declspec(dllimport)  errno_t __cdecl strncat_s(           char * _Dst,      rsize_t _DstSize,        const char * _Src,      rsize_t _MaxCount);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strncat_s(           char (&_Dest)[_Size],        const char * _Source,      size_t _Count) { return strncat_s(_Dest, _Size, _Source, _Count); } }
-#pragma warning(push)
-#pragma warning(disable:6059)
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl strncat(           char *_Dest,        const char * _Source,      size_t _Count);
-#pragma warning(pop)
-
-
-
-__declspec(dllimport)  int     __cdecl strncmp(       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
-
-__declspec(dllimport)  int     __cdecl _strnicmp(       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int     __cdecl _strnicmp_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-
-__declspec(dllimport)  errno_t __cdecl strncpy_s(       char * _Dst,      rsize_t _DstSize,          const char * _Src,      rsize_t _MaxCount);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strncpy_s(     char (&_Dest)[_Size],        const char * _Source,      size_t _Count) { return strncpy_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl strncpy(     char *_Dest,        const char * _Source,      size_t _Count);
-__declspec(dllimport)  errno_t __cdecl _strnset_s(           char * _Str,      size_t _Size,      int _Val,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strnset_s(           char (&_Dest)[_Size],      int _Val,      size_t _Count) { return _strnset_s(_Dest, _Size, _Val, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strnset(           char *_Dest,      int _Val,      size_t _Count);
-__declspec(dllimport)  const char *  __cdecl strpbrk(       const char * _Str,        const char * _Control);
-__declspec(dllimport)  const char *  __cdecl strrchr(       const char * _Str,      int _Ch);
-__declspec(dllimport) char *  __cdecl _strrev(         char * _Str);
-__declspec(dllimport)  size_t  __cdecl strspn(       const char * _Str,        const char * _Control);
-__declspec(dllimport)  const char *  __cdecl strstr(       const char * _Str,        const char * _SubStr);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strtok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl strtok(           char * _Str,        const char * _Delim);
-
-__declspec(dllimport)  char *  __cdecl strtok_s(           char * _Str,        const char * _Delim,                        char ** _Context);
-
-__declspec(dllimport)  errno_t __cdecl _strupr_s(           char * _Str,      size_t _Size);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strupr_s(           char (&_String)[_Size]) { return _strupr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strupr( char *_String);
-__declspec(dllimport)  errno_t __cdecl _strupr_s_l(           char * _Str,      size_t _Size, _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strupr_s_l(           char (&_String)[_Size], _locale_t _Locale) { return _strupr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strupr_l(         char *_String,        _locale_t _Locale);
-__declspec(dllimport)  size_t  __cdecl strxfrm (         char * _Dst,        const char * _Src,      size_t _MaxCount);
-__declspec(dllimport)  size_t  __cdecl _strxfrm_l(         char * _Dst,        const char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-
-
-extern "C++" {
-
-
-inline  char * __cdecl strchr(       char * _Str,      int _Ch)
-	{ return (char*)strchr((const char*)_Str, _Ch); }
-inline  char * __cdecl strpbrk(       char * _Str,        const char * _Control)
-	{ return (char*)strpbrk((const char*)_Str, _Control); }
-inline  char * __cdecl strrchr(       char * _Str,      int _Ch)
-	{ return (char*)strrchr((const char*)_Str, _Ch); }
-inline  char * __cdecl strstr(       char * _Str,        const char * _SubStr)
-	{ return (char*)strstr((const char*)_Str, _SubStr); }
-
-
-
-inline  void * __cdecl memchr(         void * _Pv,      int _C,      size_t _N)
-	{ return (void*)memchr((const void*)_Pv, _C, _N); }
-
-}
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strdup" ". See online help for details.")) __declspec(dllimport)  char * __cdecl strdup(         const char * _Src);
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strcmpi" ". See online help for details.")) __declspec(dllimport)  int __cdecl strcmpi(       const char * _Str1,        const char * _Str2);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_stricmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl stricmp(       const char * _Str1,        const char * _Str2);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strlwr" ". See online help for details.")) __declspec(dllimport) char * __cdecl strlwr(         char * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strnicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl strnicmp(       const char * _Str1,        const char * _Str,      size_t _MaxCount);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strnset" ". See online help for details.")) __declspec(dllimport) char * __cdecl strnset(           char * _Str,      int _Val,      size_t _MaxCount);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strrev" ". See online help for details.")) __declspec(dllimport) char * __cdecl strrev(         char * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strset" ". See online help for details."))         char * __cdecl strset(         char * _Str,      int _Val);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strupr" ". See online help for details.")) __declspec(dllimport) char * __cdecl strupr(         char * _Str);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  wchar_t * __cdecl _wcsdup(       const wchar_t * _Str);
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl wcscat_s(           wchar_t * _Dst,      rsize_t _DstSize, const wchar_t * _Src);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcscat_s(           wchar_t (&_Dest)[_Size],        const wchar_t * _Source) { return wcscat_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcscat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcscat( wchar_t *_Dest,  const wchar_t * _Source);
-__declspec(dllimport)  const wchar_t * __cdecl wcschr(       const wchar_t * _Str, wchar_t _Ch);
-__declspec(dllimport)  int __cdecl wcscmp(       const wchar_t * _Str1,        const wchar_t * _Str2);
-
-__declspec(dllimport)  errno_t __cdecl wcscpy_s(       wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcscpy_s(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source) { return wcscpy_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcscpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcscpy( wchar_t *_Dest,  const wchar_t * _Source);
-__declspec(dllimport)  size_t __cdecl wcscspn(       const wchar_t * _Str,        const wchar_t * _Control);
-__declspec(dllimport)  size_t __cdecl wcslen(       const wchar_t * _Str);
-__declspec(dllimport)  size_t __cdecl wcsnlen(       const wchar_t * _Src,      size_t _MaxCount);
-
-static __inline  size_t __cdecl wcsnlen_s(       const wchar_t * _Src,      size_t _MaxCount)
-{
-    return wcsnlen(_Src, _MaxCount);
-}
-
-
-__declspec(dllimport)  errno_t __cdecl wcsncat_s(           wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src,      rsize_t _MaxCount);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsncat_s(           wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count) { return wcsncat_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsncat(     wchar_t *_Dest,        const wchar_t * _Source,      size_t _Count);
-__declspec(dllimport)  int __cdecl wcsncmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-
-__declspec(dllimport)  errno_t __cdecl wcsncpy_s(       wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src,      rsize_t _MaxCount);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsncpy_s(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count) { return wcsncpy_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsncpy(     wchar_t *_Dest,        const wchar_t * _Source,      size_t _Count);
-__declspec(dllimport)  const wchar_t * __cdecl wcspbrk(       const wchar_t * _Str,        const wchar_t * _Control);
-__declspec(dllimport)  const wchar_t * __cdecl wcsrchr(       const wchar_t * _Str,      wchar_t _Ch);
-__declspec(dllimport)  size_t __cdecl wcsspn(       const wchar_t * _Str,        const wchar_t * _Control);
-__declspec(dllimport)  const wchar_t * __cdecl wcsstr(       const wchar_t * _Str,        const wchar_t * _SubStr);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcstok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl wcstok(           wchar_t * _Str,        const wchar_t * _Delim);
-__declspec(dllimport)  wchar_t * __cdecl wcstok_s(           wchar_t * _Str,        const wchar_t * _Delim,                        wchar_t ** _Context);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcserror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl _wcserror(     int _ErrNum);
-__declspec(dllimport)  errno_t __cdecl _wcserror_s(         wchar_t * _Buf,      size_t _SizeInWords,      int _ErrNum);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcserror_s(     wchar_t (&_Buffer)[_Size],      int _Error) { return _wcserror_s(_Buffer, _Size, _Error); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "__wcserror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl __wcserror(         const wchar_t * _Str);
-__declspec(dllimport)  errno_t __cdecl __wcserror_s(         wchar_t * _Buffer,      size_t _SizeInWords,        const wchar_t * _ErrMsg);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl __wcserror_s(     wchar_t (&_Buffer)[_Size],        const wchar_t * _ErrorMessage) { return __wcserror_s(_Buffer, _Size, _ErrorMessage); } }
-
-__declspec(dllimport)  int __cdecl _wcsicmp(       const wchar_t * _Str1,        const wchar_t * _Str2);
-__declspec(dllimport)  int __cdecl _wcsicmp_l(       const wchar_t * _Str1,        const wchar_t * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wcsnicmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _wcsnicmp_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  errno_t __cdecl _wcsnset_s(           wchar_t * _Dst,      size_t _DstSizeInWords, wchar_t _Val,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsnset_s(           wchar_t (&_Dst)[_Size], wchar_t _Val,      size_t _MaxCount) { return _wcsnset_s(_Dst, _Size, _Val, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsnset(           wchar_t *_Str, wchar_t _Val,      size_t _MaxCount);
-__declspec(dllimport) wchar_t * __cdecl _wcsrev(         wchar_t * _Str);
-__declspec(dllimport)  errno_t __cdecl _wcsset_s(           wchar_t * _Str,      size_t _SizeInWords, wchar_t _Val);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsset_s(           wchar_t (&_Str)[_Size], wchar_t _Val) { return _wcsset_s(_Str, _Size, _Val); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsset(         wchar_t *_Str, wchar_t _Val);
-
-__declspec(dllimport)  errno_t __cdecl _wcslwr_s(           wchar_t * _Str,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcslwr_s(           wchar_t (&_String)[_Size]) { return _wcslwr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcslwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcslwr( wchar_t *_String);
-__declspec(dllimport)  errno_t __cdecl _wcslwr_s_l(           wchar_t * _Str,      size_t _SizeInWords,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcslwr_s_l(           wchar_t (&_String)[_Size],        _locale_t _Locale) { return _wcslwr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcslwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcslwr_l(         wchar_t *_String,        _locale_t _Locale);
-__declspec(dllimport)  errno_t __cdecl _wcsupr_s(           wchar_t * _Str,      size_t _Size);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsupr_s(           wchar_t (&_String)[_Size]) { return _wcsupr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsupr( wchar_t *_String);
-__declspec(dllimport)  errno_t __cdecl _wcsupr_s_l(           wchar_t * _Str,      size_t _Size,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsupr_s_l(           wchar_t (&_String)[_Size],        _locale_t _Locale) { return _wcsupr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsupr_l(         wchar_t *_String,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl wcsxfrm(         wchar_t * _Dst,        const wchar_t * _Src,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _wcsxfrm_l(         wchar_t * _Dst,        const wchar_t *_Src,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl wcscoll(       const wchar_t * _Str1,        const wchar_t * _Str2);
-__declspec(dllimport)  int __cdecl _wcscoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wcsicoll(       const wchar_t * _Str1,        const wchar_t * _Str2);
-__declspec(dllimport)  int __cdecl _wcsicoll_l(       const wchar_t * _Str1,        const wchar_t *_Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wcsncoll(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _wcsncoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wcsnicoll(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _wcsnicoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-
-
-
-
-extern "C++" {
-inline  wchar_t * __cdecl wcschr(       wchar_t *_Str, wchar_t _Ch)
-        {return ((wchar_t *)wcschr((const wchar_t *)_Str, _Ch)); }
-inline  wchar_t * __cdecl wcspbrk(       wchar_t *_Str,        const wchar_t *_Control)
-        {return ((wchar_t *)wcspbrk((const wchar_t *)_Str, _Control)); }
-inline  wchar_t * __cdecl wcsrchr(       wchar_t *_Str,      wchar_t _Ch)
-        {return ((wchar_t *)wcsrchr((const wchar_t *)_Str, _Ch)); }
-inline  wchar_t * __cdecl wcsstr(       wchar_t *_Str,        const wchar_t *_SubStr)
-        {return ((wchar_t *)wcsstr((const wchar_t *)_Str, _SubStr)); }
-}
-
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsdup" ". See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl wcsdup(       const wchar_t * _Str);
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsicmp(       const wchar_t * _Str1,        const wchar_t * _Str2);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsnicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsnicmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsnset" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsnset(           wchar_t * _Str,        wchar_t _Val,      size_t _MaxCount);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsrev" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsrev(         wchar_t * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsset" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsset(         wchar_t * _Str, wchar_t _Val);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcslwr" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcslwr(         wchar_t * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsupr" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsupr(         wchar_t * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsicoll" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsicoll(       const wchar_t * _Str1,        const wchar_t * _Str2);
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-__inline int InlineIsEqualGUID(const GUID & rguid1, const GUID & rguid2)
-{
-   return (
-      ((unsigned long *) &rguid1)[0] == ((unsigned long *) &rguid2)[0] &&
-      ((unsigned long *) &rguid1)[1] == ((unsigned long *) &rguid2)[1] &&
-      ((unsigned long *) &rguid1)[2] == ((unsigned long *) &rguid2)[2] &&
-      ((unsigned long *) &rguid1)[3] == ((unsigned long *) &rguid2)[3]);
-}
-
-__inline int IsEqualGUID(const GUID & rguid1, const GUID & rguid2)
-{
-    return !memcmp(&rguid1, &rguid2, sizeof(GUID));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline int operator==(const GUID & guidOne, const GUID & guidOther)
-{
-    return IsEqualGUID(guidOne,guidOther);
-}
-
-__inline int operator!=(const GUID & guidOne, const GUID & guidOther)
-{
-    return !(guidOne == guidOther);
-}
-
-
-
-
-
-
-
-
-
-
-typedef struct  _OBJECTID {     
-    GUID Lineage;
-    DWORD Uniquifier;
-} OBJECTID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C++" 
-template <typename T, size_t N>
-char (*RtlpNumberOf(  T (&)[N] ))[N];
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  
-
-
-
-
-
-typedef ULONG_PTR KSPIN_LOCK;
-typedef KSPIN_LOCK *PKSPIN_LOCK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4164)   
-                                
-
-#pragma function(_enable)
-#pragma function(_disable)
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOLEAN
-_bittest (
-     LONG const *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_bittestandcomplement (
-     LONG *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_bittestandset (
-     LONG *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_bittestandreset (
-     LONG *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_interlockedbittestandset (
-     LONG *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_interlockedbittestandreset (
-     LONG *Base,
-     LONG Offset
-    );
-
-#pragma intrinsic(_bittest)
-#pragma intrinsic(_bittestandcomplement)
-#pragma intrinsic(_bittestandset)
-#pragma intrinsic(_bittestandreset)
-#pragma intrinsic(_interlockedbittestandset)
-#pragma intrinsic(_interlockedbittestandreset)
-
-
-
-
-
-
-
-
-BOOLEAN
-_BitScanForward (
-     DWORD *Index,
-     DWORD Mask
-    );
-
-BOOLEAN
-_BitScanReverse (
-     DWORD *Index,
-     DWORD Mask
-    );
-
-#pragma intrinsic(_BitScanForward)
-#pragma intrinsic(_BitScanReverse)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable:4035 4793)
-
-BOOLEAN
-__forceinline
-InterlockedBitTestAndComplement (
-     LONG *Base,
-     LONG Bit
-    )
-{
-    __asm {
-           mov eax, Bit
-           mov ecx, Base
-           lock btc [ecx], eax
-           setc al
-    };
-}
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-BYTE 
-__readfsbyte (
-     DWORD Offset
-    );
- 
-WORD  
-__readfsword (
-     DWORD Offset
-    );
- 
-DWORD
-__readfsdword (
-     DWORD Offset
-    );
- 
-void
-__writefsbyte (
-     DWORD Offset,
-     BYTE  Data
-    );
- 
-void
-__writefsword (
-     DWORD Offset,
-     WORD   Data
-    );
- 
-void
-__writefsdword (
-     DWORD Offset,
-     DWORD Data
-    );
-
-#pragma intrinsic(__readfsbyte)
-#pragma intrinsic(__readfsword)
-#pragma intrinsic(__readfsdword)
-#pragma intrinsic(__writefsbyte)
-#pragma intrinsic(__writefsword)
-#pragma intrinsic(__writefsdword)
-
-
-
-
-}
-
-
-
-
-
-
-
-#pragma warning( push )
-#pragma warning( disable : 4793 )
-__forceinline
-void
-MemoryBarrier (
-    void
-    )
-{
-    LONG Barrier;
-    __asm {
-        xchg Barrier, eax
-    }
-}
-#pragma warning( pop )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void
-__int2c (
-    void
-    );
-
-#pragma intrinsic(__int2c)
-
-
-
-
-
-
-
-
-
-
-
-
-__inline PVOID GetFiberData( void )    { return *(PVOID *) (ULONG_PTR) __readfsdword (0x10);}
-__inline PVOID GetCurrentFiber( void ) { return (PVOID) (ULONG_PTR) __readfsdword (0x10);}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FLOATING_SAVE_AREA {
-    DWORD   ControlWord;
-    DWORD   StatusWord;
-    DWORD   TagWord;
-    DWORD   ErrorOffset;
-    DWORD   ErrorSelector;
-    DWORD   DataOffset;
-    DWORD   DataSelector;
-    BYTE    RegisterArea[80];
-    DWORD   Cr0NpxState;
-} FLOATING_SAVE_AREA;
-
-typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CONTEXT {
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD ContextFlags;
-
-    
-    
-    
-    
-    
-
-    DWORD   Dr0;
-    DWORD   Dr1;
-    DWORD   Dr2;
-    DWORD   Dr3;
-    DWORD   Dr6;
-    DWORD   Dr7;
-
-    
-    
-    
-    
-
-    FLOATING_SAVE_AREA FloatSave;
-
-    
-    
-    
-    
-
-    DWORD   SegGs;
-    DWORD   SegFs;
-    DWORD   SegEs;
-    DWORD   SegDs;
-
-    
-    
-    
-    
-
-    DWORD   Edi;
-    DWORD   Esi;
-    DWORD   Ebx;
-    DWORD   Edx;
-    DWORD   Ecx;
-    DWORD   Eax;
-
-    
-    
-    
-    
-
-    DWORD   Ebp;
-    DWORD   Eip;
-    DWORD   SegCs;              
-    DWORD   EFlags;             
-    DWORD   Esp;
-    DWORD   SegSs;
-
-    
-    
-    
-    
-    
-
-    BYTE    ExtendedRegisters[512];
-
-} CONTEXT;
-
-
-
-typedef CONTEXT *PCONTEXT;
-
-
-
-
-
-
-
-
-
-typedef struct _LDT_ENTRY {
-    WORD    LimitLow;
-    WORD    BaseLow;
-    union {
-        struct {
-            BYTE    BaseMid;
-            BYTE    Flags1;     
-            BYTE    Flags2;     
-            BYTE    BaseHi;
-        } Bytes;
-        struct {
-            DWORD   BaseMid : 8;
-            DWORD   Type : 5;
-            DWORD   Dpl : 2;
-            DWORD   Pres : 1;
-            DWORD   LimitHi : 4;
-            DWORD   Sys : 1;
-            DWORD   Reserved_0 : 1;
-            DWORD   Default_Big : 1;
-            DWORD   Granularity : 1;
-            DWORD   BaseHi : 8;
-        } Bits;
-    } HighWord;
-} LDT_ENTRY, *PLDT_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _EXCEPTION_RECORD {
-    DWORD    ExceptionCode;
-    DWORD ExceptionFlags;
-    struct _EXCEPTION_RECORD *ExceptionRecord;
-    PVOID ExceptionAddress;
-    DWORD NumberParameters;
-    ULONG_PTR ExceptionInformation[15];
-    } EXCEPTION_RECORD;
-
-typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
-
-typedef struct _EXCEPTION_RECORD32 {
-    DWORD    ExceptionCode;
-    DWORD ExceptionFlags;
-    DWORD ExceptionRecord;
-    DWORD ExceptionAddress;
-    DWORD NumberParameters;
-    DWORD ExceptionInformation[15];
-} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
-
-typedef struct _EXCEPTION_RECORD64 {
-    DWORD    ExceptionCode;
-    DWORD ExceptionFlags;
-    DWORD64 ExceptionRecord;
-    DWORD64 ExceptionAddress;
-    DWORD NumberParameters;
-    DWORD __unusedAlignment;
-    DWORD64 ExceptionInformation[15];
-} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
-
-
-
-
-
-typedef struct _EXCEPTION_POINTERS {
-    PEXCEPTION_RECORD ExceptionRecord;
-    PCONTEXT ContextRecord;
-} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
-typedef PVOID PACCESS_TOKEN;            
-typedef PVOID PSECURITY_DESCRIPTOR;     
-typedef PVOID PSID;     
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD ACCESS_MASK;
-typedef ACCESS_MASK *PACCESS_MASK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _GENERIC_MAPPING {
-    ACCESS_MASK GenericRead;
-    ACCESS_MASK GenericWrite;
-    ACCESS_MASK GenericExecute;
-    ACCESS_MASK GenericAll;
-} GENERIC_MAPPING;
-typedef GENERIC_MAPPING *PGENERIC_MAPPING;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,4)
-
-
-
-
-
-
-
-
-
-typedef struct _LUID_AND_ATTRIBUTES {
-    LUID Luid;
-    DWORD Attributes;
-    } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
-typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[1];
-typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SID_IDENTIFIER_AUTHORITY {
-    BYTE  Value[6];
-} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
-
-
-
-
-
-typedef struct _SID {
-   BYTE  Revision;
-   BYTE  SubAuthorityCount;
-   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
-
-
-
-   DWORD SubAuthority[1];
-
-} SID, *PISID;
-
-
-
-
-
-
-                                                
-
-
-
-
-
-
-typedef enum _SID_NAME_USE {
-    SidTypeUser = 1,
-    SidTypeGroup,
-    SidTypeDomain,
-    SidTypeAlias,
-    SidTypeWellKnownGroup,
-    SidTypeDeletedAccount,
-    SidTypeInvalid,
-    SidTypeUnknown,
-    SidTypeComputer
-} SID_NAME_USE, *PSID_NAME_USE;
-
-typedef struct _SID_AND_ATTRIBUTES {
-    PSID Sid;
-    DWORD Attributes;
-    } SID_AND_ATTRIBUTES, * PSID_AND_ATTRIBUTES;
-
-typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[1];
-typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum {
-
-    WinNullSid                                  = 0,
-    WinWorldSid                                 = 1,
-    WinLocalSid                                 = 2,
-    WinCreatorOwnerSid                          = 3,
-    WinCreatorGroupSid                          = 4,
-    WinCreatorOwnerServerSid                    = 5,
-    WinCreatorGroupServerSid                    = 6,
-    WinNtAuthoritySid                           = 7,
-    WinDialupSid                                = 8,
-    WinNetworkSid                               = 9,
-    WinBatchSid                                 = 10,
-    WinInteractiveSid                           = 11,
-    WinServiceSid                               = 12,
-    WinAnonymousSid                             = 13,
-    WinProxySid                                 = 14,
-    WinEnterpriseControllersSid                 = 15,
-    WinSelfSid                                  = 16,
-    WinAuthenticatedUserSid                     = 17,
-    WinRestrictedCodeSid                        = 18,
-    WinTerminalServerSid                        = 19,
-    WinRemoteLogonIdSid                         = 20,
-    WinLogonIdsSid                              = 21,
-    WinLocalSystemSid                           = 22,
-    WinLocalServiceSid                          = 23,
-    WinNetworkServiceSid                        = 24,
-    WinBuiltinDomainSid                         = 25,
-    WinBuiltinAdministratorsSid                 = 26,
-    WinBuiltinUsersSid                          = 27,
-    WinBuiltinGuestsSid                         = 28,
-    WinBuiltinPowerUsersSid                     = 29,
-    WinBuiltinAccountOperatorsSid               = 30,
-    WinBuiltinSystemOperatorsSid                = 31,
-    WinBuiltinPrintOperatorsSid                 = 32,
-    WinBuiltinBackupOperatorsSid                = 33,
-    WinBuiltinReplicatorSid                     = 34,
-    WinBuiltinPreWindows2000CompatibleAccessSid = 35,
-    WinBuiltinRemoteDesktopUsersSid             = 36,
-    WinBuiltinNetworkConfigurationOperatorsSid  = 37,
-    WinAccountAdministratorSid                  = 38,
-    WinAccountGuestSid                          = 39,
-    WinAccountKrbtgtSid                         = 40,
-    WinAccountDomainAdminsSid                   = 41,
-    WinAccountDomainUsersSid                    = 42,
-    WinAccountDomainGuestsSid                   = 43,
-    WinAccountComputersSid                      = 44,
-    WinAccountControllersSid                    = 45,
-    WinAccountCertAdminsSid                     = 46,
-    WinAccountSchemaAdminsSid                   = 47,
-    WinAccountEnterpriseAdminsSid               = 48,
-    WinAccountPolicyAdminsSid                   = 49,
-    WinAccountRasAndIasServersSid               = 50,
-    WinNTLMAuthenticationSid                    = 51,
-    WinDigestAuthenticationSid                  = 52,
-    WinSChannelAuthenticationSid                = 53,
-    WinThisOrganizationSid                      = 54,
-    WinOtherOrganizationSid                     = 55,
-    WinBuiltinIncomingForestTrustBuildersSid    = 56,
-    WinBuiltinPerfMonitoringUsersSid            = 57,
-    WinBuiltinPerfLoggingUsersSid               = 58,
-    WinBuiltinAuthorizationAccessSid            = 59,
-    WinBuiltinTerminalServerLicenseServersSid   = 60,
-    WinBuiltinDCOMUsersSid                      = 61,
-
-} WELL_KNOWN_SID_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ACL {
-    BYTE  AclRevision;
-    BYTE  Sbz1;
-    WORD   AclSize;
-    WORD   AceCount;
-    WORD   Sbz2;
-} ACL;
-typedef ACL *PACL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ACE_HEADER {
-    BYTE  AceType;
-    BYTE  AceFlags;
-    WORD   AceSize;
-} ACE_HEADER;
-typedef ACE_HEADER *PACE_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ACCESS_ALLOWED_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-} ACCESS_ALLOWED_ACE;
-
-typedef ACCESS_ALLOWED_ACE *PACCESS_ALLOWED_ACE;
-
-typedef struct _ACCESS_DENIED_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-} ACCESS_DENIED_ACE;
-typedef ACCESS_DENIED_ACE *PACCESS_DENIED_ACE;
-
-typedef struct _SYSTEM_AUDIT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-} SYSTEM_AUDIT_ACE;
-typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;
-
-typedef struct _SYSTEM_ALARM_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-} SYSTEM_ALARM_ACE;
-typedef SYSTEM_ALARM_ACE *PSYSTEM_ALARM_ACE;
-
-
-
-
-typedef struct _ACCESS_ALLOWED_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-} ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;
-
-typedef struct _ACCESS_DENIED_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-} ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;
-
-typedef struct _SYSTEM_AUDIT_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-} SYSTEM_AUDIT_OBJECT_ACE, *PSYSTEM_AUDIT_OBJECT_ACE;
-
-typedef struct _SYSTEM_ALARM_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-} SYSTEM_ALARM_OBJECT_ACE, *PSYSTEM_ALARM_OBJECT_ACE;
-
-
-
-
-
-
-typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-    
-} ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;
-
-typedef struct _ACCESS_DENIED_CALLBACK_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-    
-} ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;
-
-typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-    
-} SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;
-
-typedef struct _SYSTEM_ALARM_CALLBACK_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-    
-} SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;
-
-typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-    
-} ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;
-
-typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-    
-} ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;
-
-typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-    
-} SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;
-
-typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-    
-} SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _ACL_INFORMATION_CLASS {
-    AclRevisionInformation = 1,
-    AclSizeInformation
-} ACL_INFORMATION_CLASS;
-
-
-
-
-
-
-typedef struct _ACL_REVISION_INFORMATION {
-    DWORD AclRevision;
-} ACL_REVISION_INFORMATION;
-typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;
-
-
-
-
-
-typedef struct _ACL_SIZE_INFORMATION {
-    DWORD AceCount;
-    DWORD AclBytesInUse;
-    DWORD AclBytesFree;
-} ACL_SIZE_INFORMATION;
-typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef WORD   SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
-    BYTE  Revision;
-    BYTE  Sbz1;
-    SECURITY_DESCRIPTOR_CONTROL Control;
-    DWORD Owner;
-    DWORD Group;
-    DWORD Sacl;
-    DWORD Dacl;
-    } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
-
-typedef struct _SECURITY_DESCRIPTOR {
-   BYTE  Revision;
-   BYTE  Sbz1;
-   SECURITY_DESCRIPTOR_CONTROL Control;
-   PSID Owner;
-   PSID Group;
-   PACL Sacl;
-   PACL Dacl;
-
-   } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OBJECT_TYPE_LIST {
-    WORD   Level;
-    WORD   Sbz;
-    GUID *ObjectType;
-} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _AUDIT_EVENT_TYPE {
-    AuditEventObjectAccess,
-    AuditEventDirectoryServiceAccess
-} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PRIVILEGE_SET {
-    DWORD PrivilegeCount;
-    DWORD Control;
-    LUID_AND_ATTRIBUTES Privilege[1];
-    } PRIVILEGE_SET, * PPRIVILEGE_SET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _SECURITY_IMPERSONATION_LEVEL {
-    SecurityAnonymous,
-    SecurityIdentification,
-    SecurityImpersonation,
-    SecurityDelegation
-    } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _TOKEN_TYPE {
-    TokenPrimary = 1,
-    TokenImpersonation
-    } TOKEN_TYPE;
-typedef TOKEN_TYPE *PTOKEN_TYPE;
-
-
-
-
-
-
-
-typedef enum _TOKEN_INFORMATION_CLASS {
-    TokenUser = 1,
-    TokenGroups,
-    TokenPrivileges,
-    TokenOwner,
-    TokenPrimaryGroup,
-    TokenDefaultDacl,
-    TokenSource,
-    TokenType,
-    TokenImpersonationLevel,
-    TokenStatistics,
-    TokenRestrictedSids,
-    TokenSessionId,
-    TokenGroupsAndPrivileges,
-    TokenSessionReference,
-    TokenSandBoxInert,
-    TokenAuditPolicy,
-    TokenOrigin,
-    MaxTokenInfoClass  
-} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
-
-
-
-
-
-
-typedef struct _TOKEN_USER {
-    SID_AND_ATTRIBUTES User;
-} TOKEN_USER, *PTOKEN_USER;
-
-typedef struct _TOKEN_GROUPS {
-    DWORD GroupCount;
-    SID_AND_ATTRIBUTES Groups[1];
-} TOKEN_GROUPS, *PTOKEN_GROUPS;
-
-
-typedef struct _TOKEN_PRIVILEGES {
-    DWORD PrivilegeCount;
-    LUID_AND_ATTRIBUTES Privileges[1];
-} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
-
-
-typedef struct _TOKEN_OWNER {
-    PSID Owner;
-} TOKEN_OWNER, *PTOKEN_OWNER;
-
-
-typedef struct _TOKEN_PRIMARY_GROUP {
-    PSID PrimaryGroup;
-} TOKEN_PRIMARY_GROUP, *PTOKEN_PRIMARY_GROUP;
-
-
-typedef struct _TOKEN_DEFAULT_DACL {
-    PACL DefaultDacl;
-} TOKEN_DEFAULT_DACL, *PTOKEN_DEFAULT_DACL;
-
-typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
-    DWORD SidCount;
-    DWORD SidLength;
-    PSID_AND_ATTRIBUTES Sids;
-    DWORD RestrictedSidCount;
-    DWORD RestrictedSidLength;
-    PSID_AND_ATTRIBUTES RestrictedSids;
-    DWORD PrivilegeCount;
-    DWORD PrivilegeLength;
-    PLUID_AND_ATTRIBUTES Privileges;
-    LUID AuthenticationId;
-} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TOKEN_AUDIT_POLICY_ELEMENT {
-    DWORD Category;
-    DWORD PolicyMask;
-} TOKEN_AUDIT_POLICY_ELEMENT, *PTOKEN_AUDIT_POLICY_ELEMENT;
-
-typedef struct _TOKEN_AUDIT_POLICY {
-    DWORD PolicyCount;
-    TOKEN_AUDIT_POLICY_ELEMENT Policy[1];
-} TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
-
-
-
-
-
-
-
-
-
-typedef struct _TOKEN_SOURCE {
-    CHAR SourceName[8];
-    LUID SourceIdentifier;
-} TOKEN_SOURCE, *PTOKEN_SOURCE;
-
-
-typedef struct _TOKEN_STATISTICS {
-    LUID TokenId;
-    LUID AuthenticationId;
-    LARGE_INTEGER ExpirationTime;
-    TOKEN_TYPE TokenType;
-    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
-    DWORD DynamicCharged;
-    DWORD DynamicAvailable;
-    DWORD GroupCount;
-    DWORD PrivilegeCount;
-    LUID ModifiedId;
-} TOKEN_STATISTICS, *PTOKEN_STATISTICS;
-
-
-
-typedef struct _TOKEN_CONTROL {
-    LUID TokenId;
-    LUID AuthenticationId;
-    LUID ModifiedId;
-    TOKEN_SOURCE TokenSource;
-} TOKEN_CONTROL, *PTOKEN_CONTROL;
-
-typedef struct _TOKEN_ORIGIN {
-    LUID OriginatingLogonSession ;
-} TOKEN_ORIGIN, * PTOKEN_ORIGIN ;
-
-
-
-
-
-
-
-
-typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
-                    * PSECURITY_CONTEXT_TRACKING_MODE;
-
-
-
-
-
-
-
-typedef struct _SECURITY_QUALITY_OF_SERVICE {
-    DWORD Length;
-    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
-    SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
-    BOOLEAN EffectiveOnly;
-    } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;
-
-
-
-
-
-
-typedef struct _SE_IMPERSONATION_STATE {
-    PACCESS_TOKEN Token;
-    BOOLEAN CopyOnOpen;
-    BOOLEAN EffectiveOnly;
-    SECURITY_IMPERSONATION_LEVEL Level;
-} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
-
-
-
-
-typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _JOB_SET_ARRAY {
-    HANDLE JobHandle;   
-    DWORD MemberLevel;  
-    DWORD Flags;        
-} JOB_SET_ARRAY, *PJOB_SET_ARRAY;
-
-
-
-
-typedef struct _NT_TIB {
-    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
-    PVOID StackBase;
-    PVOID StackLimit;
-    PVOID SubSystemTib;
-    union {
-        PVOID FiberData;
-        DWORD Version;
-    };
-    PVOID ArbitraryUserPointer;
-    struct _NT_TIB *Self;
-} NT_TIB;
-typedef NT_TIB *PNT_TIB;
-
-
-
-
-typedef struct _NT_TIB32 {
-    DWORD ExceptionList;
-    DWORD StackBase;
-    DWORD StackLimit;
-    DWORD SubSystemTib;
-    union {
-        DWORD FiberData;
-        DWORD Version;
-    };
-    DWORD ArbitraryUserPointer;
-    DWORD Self;
-} NT_TIB32, *PNT_TIB32;
-
-typedef struct _NT_TIB64 {
-    DWORD64 ExceptionList;
-    DWORD64 StackBase;
-    DWORD64 StackLimit;
-    DWORD64 SubSystemTib;
-    union {
-        DWORD64 FiberData;
-        DWORD Version;
-    };
-    DWORD64 ArbitraryUserPointer;
-    DWORD64 Self;
-} NT_TIB64, *PNT_TIB64;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _QUOTA_LIMITS {
-    SIZE_T PagedPoolLimit;
-    SIZE_T NonPagedPoolLimit;
-    SIZE_T MinimumWorkingSetSize;
-    SIZE_T MaximumWorkingSetSize;
-    SIZE_T PagefileLimit;
-    LARGE_INTEGER TimeLimit;
-} QUOTA_LIMITS, *PQUOTA_LIMITS;
-
-
-
-
-
-
-typedef struct _QUOTA_LIMITS_EX {
-    SIZE_T PagedPoolLimit;
-    SIZE_T NonPagedPoolLimit;
-    SIZE_T MinimumWorkingSetSize;
-    SIZE_T MaximumWorkingSetSize;
-    SIZE_T PagefileLimit;
-    LARGE_INTEGER TimeLimit;
-    SIZE_T Reserved1;
-    SIZE_T Reserved2;
-    SIZE_T Reserved3;
-    SIZE_T Reserved4;
-    DWORD  Flags;
-    DWORD  Reserved5;
-} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
-
-typedef struct _IO_COUNTERS {
-    ULONGLONG  ReadOperationCount;
-    ULONGLONG  WriteOperationCount;
-    ULONGLONG  OtherOperationCount;
-    ULONGLONG ReadTransferCount;
-    ULONGLONG WriteTransferCount;
-    ULONGLONG OtherTransferCount;
-} IO_COUNTERS;
-typedef IO_COUNTERS *PIO_COUNTERS;
-
-
-typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
-    LARGE_INTEGER TotalUserTime;
-    LARGE_INTEGER TotalKernelTime;
-    LARGE_INTEGER ThisPeriodTotalUserTime;
-    LARGE_INTEGER ThisPeriodTotalKernelTime;
-    DWORD TotalPageFaultCount;
-    DWORD TotalProcesses;
-    DWORD ActiveProcesses;
-    DWORD TotalTerminatedProcesses;
-} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
-
-typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
-    LARGE_INTEGER PerProcessUserTimeLimit;
-    LARGE_INTEGER PerJobUserTimeLimit;
-    DWORD LimitFlags;
-    SIZE_T MinimumWorkingSetSize;
-    SIZE_T MaximumWorkingSetSize;
-    DWORD ActiveProcessLimit;
-    ULONG_PTR Affinity;
-    DWORD PriorityClass;
-    DWORD SchedulingClass;
-} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
-
-typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
-    JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
-    IO_COUNTERS IoInfo;
-    SIZE_T ProcessMemoryLimit;
-    SIZE_T JobMemoryLimit;
-    SIZE_T PeakProcessMemoryUsed;
-    SIZE_T PeakJobMemoryUsed;
-} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
-
-typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
-    DWORD NumberOfAssignedProcesses;
-    DWORD NumberOfProcessIdsInList;
-    ULONG_PTR ProcessIdList[1];
-} JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;
-
-typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
-    DWORD UIRestrictionsClass;
-} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
-
-typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
-    DWORD SecurityLimitFlags ;
-    HANDLE JobToken ;
-    PTOKEN_GROUPS SidsToDisable ;
-    PTOKEN_PRIVILEGES PrivilegesToDelete ;
-    PTOKEN_GROUPS RestrictedSids ;
-} JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;
-
-typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
-    DWORD EndOfJobTimeAction;
-} JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
-
-typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
-    PVOID CompletionKey;
-    HANDLE CompletionPort;
-} JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
-
-typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
-    JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
-    IO_COUNTERS IoInfo;
-} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
-
-typedef struct _JOBOBJECT_JOBSET_INFORMATION {
-    DWORD MemberLevel;
-} JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _JOBOBJECTINFOCLASS {
-    JobObjectBasicAccountingInformation = 1,
-    JobObjectBasicLimitInformation,
-    JobObjectBasicProcessIdList,
-    JobObjectBasicUIRestrictions,
-    JobObjectSecurityLimitInformation,
-    JobObjectEndOfJobTimeInformation,
-    JobObjectAssociateCompletionPortInformation,
-    JobObjectBasicAndIoAccountingInformation,
-    JobObjectExtendedLimitInformation,
-    JobObjectJobSetInformation,
-    MaxJobObjectInfoClass
-    } JOBOBJECTINFOCLASS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
-    RelationProcessorCore,
-    RelationNumaNode,
-    RelationCache
-} LOGICAL_PROCESSOR_RELATIONSHIP;
-
-
-
-typedef enum _PROCESSOR_CACHE_TYPE {
-    CacheUnified,
-    CacheInstruction,
-    CacheData,
-    CacheTrace
-} PROCESSOR_CACHE_TYPE;
-
-
-
-typedef struct _CACHE_DESCRIPTOR {
-    BYTE   Level;
-    BYTE   Associativity;
-    WORD   LineSize;
-    DWORD  Size;
-    PROCESSOR_CACHE_TYPE Type;
-} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
-
-typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
-    ULONG_PTR   ProcessorMask;
-    LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
-    union {
-        struct {
-            BYTE  Flags;
-        } ProcessorCore;
-        struct {
-            DWORD NodeNumber;
-        } NumaNode;
-        CACHE_DESCRIPTOR Cache;
-        ULONGLONG  Reserved[2];
-    };
-} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _MEMORY_BASIC_INFORMATION {
-    PVOID BaseAddress;
-    PVOID AllocationBase;
-    DWORD AllocationProtect;
-    SIZE_T RegionSize;
-    DWORD State;
-    DWORD Protect;
-    DWORD Type;
-} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
-
-typedef struct _MEMORY_BASIC_INFORMATION32 {
-    DWORD BaseAddress;
-    DWORD AllocationBase;
-    DWORD AllocationProtect;
-    DWORD RegionSize;
-    DWORD State;
-    DWORD Protect;
-    DWORD Type;
-} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;
-
-typedef struct __declspec(align(16)) _MEMORY_BASIC_INFORMATION64 {
-    ULONGLONG BaseAddress;
-    ULONGLONG AllocationBase;
-    DWORD     AllocationProtect;
-    DWORD     __alignment1;
-    ULONGLONG RegionSize;
-    DWORD     State;
-    DWORD     Protect;
-    DWORD     Type;
-    DWORD     __alignment2;
-} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_NOTIFY_INFORMATION {
-    DWORD NextEntryOffset;
-    DWORD Action;
-    DWORD FileNameLength;
-    WCHAR FileName[1];
-} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
-
-
-
-
-
-
-typedef union _FILE_SEGMENT_ELEMENT {
-    PVOID64 Buffer;
-    ULONGLONG Alignment;
-}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
-
-
-
-
-
-
-
-
-
-typedef struct _REPARSE_GUID_DATA_BUFFER {
-    DWORD  ReparseTag;
-    WORD   ReparseDataLength;
-    WORD   Reserved;
-    GUID   ReparseGuid;
-    struct {
-        BYTE   DataBuffer[1];
-    } GenericReparseBuffer;
-} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _SYSTEM_POWER_STATE {
-    PowerSystemUnspecified = 0,
-    PowerSystemWorking     = 1,
-    PowerSystemSleeping1   = 2,
-    PowerSystemSleeping2   = 3,
-    PowerSystemSleeping3   = 4,
-    PowerSystemHibernate   = 5,
-    PowerSystemShutdown    = 6,
-    PowerSystemMaximum     = 7
-} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
-
-
-
-typedef enum {
-    PowerActionNone = 0,
-    PowerActionReserved,
-    PowerActionSleep,
-    PowerActionHibernate,
-    PowerActionShutdown,
-    PowerActionShutdownReset,
-    PowerActionShutdownOff,
-    PowerActionWarmEject
-} POWER_ACTION, *PPOWER_ACTION;
-
-typedef enum _DEVICE_POWER_STATE {
-    PowerDeviceUnspecified = 0,
-    PowerDeviceD0,
-    PowerDeviceD1,
-    PowerDeviceD2,
-    PowerDeviceD3,
-    PowerDeviceMaximum
-} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
-
-
-
-
-
-
-
-typedef DWORD EXECUTION_STATE;
-
-typedef enum {
-    LT_DONT_CARE,
-    LT_LOWEST_LATENCY
-} LATENCY_TIME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct CM_Power_Data_s {
-    DWORD               PD_Size;
-    DEVICE_POWER_STATE  PD_MostRecentPowerState;
-    DWORD               PD_Capabilities;
-    DWORD               PD_D1Latency;
-    DWORD               PD_D2Latency;
-    DWORD               PD_D3Latency;
-    DEVICE_POWER_STATE  PD_PowerStateMapping[7];
-    SYSTEM_POWER_STATE  PD_DeepestSystemWake;
-} CM_POWER_DATA, *PCM_POWER_DATA;
-
-
-
-typedef enum {
-    SystemPowerPolicyAc,
-    SystemPowerPolicyDc,
-    VerifySystemPolicyAc,
-    VerifySystemPolicyDc,
-    SystemPowerCapabilities,
-    SystemBatteryState,
-    SystemPowerStateHandler,
-    ProcessorStateHandler,
-    SystemPowerPolicyCurrent,
-    AdministratorPowerPolicy,
-    SystemReserveHiberFile,
-    ProcessorInformation,
-    SystemPowerInformation,
-    ProcessorStateHandler2,
-    LastWakeTime,                                   
-    LastSleepTime,                                  
-    SystemExecutionState,
-    SystemPowerStateNotifyHandler,
-    ProcessorPowerPolicyAc,
-    ProcessorPowerPolicyDc,
-    VerifyProcessorPowerPolicyAc,
-    VerifyProcessorPowerPolicyDc,
-    ProcessorPowerPolicyCurrent,
-    SystemPowerStateLogging,
-    SystemPowerLoggingEntry
-} POWER_INFORMATION_LEVEL;
-
-
-
-
-
-
-
-typedef struct {
-    DWORD       Granularity;
-    DWORD       Capacity;
-} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
-
-
-
-
-
-
-typedef struct {
-    POWER_ACTION    Action;
-    DWORD           Flags;
-    DWORD           EventCode;
-} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    BOOLEAN                 Enable;
-    BYTE                    Spare[3];
-    DWORD                   BatteryLevel;
-    POWER_ACTION_POLICY     PowerPolicy;
-    SYSTEM_POWER_STATE      MinSystemState;
-} SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SYSTEM_POWER_POLICY {
-    DWORD                   Revision;       
-
-    
-    POWER_ACTION_POLICY     PowerButton;
-    POWER_ACTION_POLICY     SleepButton;
-    POWER_ACTION_POLICY     LidClose;
-    SYSTEM_POWER_STATE      LidOpenWake;
-    DWORD                   Reserved;
-
-    
-    POWER_ACTION_POLICY     Idle;
-    DWORD                   IdleTimeout;
-    BYTE                    IdleSensitivity;
-
-    
-    
-    BYTE                    DynamicThrottle;
-
-    BYTE                    Spare2[2];
-
-    
-    SYSTEM_POWER_STATE      MinSleep;
-    SYSTEM_POWER_STATE      MaxSleep;
-    SYSTEM_POWER_STATE      ReducedLatencySleep;
-    DWORD                   WinLogonFlags;
-
-    
-    DWORD                   Spare3;
-    DWORD                   DozeS4Timeout;
-
-    
-    DWORD                   BroadcastCapacityResolution;
-    SYSTEM_POWER_LEVEL      DischargePolicy[4];
-
-    
-    DWORD                   VideoTimeout;
-    BOOLEAN                 VideoDimDisplay;
-    DWORD                   VideoReserved[3];
-
-    
-    DWORD                   SpindownTimeout;
-
-    
-    BOOLEAN                 OptimizeForPower;
-    BYTE                    FanThrottleTolerance;
-    BYTE                    ForcedThrottle;
-    BYTE                    MinThrottle;
-    POWER_ACTION_POLICY     OverThrottled;
-
-} SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;
-
-
-typedef struct _PROCESSOR_POWER_POLICY_INFO {
-
-    
-    DWORD                   TimeCheck;                      
-    DWORD                   DemoteLimit;                    
-    DWORD                   PromoteLimit;                   
-
-    
-    BYTE                    DemotePercent;
-    BYTE                    PromotePercent;
-    BYTE                    Spare[2];
-
-    
-    DWORD                   AllowDemotion:1;
-    DWORD                   AllowPromotion:1;
-    DWORD                   Reserved:30;
-
-} PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;
-
-
-typedef struct _PROCESSOR_POWER_POLICY {
-    DWORD                       Revision;       
-
-    
-    BYTE                        DynamicThrottle;
-    BYTE                        Spare[3];
-
-    
-    DWORD                       DisableCStates:1;
-    DWORD                       Reserved:31;
-
-    
-    
-    
-    DWORD                       PolicyCount;
-    PROCESSOR_POWER_POLICY_INFO Policy[3];
-
-} PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;
-
-
-typedef struct _ADMINISTRATOR_POWER_POLICY {
-
-    
-    SYSTEM_POWER_STATE      MinSleep;
-    SYSTEM_POWER_STATE      MaxSleep;
-
-    
-    DWORD                   MinVideoTimeout;
-    DWORD                   MaxVideoTimeout;
-
-    
-    DWORD                   MinSpindownTimeout;
-    DWORD                   MaxSpindownTimeout;
-} ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;
-
-
-typedef struct {
-    
-    BOOLEAN             PowerButtonPresent;
-    BOOLEAN             SleepButtonPresent;
-    BOOLEAN             LidPresent;
-    BOOLEAN             SystemS1;
-    BOOLEAN             SystemS2;
-    BOOLEAN             SystemS3;
-    BOOLEAN             SystemS4;           
-    BOOLEAN             SystemS5;           
-    BOOLEAN             HiberFilePresent;
-    BOOLEAN             FullWake;
-    BOOLEAN             VideoDimPresent;
-    BOOLEAN             ApmPresent;
-    BOOLEAN             UpsPresent;
-
-    
-    BOOLEAN             ThermalControl;
-    BOOLEAN             ProcessorThrottle;
-    BYTE                ProcessorMinThrottle;
-    BYTE                ProcessorMaxThrottle;
-    BYTE                spare2[4];
-
-    
-    BOOLEAN             DiskSpinDown;
-    BYTE                spare3[8];
-
-    
-    BOOLEAN             SystemBatteriesPresent;
-    BOOLEAN             BatteriesAreShortTerm;
-    BATTERY_REPORTING_SCALE BatteryScale[3];
-
-    
-    SYSTEM_POWER_STATE  AcOnLineWake;
-    SYSTEM_POWER_STATE  SoftLidWake;
-    SYSTEM_POWER_STATE  RtcWake;
-    SYSTEM_POWER_STATE  MinDeviceWakeState; 
-    SYSTEM_POWER_STATE  DefaultLowLatencyWake;
-} SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;
-
-typedef struct {
-    BOOLEAN             AcOnLine;
-    BOOLEAN             BatteryPresent;
-    BOOLEAN             Charging;
-    BOOLEAN             Discharging;
-    BOOLEAN             Spare1[4];
-
-    DWORD               MaxCapacity;
-    DWORD               RemainingCapacity;
-    DWORD               Rate;
-    DWORD               EstimatedTime;
-
-    DWORD               DefaultAlert1;
-    DWORD               DefaultAlert2;
-} SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,4)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_DOS_HEADER {      
-    WORD   e_magic;                     
-    WORD   e_cblp;                      
-    WORD   e_cp;                        
-    WORD   e_crlc;                      
-    WORD   e_cparhdr;                   
-    WORD   e_minalloc;                  
-    WORD   e_maxalloc;                  
-    WORD   e_ss;                        
-    WORD   e_sp;                        
-    WORD   e_csum;                      
-    WORD   e_ip;                        
-    WORD   e_cs;                        
-    WORD   e_lfarlc;                    
-    WORD   e_ovno;                      
-    WORD   e_res[4];                    
-    WORD   e_oemid;                     
-    WORD   e_oeminfo;                   
-    WORD   e_res2[10];                  
-    LONG   e_lfanew;                    
-  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
-
-typedef struct _IMAGE_OS2_HEADER {      
-    WORD   ne_magic;                    
-    CHAR   ne_ver;                      
-    CHAR   ne_rev;                      
-    WORD   ne_enttab;                   
-    WORD   ne_cbenttab;                 
-    LONG   ne_crc;                      
-    WORD   ne_flags;                    
-    WORD   ne_autodata;                 
-    WORD   ne_heap;                     
-    WORD   ne_stack;                    
-    LONG   ne_csip;                     
-    LONG   ne_sssp;                     
-    WORD   ne_cseg;                     
-    WORD   ne_cmod;                     
-    WORD   ne_cbnrestab;                
-    WORD   ne_segtab;                   
-    WORD   ne_rsrctab;                  
-    WORD   ne_restab;                   
-    WORD   ne_modtab;                   
-    WORD   ne_imptab;                   
-    LONG   ne_nrestab;                  
-    WORD   ne_cmovent;                  
-    WORD   ne_align;                    
-    WORD   ne_cres;                     
-    BYTE   ne_exetyp;                   
-    BYTE   ne_flagsothers;              
-    WORD   ne_pretthunks;               
-    WORD   ne_psegrefbytes;             
-    WORD   ne_swaparea;                 
-    WORD   ne_expver;                   
-  } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
-
-typedef struct _IMAGE_VXD_HEADER {      
-    WORD   e32_magic;                   
-    BYTE   e32_border;                  
-    BYTE   e32_worder;                  
-    DWORD  e32_level;                   
-    WORD   e32_cpu;                     
-    WORD   e32_os;                      
-    DWORD  e32_ver;                     
-    DWORD  e32_mflags;                  
-    DWORD  e32_mpages;                  
-    DWORD  e32_startobj;                
-    DWORD  e32_eip;                     
-    DWORD  e32_stackobj;                
-    DWORD  e32_esp;                     
-    DWORD  e32_pagesize;                
-    DWORD  e32_lastpagesize;            
-    DWORD  e32_fixupsize;               
-    DWORD  e32_fixupsum;                
-    DWORD  e32_ldrsize;                 
-    DWORD  e32_ldrsum;                  
-    DWORD  e32_objtab;                  
-    DWORD  e32_objcnt;                  
-    DWORD  e32_objmap;                  
-    DWORD  e32_itermap;                 
-    DWORD  e32_rsrctab;                 
-    DWORD  e32_rsrccnt;                 
-    DWORD  e32_restab;                  
-    DWORD  e32_enttab;                  
-    DWORD  e32_dirtab;                  
-    DWORD  e32_dircnt;                  
-    DWORD  e32_fpagetab;                
-    DWORD  e32_frectab;                 
-    DWORD  e32_impmod;                  
-    DWORD  e32_impmodcnt;               
-    DWORD  e32_impproc;                 
-    DWORD  e32_pagesum;                 
-    DWORD  e32_datapage;                
-    DWORD  e32_preload;                 
-    DWORD  e32_nrestab;                 
-    DWORD  e32_cbnrestab;               
-    DWORD  e32_nressum;                 
-    DWORD  e32_autodata;                
-    DWORD  e32_debuginfo;               
-    DWORD  e32_debuglen;                
-    DWORD  e32_instpreload;             
-    DWORD  e32_instdemand;              
-    DWORD  e32_heapsize;                
-    BYTE   e32_res3[12];                
-    DWORD  e32_winresoff;
-    DWORD  e32_winreslen;
-    WORD   e32_devid;                   
-    WORD   e32_ddkver;                  
-  } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_FILE_HEADER {
-    WORD    Machine;
-    WORD    NumberOfSections;
-    DWORD   TimeDateStamp;
-    DWORD   PointerToSymbolTable;
-    DWORD   NumberOfSymbols;
-    WORD    SizeOfOptionalHeader;
-    WORD    Characteristics;
-} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_DATA_DIRECTORY {
-    DWORD   VirtualAddress;
-    DWORD   Size;
-} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
-
-
-
-
-
-
-
-typedef struct _IMAGE_OPTIONAL_HEADER {
-    
-    
-    
-
-    WORD    Magic;
-    BYTE    MajorLinkerVersion;
-    BYTE    MinorLinkerVersion;
-    DWORD   SizeOfCode;
-    DWORD   SizeOfInitializedData;
-    DWORD   SizeOfUninitializedData;
-    DWORD   AddressOfEntryPoint;
-    DWORD   BaseOfCode;
-    DWORD   BaseOfData;
-
-    
-    
-    
-
-    DWORD   ImageBase;
-    DWORD   SectionAlignment;
-    DWORD   FileAlignment;
-    WORD    MajorOperatingSystemVersion;
-    WORD    MinorOperatingSystemVersion;
-    WORD    MajorImageVersion;
-    WORD    MinorImageVersion;
-    WORD    MajorSubsystemVersion;
-    WORD    MinorSubsystemVersion;
-    DWORD   Win32VersionValue;
-    DWORD   SizeOfImage;
-    DWORD   SizeOfHeaders;
-    DWORD   CheckSum;
-    WORD    Subsystem;
-    WORD    DllCharacteristics;
-    DWORD   SizeOfStackReserve;
-    DWORD   SizeOfStackCommit;
-    DWORD   SizeOfHeapReserve;
-    DWORD   SizeOfHeapCommit;
-    DWORD   LoaderFlags;
-    DWORD   NumberOfRvaAndSizes;
-    IMAGE_DATA_DIRECTORY DataDirectory[16];
-} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
-
-typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
-    WORD   Magic;
-    BYTE   MajorLinkerVersion;
-    BYTE   MinorLinkerVersion;
-    DWORD  SizeOfCode;
-    DWORD  SizeOfInitializedData;
-    DWORD  SizeOfUninitializedData;
-    DWORD  AddressOfEntryPoint;
-    DWORD  BaseOfCode;
-    DWORD  BaseOfData;
-    DWORD  BaseOfBss;
-    DWORD  GprMask;
-    DWORD  CprMask[4];
-    DWORD  GpValue;
-} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
-
-typedef struct _IMAGE_OPTIONAL_HEADER64 {
-    WORD        Magic;
-    BYTE        MajorLinkerVersion;
-    BYTE        MinorLinkerVersion;
-    DWORD       SizeOfCode;
-    DWORD       SizeOfInitializedData;
-    DWORD       SizeOfUninitializedData;
-    DWORD       AddressOfEntryPoint;
-    DWORD       BaseOfCode;
-    ULONGLONG   ImageBase;
-    DWORD       SectionAlignment;
-    DWORD       FileAlignment;
-    WORD        MajorOperatingSystemVersion;
-    WORD        MinorOperatingSystemVersion;
-    WORD        MajorImageVersion;
-    WORD        MinorImageVersion;
-    WORD        MajorSubsystemVersion;
-    WORD        MinorSubsystemVersion;
-    DWORD       Win32VersionValue;
-    DWORD       SizeOfImage;
-    DWORD       SizeOfHeaders;
-    DWORD       CheckSum;
-    WORD        Subsystem;
-    WORD        DllCharacteristics;
-    ULONGLONG   SizeOfStackReserve;
-    ULONGLONG   SizeOfStackCommit;
-    ULONGLONG   SizeOfHeapReserve;
-    ULONGLONG   SizeOfHeapCommit;
-    DWORD       LoaderFlags;
-    DWORD       NumberOfRvaAndSizes;
-    IMAGE_DATA_DIRECTORY DataDirectory[16];
-} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef IMAGE_OPTIONAL_HEADER32             IMAGE_OPTIONAL_HEADER;
-typedef PIMAGE_OPTIONAL_HEADER32            PIMAGE_OPTIONAL_HEADER;
-
-
-
-
-typedef struct _IMAGE_NT_HEADERS64 {
-    DWORD Signature;
-    IMAGE_FILE_HEADER FileHeader;
-    IMAGE_OPTIONAL_HEADER64 OptionalHeader;
-} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
-
-typedef struct _IMAGE_NT_HEADERS {
-    DWORD Signature;
-    IMAGE_FILE_HEADER FileHeader;
-    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
-} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
-
-typedef struct _IMAGE_ROM_HEADERS {
-    IMAGE_FILE_HEADER FileHeader;
-    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
-} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
-
-
-
-
-
-typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
-typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct ANON_OBJECT_HEADER {
-    WORD    Sig1;            
-    WORD    Sig2;            
-    WORD    Version;         
-    WORD    Machine;
-    DWORD   TimeDateStamp;
-    CLSID   ClassID;         
-    DWORD   SizeOfData;      
-} ANON_OBJECT_HEADER;
-
-
-
-
-
-
-
-typedef struct _IMAGE_SECTION_HEADER {
-    BYTE    Name[8];
-    union {
-            DWORD   PhysicalAddress;
-            DWORD   VirtualSize;
-    } Misc;
-    DWORD   VirtualAddress;
-    DWORD   SizeOfRawData;
-    DWORD   PointerToRawData;
-    DWORD   PointerToRelocations;
-    DWORD   PointerToLinenumbers;
-    WORD    NumberOfRelocations;
-    WORD    NumberOfLinenumbers;
-    DWORD   Characteristics;
-} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_SYMBOL {
-    union {
-        BYTE    ShortName[8];
-        struct {
-            DWORD   Short;     
-            DWORD   Long;      
-        } Name;
-        DWORD   LongName[2];    
-    } N;
-    DWORD   Value;
-    SHORT   SectionNumber;
-    WORD    Type;
-    BYTE    StorageClass;
-    BYTE    NumberOfAuxSymbols;
-} IMAGE_SYMBOL;
-typedef IMAGE_SYMBOL  *PIMAGE_SYMBOL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef union _IMAGE_AUX_SYMBOL {
-    struct {
-        DWORD    TagIndex;                      
-        union {
-            struct {
-                WORD    Linenumber;             
-                WORD    Size;                   
-            } LnSz;
-           DWORD    TotalSize;
-        } Misc;
-        union {
-            struct {                            
-                DWORD    PointerToLinenumber;
-                DWORD    PointerToNextFunction;
-            } Function;
-            struct {                            
-                WORD     Dimension[4];
-            } Array;
-        } FcnAry;
-        WORD    TvIndex;                        
-    } Sym;
-    struct {
-        BYTE    Name[18];
-    } File;
-    struct {
-        DWORD   Length;                         
-        WORD    NumberOfRelocations;            
-        WORD    NumberOfLinenumbers;            
-        DWORD   CheckSum;                       
-        SHORT   Number;                         
-        BYTE    Selection;                      
-    } Section;
-} IMAGE_AUX_SYMBOL;
-typedef IMAGE_AUX_SYMBOL  *PIMAGE_AUX_SYMBOL;
-
-
-
-typedef enum IMAGE_AUX_SYMBOL_TYPE {
-    IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1,
-} IMAGE_AUX_SYMBOL_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-
-typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {
-    BYTE  bAuxType;                  
-    BYTE  bReserved;                 
-    DWORD SymbolTableIndex;
-    BYTE  rgbReserved[12];           
-} IMAGE_AUX_SYMBOL_TOKEN_DEF;
-
-typedef IMAGE_AUX_SYMBOL_TOKEN_DEF  *PIMAGE_AUX_SYMBOL_TOKEN_DEF;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RELOCATION {
-    union {
-        DWORD   VirtualAddress;
-        DWORD   RelocCount;             
-    };
-    DWORD   SymbolTableIndex;
-    WORD    Type;
-} IMAGE_RELOCATION;
-typedef IMAGE_RELOCATION  *PIMAGE_RELOCATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_LINENUMBER {
-    union {
-        DWORD   SymbolTableIndex;               
-        DWORD   VirtualAddress;                 
-    } Type;
-    WORD    Linenumber;                         
-} IMAGE_LINENUMBER;
-typedef IMAGE_LINENUMBER  *PIMAGE_LINENUMBER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_BASE_RELOCATION {
-    DWORD   VirtualAddress;
-    DWORD   SizeOfBlock;
-
-} IMAGE_BASE_RELOCATION;
-typedef IMAGE_BASE_RELOCATION  * PIMAGE_BASE_RELOCATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
-    BYTE     Name[16];                          
-    BYTE     Date[12];                          
-    BYTE     UserID[6];                         
-    BYTE     GroupID[6];                        
-    BYTE     Mode[8];                           
-    BYTE     Size[10];                          
-    BYTE     EndHeader[2];                      
-} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_EXPORT_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    DWORD   Name;
-    DWORD   Base;
-    DWORD   NumberOfFunctions;
-    DWORD   NumberOfNames;
-    DWORD   AddressOfFunctions;     
-    DWORD   AddressOfNames;         
-    DWORD   AddressOfNameOrdinals;  
-} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
-
-
-
-
-
-typedef struct _IMAGE_IMPORT_BY_NAME {
-    WORD    Hint;
-    BYTE    Name[1];
-} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_THUNK_DATA64 {
-    union {
-        ULONGLONG ForwarderString;  
-        ULONGLONG Function;         
-        ULONGLONG Ordinal;
-        ULONGLONG AddressOfData;    
-    } u1;
-} IMAGE_THUNK_DATA64;
-typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_THUNK_DATA32 {
-    union {
-        DWORD ForwarderString;      
-        DWORD Function;             
-        DWORD Ordinal;
-        DWORD AddressOfData;        
-    } u1;
-} IMAGE_THUNK_DATA32;
-typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void
-(__stdcall *PIMAGE_TLS_CALLBACK) (
-    PVOID DllHandle,
-    DWORD Reason,
-    PVOID Reserved
-    );
-
-typedef struct _IMAGE_TLS_DIRECTORY64 {
-    ULONGLONG   StartAddressOfRawData;
-    ULONGLONG   EndAddressOfRawData;
-    ULONGLONG   AddressOfIndex;         
-    ULONGLONG   AddressOfCallBacks;     
-    DWORD   SizeOfZeroFill;
-    DWORD   Characteristics;
-} IMAGE_TLS_DIRECTORY64;
-typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;
-
-typedef struct _IMAGE_TLS_DIRECTORY32 {
-    DWORD   StartAddressOfRawData;
-    DWORD   EndAddressOfRawData;
-    DWORD   AddressOfIndex;             
-    DWORD   AddressOfCallBacks;         
-    DWORD   SizeOfZeroFill;
-    DWORD   Characteristics;
-} IMAGE_TLS_DIRECTORY32;
-typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef IMAGE_THUNK_DATA32              IMAGE_THUNK_DATA;
-typedef PIMAGE_THUNK_DATA32             PIMAGE_THUNK_DATA;
-
-typedef IMAGE_TLS_DIRECTORY32           IMAGE_TLS_DIRECTORY;
-typedef PIMAGE_TLS_DIRECTORY32          PIMAGE_TLS_DIRECTORY;
-
-
-typedef struct _IMAGE_IMPORT_DESCRIPTOR {
-    union {
-        DWORD   Characteristics;            
-        DWORD   OriginalFirstThunk;         
-    };
-    DWORD   TimeDateStamp;                  
-                                            
-                                            
-                                            
-
-    DWORD   ForwarderChain;                 
-    DWORD   Name;
-    DWORD   FirstThunk;                     
-} IMAGE_IMPORT_DESCRIPTOR;
-typedef IMAGE_IMPORT_DESCRIPTOR  *PIMAGE_IMPORT_DESCRIPTOR;
-
-
-
-
-
-typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
-    DWORD   TimeDateStamp;
-    WORD    OffsetModuleName;
-    WORD    NumberOfModuleForwarderRefs;
-
-} IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
-
-typedef struct _IMAGE_BOUND_FORWARDER_REF {
-    DWORD   TimeDateStamp;
-    WORD    OffsetModuleName;
-    WORD    Reserved;
-} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    WORD    NumberOfNamedEntries;
-    WORD    NumberOfIdEntries;
-
-} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
-    union {
-        struct {
-            DWORD NameOffset:31;
-            DWORD NameIsString:1;
-        };
-        DWORD   Name;
-        WORD    Id;
-    };
-    union {
-        DWORD   OffsetToData;
-        struct {
-            DWORD   OffsetToDirectory:31;
-            DWORD   DataIsDirectory:1;
-        };
-    };
-} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
-    WORD    Length;
-    CHAR    NameString[ 1 ];
-} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
-
-
-typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
-    WORD    Length;
-    WCHAR   NameString[ 1 ];
-} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
-    DWORD   OffsetToData;
-    DWORD   Size;
-    DWORD   CodePage;
-    DWORD   Reserved;
-} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
-
-
-
-
-
-typedef struct {
-    DWORD   Size;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    DWORD   GlobalFlagsClear;
-    DWORD   GlobalFlagsSet;
-    DWORD   CriticalSectionDefaultTimeout;
-    DWORD   DeCommitFreeBlockThreshold;
-    DWORD   DeCommitTotalFreeThreshold;
-    DWORD   LockPrefixTable;            
-    DWORD   MaximumAllocationSize;
-    DWORD   VirtualMemoryThreshold;
-    DWORD   ProcessHeapFlags;
-    DWORD   ProcessAffinityMask;
-    WORD    CSDVersion;
-    WORD    Reserved1;
-    DWORD   EditList;                   
-    DWORD   SecurityCookie;             
-    DWORD   SEHandlerTable;             
-    DWORD   SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
-
-typedef struct {
-    DWORD      Size;
-    DWORD      TimeDateStamp;
-    WORD       MajorVersion;
-    WORD       MinorVersion;
-    DWORD      GlobalFlagsClear;
-    DWORD      GlobalFlagsSet;
-    DWORD      CriticalSectionDefaultTimeout;
-    ULONGLONG  DeCommitFreeBlockThreshold;
-    ULONGLONG  DeCommitTotalFreeThreshold;
-    ULONGLONG  LockPrefixTable;         
-    ULONGLONG  MaximumAllocationSize;
-    ULONGLONG  VirtualMemoryThreshold;
-    ULONGLONG  ProcessAffinityMask;
-    DWORD      ProcessHeapFlags;
-    WORD       CSDVersion;
-    WORD       Reserved1;
-    ULONGLONG  EditList;                
-    ULONGLONG  SecurityCookie;          
-    ULONGLONG  SEHandlerTable;          
-    ULONGLONG  SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
-
-
-
-
-
-typedef IMAGE_LOAD_CONFIG_DIRECTORY32     IMAGE_LOAD_CONFIG_DIRECTORY;
-typedef PIMAGE_LOAD_CONFIG_DIRECTORY32    PIMAGE_LOAD_CONFIG_DIRECTORY;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
-    DWORD FuncStart;
-    DWORD PrologLen : 8;
-    DWORD FuncLen : 22;
-    DWORD ThirtyTwoBit : 1;
-    DWORD ExceptionFlag : 1;
-} IMAGE_CE_RUNTIME_FUNCTION_ENTRY, * PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;
-
-typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {
-    ULONGLONG BeginAddress;
-    ULONGLONG EndAddress;
-    ULONGLONG ExceptionHandler;
-    ULONGLONG HandlerData;
-    ULONGLONG PrologEndAddress;
-} IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;
-
-typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {
-    DWORD BeginAddress;
-    DWORD EndAddress;
-    DWORD ExceptionHandler;
-    DWORD HandlerData;
-    DWORD PrologEndAddress;
-} IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;
-
-typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
-    DWORD BeginAddress;
-    DWORD EndAddress;
-    DWORD UnwindInfoAddress;
-} _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;
-
-typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
-typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
-typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
-
-
-
-
-
-
-
-typedef struct _IMAGE_DEBUG_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    DWORD   Type;
-    DWORD   SizeOfData;
-    DWORD   AddressOfRawData;
-    DWORD   PointerToRawData;
-} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
-    DWORD   NumberOfSymbols;
-    DWORD   LvaToFirstSymbol;
-    DWORD   NumberOfLinenumbers;
-    DWORD   LvaToFirstLinenumber;
-    DWORD   RvaToFirstByteOfCode;
-    DWORD   RvaToLastByteOfCode;
-    DWORD   RvaToFirstByteOfData;
-    DWORD   RvaToLastByteOfData;
-} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
-
-
-
-
-
-
-typedef struct _FPO_DATA {
-    DWORD       ulOffStart;             
-    DWORD       cbProcSize;             
-    DWORD       cdwLocals;              
-    WORD        cdwParams;              
-    WORD        cbProlog : 8;           
-    WORD        cbRegs   : 3;           
-    WORD        fHasSEH  : 1;           
-    WORD        fUseBP   : 1;           
-    WORD        reserved : 1;           
-    WORD        cbFrame  : 2;           
-} FPO_DATA, *PFPO_DATA;
-
-
-
-
-
-typedef struct _IMAGE_DEBUG_MISC {
-    DWORD       DataType;               
-    DWORD       Length;                 
-                                        
-    BOOLEAN     Unicode;                
-    BYTE        Reserved[ 3 ];
-    BYTE        Data[ 1 ];              
-} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_FUNCTION_ENTRY {
-    DWORD   StartingAddress;
-    DWORD   EndingAddress;
-    DWORD   EndOfPrologue;
-} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
-
-typedef struct _IMAGE_FUNCTION_ENTRY64 {
-    ULONGLONG   StartingAddress;
-    ULONGLONG   EndingAddress;
-    union {
-        ULONGLONG   EndOfPrologue;
-        ULONGLONG   UnwindInfoAddress;
-    };
-} IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
-    WORD        Signature;
-    WORD        Flags;
-    WORD        Machine;
-    WORD        Characteristics;
-    DWORD       TimeDateStamp;
-    DWORD       CheckSum;
-    DWORD       ImageBase;
-    DWORD       SizeOfImage;
-    DWORD       NumberOfSections;
-    DWORD       ExportedNamesSize;
-    DWORD       DebugDirectorySize;
-    DWORD       SectionAlignment;
-    DWORD       Reserved[2];
-} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
-
-typedef struct _NON_PAGED_DEBUG_INFO {
-    WORD        Signature;
-    WORD        Flags;
-    DWORD       Size;
-    WORD        Machine;
-    WORD        Characteristics;
-    DWORD       TimeDateStamp;
-    DWORD       CheckSum;
-    DWORD       SizeOfImage;
-    ULONGLONG   ImageBase;
-    
-    
-} NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;
-
-
-
-
-
-
-
-
-
-
-
-                                                
-
-
-
-
-
-
-
-
-
-typedef struct _ImageArchitectureHeader {
-    unsigned int AmaskValue: 1;                 
-                                                
-    int :7;                                     
-    unsigned int AmaskShift: 8;                 
-    int :16;                                    
-    DWORD FirstEntryRVA;                        
-} IMAGE_ARCHITECTURE_HEADER, *PIMAGE_ARCHITECTURE_HEADER;
-
-typedef struct _ImageArchitectureEntry {
-    DWORD FixupInstRVA;                         
-    DWORD NewInst;                              
-} IMAGE_ARCHITECTURE_ENTRY, *PIMAGE_ARCHITECTURE_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct IMPORT_OBJECT_HEADER {
-    WORD    Sig1;                       
-    WORD    Sig2;                       
-    WORD    Version;
-    WORD    Machine;
-    DWORD   TimeDateStamp;              
-    DWORD   SizeOfData;                 
-
-    union {
-        WORD    Ordinal;                
-        WORD    Hint;
-    };
-
-    WORD    Type : 2;                   
-    WORD    NameType : 3;               
-    WORD    Reserved : 11;              
-} IMPORT_OBJECT_HEADER;
-
-typedef enum IMPORT_OBJECT_TYPE
-{
-    IMPORT_OBJECT_CODE = 0,
-    IMPORT_OBJECT_DATA = 1,
-    IMPORT_OBJECT_CONST = 2,
-} IMPORT_OBJECT_TYPE;
-
-typedef enum IMPORT_OBJECT_NAME_TYPE
-{
-    IMPORT_OBJECT_ORDINAL = 0,          
-    IMPORT_OBJECT_NAME = 1,             
-    IMPORT_OBJECT_NAME_NO_PREFIX = 2,   
-    IMPORT_OBJECT_NAME_UNDECORATE = 3,  
-                                        
-} IMPORT_OBJECT_NAME_TYPE;
-
-
-
-
-
-typedef enum ReplacesCorHdrNumericDefines
-{
-
-    COMIMAGE_FLAGS_ILONLY               =0x00000001,
-    COMIMAGE_FLAGS_32BITREQUIRED        =0x00000002,
-    COMIMAGE_FLAGS_IL_LIBRARY           =0x00000004,
-    COMIMAGE_FLAGS_STRONGNAMESIGNED     =0x00000008,
-    COMIMAGE_FLAGS_TRACKDEBUGDATA       =0x00010000,
-
-
-    COR_VERSION_MAJOR_V2                =2,
-    COR_VERSION_MAJOR                   =COR_VERSION_MAJOR_V2,
-    COR_VERSION_MINOR                   =0,
-    COR_DELETED_NAME_LENGTH             =8,
-    COR_VTABLEGAP_NAME_LENGTH           =8,
-
-
-    NATIVE_TYPE_MAX_CB                  =1,   
-    COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,
-
-
-    IMAGE_COR_MIH_METHODRVA             =0x01,
-    IMAGE_COR_MIH_EHRVA                 =0x02,    
-    IMAGE_COR_MIH_BASICBLOCK            =0x08,
-
-
-    COR_VTABLE_32BIT                    =0x01,          
-    COR_VTABLE_64BIT                    =0x02,          
-    COR_VTABLE_FROM_UNMANAGED           =0x04,          
-    COR_VTABLE_CALL_MOST_DERIVED        =0x10,          
-
-
-    IMAGE_COR_EATJ_THUNK_SIZE           =32,            
-
-
-    
-    MAX_CLASS_NAME                      =1024,
-    MAX_PACKAGE_NAME                    =1024,
-} ReplacesCorHdrNumericDefines;
-
-
-typedef struct IMAGE_COR20_HEADER
-{
-    
-    DWORD                   cb;              
-    WORD                    MajorRuntimeVersion;
-    WORD                    MinorRuntimeVersion;
-    
-    
-    IMAGE_DATA_DIRECTORY    MetaData;        
-    DWORD                   Flags;           
-    DWORD                   EntryPointToken;
-    
-    
-    IMAGE_DATA_DIRECTORY    Resources;
-    IMAGE_DATA_DIRECTORY    StrongNameSignature;
-
-    
-    IMAGE_DATA_DIRECTORY    CodeManagerTable;
-    IMAGE_DATA_DIRECTORY    VTableFixups;
-    IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;
-
-    
-    IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
-    
-} IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef union _SLIST_HEADER {
-    ULONGLONG Alignment;
-    struct {
-        SINGLE_LIST_ENTRY Next;
-        WORD   Depth;
-        WORD   Sequence;
-    };
-} SLIST_HEADER, *PSLIST_HEADER;
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-RtlInitializeSListHead (
-     PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-RtlFirstEntrySList (
-     const SLIST_HEADER *ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-RtlInterlockedPopEntrySList (
-     PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-RtlInterlockedPushEntrySList (
-     PSLIST_HEADER ListHead,
-     PSINGLE_LIST_ENTRY ListEntry
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-RtlInterlockedFlushSList (
-     PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-WORD  
-__stdcall
-RtlQueryDepthSList (
-     PSLIST_HEADER ListHead
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-RtlCaptureContext (
-     PCONTEXT ContextRecord
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-RtlCompareMemory (
-    const void *Source1,
-    const void *Source2,
-    SIZE_T Length
-    );
-
-
-
-
-
-
-
-
-
-
-
-__forceinline
-PVOID
-RtlSecureZeroMemory(
-     PVOID ptr,
-     SIZE_T cnt
-    )
-{
-    volatile char *vptr = (volatile char *)ptr;
-
-
-
-
-
-
-
-    while (cnt) {
-        *vptr = 0;
-        vptr++;
-        cnt--;
-    }
-
-
-
-    return ptr;
-}
-
-
-
-
-typedef struct _MESSAGE_RESOURCE_ENTRY {
-    WORD   Length;
-    WORD   Flags;
-    BYTE  Text[ 1 ];
-} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
-
-
-
-typedef struct _MESSAGE_RESOURCE_BLOCK {
-    DWORD LowId;
-    DWORD HighId;
-    DWORD OffsetToEntries;
-} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
-
-typedef struct _MESSAGE_RESOURCE_DATA {
-    DWORD NumberOfBlocks;
-    MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
-} MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
-
-typedef struct _OSVERSIONINFOA {
-    DWORD dwOSVersionInfoSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformId;
-    CHAR   szCSDVersion[ 128 ];     
-} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
-
-typedef struct _OSVERSIONINFOW {
-    DWORD dwOSVersionInfoSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformId;
-    WCHAR  szCSDVersion[ 128 ];     
-} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
-
-typedef OSVERSIONINFOW OSVERSIONINFO;
-typedef POSVERSIONINFOW POSVERSIONINFO;
-typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
-
-
-
-
-
-
-typedef struct _OSVERSIONINFOEXA {
-    DWORD dwOSVersionInfoSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformId;
-    CHAR   szCSDVersion[ 128 ];     
-    WORD   wServicePackMajor;
-    WORD   wServicePackMinor;
-    WORD   wSuiteMask;
-    BYTE  wProductType;
-    BYTE  wReserved;
-} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
-typedef struct _OSVERSIONINFOEXW {
-    DWORD dwOSVersionInfoSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformId;
-    WCHAR  szCSDVersion[ 128 ];     
-    WORD   wServicePackMajor;
-    WORD   wServicePackMinor;
-    WORD   wSuiteMask;
-    BYTE  wProductType;
-    BYTE  wReserved;
-} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
-
-typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
-typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
-typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-ULONGLONG
-__stdcall
-VerSetConditionMask(
-          ULONGLONG   ConditionMask,
-          DWORD   TypeMask,
-          BYTE    Condition
-        );
-
-
-typedef struct _RTL_CRITICAL_SECTION_DEBUG {
-    WORD   Type;
-    WORD   CreatorBackTraceIndex;
-    struct _RTL_CRITICAL_SECTION *CriticalSection;
-    LIST_ENTRY ProcessLocksList;
-    DWORD EntryCount;
-    DWORD ContentionCount;
-    DWORD Spare[ 2 ];
-} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
-
-
-
-
-typedef struct _RTL_CRITICAL_SECTION {
-    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
-
-    
-    
-    
-    
-
-    LONG LockCount;
-    LONG RecursionCount;
-    HANDLE OwningThread;        
-    HANDLE LockSemaphore;
-    ULONG_PTR SpinCount;        
-} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
-
-typedef void (__stdcall * RTL_VERIFIER_DLL_LOAD_CALLBACK) (
-    PWSTR DllName,
-    PVOID DllBase,
-    SIZE_T DllSize,
-    PVOID Reserved
-    );
-
-typedef void (__stdcall * RTL_VERIFIER_DLL_UNLOAD_CALLBACK) (
-    PWSTR DllName,
-    PVOID DllBase,
-    SIZE_T DllSize,
-    PVOID Reserved
-    );
-
-typedef void (__stdcall * RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK) (
-    PVOID AllocationBase,
-    SIZE_T AllocationSize
-    );
-
-typedef struct _RTL_VERIFIER_THUNK_DESCRIPTOR {
-
-    PCHAR ThunkName;
-    PVOID ThunkOldAddress;
-    PVOID ThunkNewAddress;
-
-} RTL_VERIFIER_THUNK_DESCRIPTOR, *PRTL_VERIFIER_THUNK_DESCRIPTOR;
-
-typedef struct _RTL_VERIFIER_DLL_DESCRIPTOR {
-
-    PWCHAR DllName;
-    DWORD DllFlags;
-    PVOID DllAddress;
-    PRTL_VERIFIER_THUNK_DESCRIPTOR DllThunks;
-
-} RTL_VERIFIER_DLL_DESCRIPTOR, *PRTL_VERIFIER_DLL_DESCRIPTOR;
-
-typedef struct _RTL_VERIFIER_PROVIDER_DESCRIPTOR {
-
-    
-    
-    
-
-    DWORD Length;        
-    PRTL_VERIFIER_DLL_DESCRIPTOR ProviderDlls;
-    RTL_VERIFIER_DLL_LOAD_CALLBACK ProviderDllLoadCallback;
-    RTL_VERIFIER_DLL_UNLOAD_CALLBACK ProviderDllUnloadCallback;
-    
-    
-    
-    
-        
-    PWSTR VerifierImage;
-    DWORD VerifierFlags;
-    DWORD VerifierDebug;
-    
-    PVOID RtlpGetStackTraceAddress;
-    PVOID RtlpDebugPageHeapCreate;
-    PVOID RtlpDebugPageHeapDestroy;
-
-    
-    
-    
-    
-    RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK ProviderNtdllHeapFreeCallback;
-
-} RTL_VERIFIER_PROVIDER_DESCRIPTOR, *PRTL_VERIFIER_PROVIDER_DESCRIPTOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void
-__stdcall
-RtlApplicationVerifierStop (
-         ULONG_PTR Code,
-         PSTR Message,
-         ULONG_PTR Param1,
-         PSTR Description1,
-         ULONG_PTR Param2,
-         PSTR Description2,
-         ULONG_PTR Param3,
-         PSTR Description3,
-         ULONG_PTR Param4,
-         PSTR Description4
-    );
-
-typedef LONG (__stdcall *PVECTORED_EXCEPTION_HANDLER)(
-    struct _EXCEPTION_POINTERS *ExceptionInfo
-    );
-
-
-
-
-
-
-
-
-typedef enum _HEAP_INFORMATION_CLASS {
-
-    HeapCompatibilityInformation
-
-} HEAP_INFORMATION_CLASS;
-
-__declspec(dllimport)
-DWORD   
-__stdcall
-RtlSetHeapInformation (
-     PVOID HeapHandle,
-     HEAP_INFORMATION_CLASS HeapInformationClass,
-     PVOID HeapInformation ,
-     SIZE_T HeapInformationLength 
-    );
-
-__declspec(dllimport)
-DWORD   
-__stdcall
-RtlQueryHeapInformation (
-     PVOID HeapHandle,
-     HEAP_INFORMATION_CLASS HeapInformationClass,
-     PVOID HeapInformation ,
-     SIZE_T HeapInformationLength ,
-     PSIZE_T ReturnLength 
-    );
-
-
-
-
-
-DWORD
-__stdcall
-RtlMultipleAllocateHeap (
-     PVOID HeapHandle,
-     DWORD Flags,
-     SIZE_T Size,
-     DWORD Count,
-     PVOID * Array
-    );
-
-DWORD
-__stdcall
-RtlMultipleFreeHeap (
-     PVOID HeapHandle,
-     DWORD Flags,
-     DWORD Count,
-     PVOID * Array
-    );
-    
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );   
-typedef void (__stdcall * WORKERCALLBACKFUNC) (PVOID );                 
-typedef void (__stdcall * APC_CALLBACK_FUNCTION) (DWORD   , PVOID, PVOID); 
-typedef
-void
-(__stdcall *PFLS_CALLBACK_FUNCTION) (
-     PVOID lpFlsData
-    );
-
-
-
-typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {
-    ActivationContextBasicInformation                       = 1,
-    ActivationContextDetailedInformation                    = 2,
-    AssemblyDetailedInformationInActivationContext          = 3,
-    FileInformationInAssemblyOfAssemblyInActivationContext  = 4,
-    MaxActivationContextInfoClass,
-
-    
-    
-    
-    AssemblyDetailedInformationInActivationContxt           = 3,
-    FileInformationInAssemblyOfAssemblyInActivationContxt   = 4
-} ACTIVATION_CONTEXT_INFO_CLASS;
-
-
-
-
-typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {
-    DWORD ulAssemblyIndex; 
-    DWORD ulFileIndexInAssembly; 
-} ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;
-
-typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;
-
-
-
-
-
-
-
-typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
-    DWORD ulFlags;
-    DWORD ulFilenameLength;
-    DWORD ulPathLength; 
-
-    PCWSTR lpFileName;
-    PCWSTR lpFilePath;   
-} ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;
-typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
-    DWORD ulFlags;
-    DWORD ulEncodedAssemblyIdentityLength;      
-    DWORD ulManifestPathType;                   
-    DWORD ulManifestPathLength;                 
-    LARGE_INTEGER liManifestLastWriteTime;      
-    DWORD ulPolicyPathType;                     
-    DWORD ulPolicyPathLength;                   
-    LARGE_INTEGER liPolicyLastWriteTime;        
-    DWORD ulMetadataSatelliteRosterIndex;
-    
-    DWORD ulManifestVersionMajor;               
-    DWORD ulManifestVersionMinor;               
-    DWORD ulPolicyVersionMajor;                 
-    DWORD ulPolicyVersionMinor;                 
-    DWORD ulAssemblyDirectoryNameLength;        
-
-    PCWSTR lpAssemblyEncodedAssemblyIdentity;
-    PCWSTR lpAssemblyManifestPath;
-    PCWSTR lpAssemblyPolicyPath;
-    PCWSTR lpAssemblyDirectoryName;
-
-    DWORD  ulFileCount;
-} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
-
-typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;
-
-typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
-    DWORD dwFlags;
-    DWORD ulFormatVersion;
-    DWORD ulAssemblyCount;
-    DWORD ulRootManifestPathType;
-    DWORD ulRootManifestPathChars;
-    DWORD ulRootConfigurationPathType;
-    DWORD ulRootConfigurationPathChars;
-    DWORD ulAppDirPathType;
-    DWORD ulAppDirPathChars;
-    PCWSTR lpRootManifestPath;
-    PCWSTR lpRootConfigurationPath;
-    PCWSTR lpAppDirPath;
-} ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
-
-typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _EVENTLOGRECORD {
-    DWORD  Length;        
-    DWORD  Reserved;      
-    DWORD  RecordNumber;  
-    DWORD  TimeGenerated; 
-    DWORD  TimeWritten;   
-    DWORD  EventID;
-    WORD   EventType;
-    WORD   NumStrings;
-    WORD   EventCategory;
-    WORD   ReservedFlags; 
-    DWORD  ClosingRecordNumber; 
-    DWORD  StringOffset;  
-    DWORD  UserSidLength;
-    DWORD  UserSidOffset;
-    DWORD  DataLength;
-    DWORD  DataOffset;    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-} EVENTLOGRECORD, *PEVENTLOGRECORD;
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable : 4200)
-typedef struct _EVENTSFORLOGFILE{
-	DWORD			ulSize;
-    WCHAR   		szLogicalLogFile[256];        
-    DWORD			ulNumRecords;
-	EVENTLOGRECORD 	pEventLogRecords[];
-}EVENTSFORLOGFILE, *PEVENTSFORLOGFILE;
-
-typedef struct _PACKEDEVENTINFO{
-    DWORD               ulSize;  
-    DWORD               ulNumEventsForLogFile; 
-    DWORD 				ulOffsets[];           
-}PACKEDEVENTINFO, *PPACKEDEVENTINFO;
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                    
-
-
-                                                    
-
-
-                                                    
-
-
-                                                    
-                                                    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _CM_SERVICE_NODE_TYPE {
-    DriverType               = 0x00000001,
-    FileSystemType           = 0x00000002,
-    Win32ServiceOwnProcess   = 0x00000010,
-    Win32ServiceShareProcess = 0x00000020,
-    AdapterType              = 0x00000004,
-    RecognizerType           = 0x00000008
-} SERVICE_NODE_TYPE;
-
-typedef enum _CM_SERVICE_LOAD_TYPE {
-    BootLoad    = 0x00000000,
-    SystemLoad  = 0x00000001,
-    AutoLoad    = 0x00000002,
-    DemandLoad  = 0x00000003,
-    DisableLoad = 0x00000004
-} SERVICE_LOAD_TYPE;
-
-typedef enum _CM_ERROR_CONTROL_TYPE {
-    IgnoreError   = 0x00000000,
-    NormalError   = 0x00000001,
-    SevereError   = 0x00000002,
-    CriticalError = 0x00000003
-} SERVICE_ERROR_TYPE;
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_ERASE {
-    DWORD Type;
-    BOOLEAN Immediate;
-} TAPE_ERASE, *PTAPE_ERASE;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_PREPARE {
-    DWORD Operation;
-    BOOLEAN Immediate;
-} TAPE_PREPARE, *PTAPE_PREPARE;
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_WRITE_MARKS {
-    DWORD Type;
-    DWORD Count;
-    BOOLEAN Immediate;
-} TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_GET_POSITION {
-    DWORD Type;
-    DWORD Partition;
-    LARGE_INTEGER Offset;
-} TAPE_GET_POSITION, *PTAPE_GET_POSITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_SET_POSITION {
-    DWORD Method;
-    DWORD Partition;
-    LARGE_INTEGER Offset;
-    BOOLEAN Immediate;
-} TAPE_SET_POSITION, *PTAPE_SET_POSITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_GET_DRIVE_PARAMETERS {
-    BOOLEAN ECC;
-    BOOLEAN Compression;
-    BOOLEAN DataPadding;
-    BOOLEAN ReportSetmarks;
-    DWORD DefaultBlockSize;
-    DWORD MaximumBlockSize;
-    DWORD MinimumBlockSize;
-    DWORD MaximumPartitionCount;
-    DWORD FeaturesLow;
-    DWORD FeaturesHigh;
-    DWORD EOTWarningZoneSize;
-} TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;
-
-
-
-
-
-typedef struct _TAPE_SET_DRIVE_PARAMETERS {
-    BOOLEAN ECC;
-    BOOLEAN Compression;
-    BOOLEAN DataPadding;
-    BOOLEAN ReportSetmarks;
-    DWORD EOTWarningZoneSize;
-} TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;
-
-
-
-
-
-typedef struct _TAPE_GET_MEDIA_PARAMETERS {
-    LARGE_INTEGER Capacity;
-    LARGE_INTEGER Remaining;
-    DWORD BlockSize;
-    DWORD PartitionCount;
-    BOOLEAN WriteProtected;
-} TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;
-
-
-
-
-
-typedef struct _TAPE_SET_MEDIA_PARAMETERS {
-    DWORD BlockSize;
-} TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_CREATE_PARTITION {
-    DWORD Method;
-    DWORD Count;
-    DWORD Size;
-} TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_WMI_OPERATIONS {
-   DWORD Method;
-   DWORD DataBufferSize;
-   PVOID DataBuffer;
-} TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
-
-
-
-
-typedef enum _TAPE_DRIVE_PROBLEM_TYPE {
-   TapeDriveProblemNone, TapeDriveReadWriteWarning,
-   TapeDriveReadWriteError, TapeDriveReadWarning,
-   TapeDriveWriteWarning, TapeDriveReadError,
-   TapeDriveWriteError, TapeDriveHardwareError,
-   TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError,
-   TapeDriveTimetoClean, TapeDriveCleanDriveNow,
-   TapeDriveMediaLifeExpired, TapeDriveSnappedTape
-} TAPE_DRIVE_PROBLEM_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline struct _TEB * NtCurrentTeb( void ) { return (struct _TEB *) (ULONG_PTR) __readfsdword (0x18); }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR            WPARAM;
-typedef LONG_PTR            LPARAM;
-typedef LONG_PTR            LRESULT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
-struct HHOOK__ { int unused; }; typedef struct HHOOK__ *HHOOK;
-
-
-
-
-
-typedef WORD                ATOM;
-
-typedef HANDLE          *SPHANDLE;
-typedef HANDLE           *LPHANDLE;
-typedef HANDLE              HGLOBAL;
-typedef HANDLE              HLOCAL;
-typedef HANDLE              GLOBALHANDLE;
-typedef HANDLE              LOCALHANDLE;
-
-
-
-
-
-
-typedef int ( __stdcall *FARPROC)();
-typedef int ( __stdcall *NEARPROC)();
-typedef int (__stdcall *PROC)();
-
-
-
-
-
-
-
-
-
-typedef void * HGDIOBJ;
-
-
-
-
-
-struct HKEY__ { int unused; }; typedef struct HKEY__ *HKEY;
-typedef HKEY *PHKEY;
-
-
-struct HACCEL__ { int unused; }; typedef struct HACCEL__ *HACCEL;
-
-
-struct HBITMAP__ { int unused; }; typedef struct HBITMAP__ *HBITMAP;
-struct HBRUSH__ { int unused; }; typedef struct HBRUSH__ *HBRUSH;
-
-
-struct HCOLORSPACE__ { int unused; }; typedef struct HCOLORSPACE__ *HCOLORSPACE;
-
-
-struct HDC__ { int unused; }; typedef struct HDC__ *HDC;
-
-struct HGLRC__ { int unused; }; typedef struct HGLRC__ *HGLRC;          
-struct HDESK__ { int unused; }; typedef struct HDESK__ *HDESK;
-struct HENHMETAFILE__ { int unused; }; typedef struct HENHMETAFILE__ *HENHMETAFILE;
-
-struct HFONT__ { int unused; }; typedef struct HFONT__ *HFONT;
-
-struct HICON__ { int unused; }; typedef struct HICON__ *HICON;
-
-struct HMENU__ { int unused; }; typedef struct HMENU__ *HMENU;
-
-struct HMETAFILE__ { int unused; }; typedef struct HMETAFILE__ *HMETAFILE;
-struct HINSTANCE__ { int unused; }; typedef struct HINSTANCE__ *HINSTANCE;
-typedef HINSTANCE HMODULE;      
-
-struct HPALETTE__ { int unused; }; typedef struct HPALETTE__ *HPALETTE;
-struct HPEN__ { int unused; }; typedef struct HPEN__ *HPEN;
-
-struct HRGN__ { int unused; }; typedef struct HRGN__ *HRGN;
-struct HRSRC__ { int unused; }; typedef struct HRSRC__ *HRSRC;
-struct HSTR__ { int unused; }; typedef struct HSTR__ *HSTR;
-struct HTASK__ { int unused; }; typedef struct HTASK__ *HTASK;
-struct HWINSTA__ { int unused; }; typedef struct HWINSTA__ *HWINSTA;
-struct HKL__ { int unused; }; typedef struct HKL__ *HKL;
-
-
-
-struct HMONITOR__ { int unused; }; typedef struct HMONITOR__ *HMONITOR;
-struct HWINEVENTHOOK__ { int unused; }; typedef struct HWINEVENTHOOK__ *HWINEVENTHOOK;
-
-struct HUMPD__ { int unused; }; typedef struct HUMPD__ *HUMPD;
-
-
-
-typedef int HFILE;
-typedef HICON HCURSOR;      
-
-
-
-
-
-typedef DWORD   COLORREF;
-typedef DWORD   *LPCOLORREF;
-
-
-
-typedef struct tagRECT
-{
-    LONG    left;
-    LONG    top;
-    LONG    right;
-    LONG    bottom;
-} RECT, *PRECT,  *NPRECT,  *LPRECT;
-
-typedef const RECT * LPCRECT;
-
-typedef struct _RECTL       
-{
-    LONG    left;
-    LONG    top;
-    LONG    right;
-    LONG    bottom;
-} RECTL, *PRECTL, *LPRECTL;
-
-typedef const RECTL * LPCRECTL;
-
-typedef struct tagPOINT
-{
-    LONG  x;
-    LONG  y;
-} POINT, *PPOINT,  *NPPOINT,  *LPPOINT;
-
-typedef struct _POINTL      
-{
-    LONG  x;
-    LONG  y;
-} POINTL, *PPOINTL;
-
-typedef struct tagSIZE
-{
-    LONG        cx;
-    LONG        cy;
-} SIZE, *PSIZE, *LPSIZE;
-
-typedef SIZE               SIZEL;
-typedef SIZE               *PSIZEL, *LPSIZEL;
-
-typedef struct tagPOINTS
-{
-
-    SHORT   x;
-    SHORT   y;
-
-
-
-
-} POINTS, *PPOINTS, *LPPOINTS;
-
-
-
-
-
-typedef struct _FILETIME {
-    DWORD dwLowDateTime;
-    DWORD dwHighDateTime;
-} FILETIME, *PFILETIME, *LPFILETIME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OVERLAPPED {
-    ULONG_PTR Internal;
-    ULONG_PTR InternalHigh;
-    union {
-        struct {
-            DWORD Offset;
-            DWORD OffsetHigh;
-        };
-
-        PVOID Pointer;
-    };
-
-    HANDLE  hEvent;
-} OVERLAPPED, *LPOVERLAPPED;
-
-typedef struct _SECURITY_ATTRIBUTES {
-    DWORD nLength;
-    LPVOID lpSecurityDescriptor;
-    BOOL bInheritHandle;
-} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
-
-typedef struct _PROCESS_INFORMATION {
-    HANDLE hProcess;
-    HANDLE hThread;
-    DWORD dwProcessId;
-    DWORD dwThreadId;
-} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SYSTEMTIME {
-    WORD wYear;
-    WORD wMonth;
-    WORD wDayOfWeek;
-    WORD wDay;
-    WORD wHour;
-    WORD wMinute;
-    WORD wSecond;
-    WORD wMilliseconds;
-} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
-
-
-typedef DWORD (__stdcall *PTHREAD_START_ROUTINE)(
-    LPVOID lpThreadParameter
-    );
-typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
-
-
-typedef void (__stdcall *PFIBER_START_ROUTINE)(
-    LPVOID lpFiberParameter
-    );
-typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE;
-
-
-typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;
-typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION;
-typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION;
-
-typedef RTL_CRITICAL_SECTION_DEBUG CRITICAL_SECTION_DEBUG;
-typedef PRTL_CRITICAL_SECTION_DEBUG PCRITICAL_SECTION_DEBUG;
-typedef PRTL_CRITICAL_SECTION_DEBUG LPCRITICAL_SECTION_DEBUG;
-
-__declspec(dllimport)
-      
-PVOID
-__stdcall
-EncodePointer (
-           PVOID Ptr
-    );
-
-__declspec(dllimport)
-      
-PVOID
-__stdcall
-DecodePointer (
-           PVOID Ptr
-    );
-
-__declspec(dllimport)
-      
-PVOID
-__stdcall
-EncodeSystemPointer (
-           PVOID Ptr
-    );
-
-__declspec(dllimport)
-      
-PVOID
-__stdcall
-DecodeSystemPointer (
-           PVOID Ptr
-    );
-
-
-typedef PLDT_ENTRY LPLDT_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _COMMPROP {
-    WORD wPacketLength;
-    WORD wPacketVersion;
-    DWORD dwServiceMask;
-    DWORD dwReserved1;
-    DWORD dwMaxTxQueue;
-    DWORD dwMaxRxQueue;
-    DWORD dwMaxBaud;
-    DWORD dwProvSubType;
-    DWORD dwProvCapabilities;
-    DWORD dwSettableParams;
-    DWORD dwSettableBaud;
-    WORD wSettableData;
-    WORD wSettableStopParity;
-    DWORD dwCurrentTxQueue;
-    DWORD dwCurrentRxQueue;
-    DWORD dwProvSpec1;
-    DWORD dwProvSpec2;
-    WCHAR wcProvChar[1];
-} COMMPROP,*LPCOMMPROP;
-
-
-
-
-
-
-
-typedef struct _COMSTAT {
-    DWORD fCtsHold : 1;
-    DWORD fDsrHold : 1;
-    DWORD fRlsdHold : 1;
-    DWORD fXoffHold : 1;
-    DWORD fXoffSent : 1;
-    DWORD fEof : 1;
-    DWORD fTxim : 1;
-    DWORD fReserved : 25;
-    DWORD cbInQue;
-    DWORD cbOutQue;
-} COMSTAT, *LPCOMSTAT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DCB {
-    DWORD DCBlength;      
-    DWORD BaudRate;       
-    DWORD fBinary: 1;     
-    DWORD fParity: 1;     
-    DWORD fOutxCtsFlow:1; 
-    DWORD fOutxDsrFlow:1; 
-    DWORD fDtrControl:2;  
-    DWORD fDsrSensitivity:1; 
-    DWORD fTXContinueOnXoff: 1; 
-    DWORD fOutX: 1;       
-    DWORD fInX: 1;        
-    DWORD fErrorChar: 1;  
-    DWORD fNull: 1;       
-    DWORD fRtsControl:2;  
-    DWORD fAbortOnError:1; 
-    DWORD fDummy2:17;     
-    WORD wReserved;       
-    WORD XonLim;          
-    WORD XoffLim;         
-    BYTE ByteSize;        
-    BYTE Parity;          
-    BYTE StopBits;        
-    char XonChar;         
-    char XoffChar;        
-    char ErrorChar;       
-    char EofChar;         
-    char EvtChar;         
-    WORD wReserved1;      
-} DCB, *LPDCB;
-
-typedef struct _COMMTIMEOUTS {
-    DWORD ReadIntervalTimeout;          
-    DWORD ReadTotalTimeoutMultiplier;   
-    DWORD ReadTotalTimeoutConstant;     
-    DWORD WriteTotalTimeoutMultiplier;  
-    DWORD WriteTotalTimeoutConstant;    
-} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
-
-typedef struct _COMMCONFIG {
-    DWORD dwSize;               
-    WORD wVersion;              
-    WORD wReserved;             
-    DCB dcb;                    
-    DWORD dwProviderSubType;    
-
-    DWORD dwProviderOffset;     
-
-    DWORD dwProviderSize;       
-    WCHAR wcProviderData[1];    
-} COMMCONFIG,*LPCOMMCONFIG;
-
-typedef struct _SYSTEM_INFO {
-    union {
-        DWORD dwOemId;          
-        struct {
-            WORD wProcessorArchitecture;
-            WORD wReserved;
-        };
-    };
-    DWORD dwPageSize;
-    LPVOID lpMinimumApplicationAddress;
-    LPVOID lpMaximumApplicationAddress;
-    DWORD_PTR dwActiveProcessorMask;
-    DWORD dwNumberOfProcessors;
-    DWORD dwProcessorType;
-    DWORD dwAllocationGranularity;
-    WORD wProcessorLevel;
-    WORD wProcessorRevision;
-} SYSTEM_INFO, *LPSYSTEM_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _MEMORYSTATUS {
-    DWORD dwLength;
-    DWORD dwMemoryLoad;
-    SIZE_T dwTotalPhys;
-    SIZE_T dwAvailPhys;
-    SIZE_T dwTotalPageFile;
-    SIZE_T dwAvailPageFile;
-    SIZE_T dwTotalVirtual;
-    SIZE_T dwAvailVirtual;
-} MEMORYSTATUS, *LPMEMORYSTATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _EXCEPTION_DEBUG_INFO {
-    EXCEPTION_RECORD ExceptionRecord;
-    DWORD dwFirstChance;
-} EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO;
-
-typedef struct _CREATE_THREAD_DEBUG_INFO {
-    HANDLE hThread;
-    LPVOID lpThreadLocalBase;
-    LPTHREAD_START_ROUTINE lpStartAddress;
-} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
-
-typedef struct _CREATE_PROCESS_DEBUG_INFO {
-    HANDLE hFile;
-    HANDLE hProcess;
-    HANDLE hThread;
-    LPVOID lpBaseOfImage;
-    DWORD dwDebugInfoFileOffset;
-    DWORD nDebugInfoSize;
-    LPVOID lpThreadLocalBase;
-    LPTHREAD_START_ROUTINE lpStartAddress;
-    LPVOID lpImageName;
-    WORD fUnicode;
-} CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO;
-
-typedef struct _EXIT_THREAD_DEBUG_INFO {
-    DWORD dwExitCode;
-} EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO;
-
-typedef struct _EXIT_PROCESS_DEBUG_INFO {
-    DWORD dwExitCode;
-} EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO;
-
-typedef struct _LOAD_DLL_DEBUG_INFO {
-    HANDLE hFile;
-    LPVOID lpBaseOfDll;
-    DWORD dwDebugInfoFileOffset;
-    DWORD nDebugInfoSize;
-    LPVOID lpImageName;
-    WORD fUnicode;
-} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;
-
-typedef struct _UNLOAD_DLL_DEBUG_INFO {
-    LPVOID lpBaseOfDll;
-} UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO;
-
-typedef struct _OUTPUT_DEBUG_STRING_INFO {
-    LPSTR lpDebugStringData;
-    WORD fUnicode;
-    WORD nDebugStringLength;
-} OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO;
-
-typedef struct _RIP_INFO {
-    DWORD dwError;
-    DWORD dwType;
-} RIP_INFO, *LPRIP_INFO;
-
-
-typedef struct _DEBUG_EVENT {
-    DWORD dwDebugEventCode;
-    DWORD dwProcessId;
-    DWORD dwThreadId;
-    union {
-        EXCEPTION_DEBUG_INFO Exception;
-        CREATE_THREAD_DEBUG_INFO CreateThread;
-        CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
-        EXIT_THREAD_DEBUG_INFO ExitThread;
-        EXIT_PROCESS_DEBUG_INFO ExitProcess;
-        LOAD_DLL_DEBUG_INFO LoadDll;
-        UNLOAD_DLL_DEBUG_INFO UnloadDll;
-        OUTPUT_DEBUG_STRING_INFO DebugString;
-        RIP_INFO RipInfo;
-    } u;
-} DEBUG_EVENT, *LPDEBUG_EVENT;
-
-
-typedef PCONTEXT LPCONTEXT;
-typedef PEXCEPTION_RECORD LPEXCEPTION_RECORD;
-typedef PEXCEPTION_POINTERS LPEXCEPTION_POINTERS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OFSTRUCT {
-    BYTE cBytes;
-    BYTE fFixedDisk;
-    WORD nErrCode;
-    WORD Reserved1;
-    WORD Reserved2;
-    CHAR szPathName[128];
-} OFSTRUCT, *LPOFSTRUCT, *POFSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedIncrement (
-         LONG volatile *lpAddend
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedDecrement (
-         LONG volatile *lpAddend
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedExchange (
-         LONG volatile *Target,
-            LONG Value
-    );
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedExchangeAdd (
-         LONG volatile *Addend,
-            LONG Value
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedCompareExchange (
-         LONG volatile *Destination,
-            LONG Exchange,
-            LONG Comperand
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__forceinline
-PVOID
-
-__cdecl
-
-__InlineInterlockedCompareExchangePointer (
-          PVOID volatile *Destination,
-           PVOID ExChange,
-           PVOID Comperand
-    )
-{
-    return((PVOID)(LONG_PTR)InterlockedCompareExchange((LONG volatile *)Destination, (LONG)(LONG_PTR)ExChange, (LONG)(LONG_PTR)Comperand));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-InitializeSListHead (
-         PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-InterlockedPopEntrySList (
-         PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-InterlockedPushEntrySList (
-         PSLIST_HEADER ListHead,
-         PSINGLE_LIST_ENTRY ListEntry
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-InterlockedFlushSList (
-         PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-USHORT
-__stdcall
-QueryDepthSList (
-         PSLIST_HEADER ListHead
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeResource(
-         HGLOBAL hResData
-    );
-
-__declspec(dllimport)
-LPVOID
-__stdcall
-LockResource(
-         HGLOBAL hResData
-    );
-
-
-
-
-
-
-int
-
-
-
-
-__stdcall
-
-
-
-
-WinMain (
-         HINSTANCE hInstance,
-           HINSTANCE hPrevInstance,
-           LPSTR lpCmdLine,
-         int nShowCmd
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeLibrary (
-         HMODULE hLibModule
-    );
-
-
-__declspec(dllimport)
-__declspec(noreturn)
-void
-__stdcall
-FreeLibraryAndExitThread (
-         HMODULE hLibModule,
-         DWORD dwExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DisableThreadLibraryCalls (
-         HMODULE hLibModule
-    );
-
-__declspec(dllimport)
-FARPROC
-__stdcall
-GetProcAddress (
-         HMODULE hModule,
-         LPCSTR lpProcName
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetVersion (
-    void
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-GlobalAlloc (
-         UINT uFlags,
-         SIZE_T dwBytes
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-GlobalReAlloc (
-         HGLOBAL hMem,
-         SIZE_T dwBytes,
-         UINT uFlags
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-GlobalSize (
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-GlobalFlags (
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-GlobalLock ( 
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-GlobalHandle (
-         LPCVOID pMem
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GlobalUnlock(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-GlobalFree(
-     HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-GlobalCompact(
-         DWORD dwMinFree
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GlobalFix(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GlobalUnfix(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-GlobalWire(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GlobalUnWire(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GlobalMemoryStatus(
-         LPMEMORYSTATUS lpBuffer
-    );
-
-typedef struct _MEMORYSTATUSEX {
-    DWORD dwLength;
-    DWORD dwMemoryLoad;
-    DWORDLONG ullTotalPhys;
-    DWORDLONG ullAvailPhys;
-    DWORDLONG ullTotalPageFile;
-    DWORDLONG ullAvailPageFile;
-    DWORDLONG ullTotalVirtual;
-    DWORDLONG ullAvailVirtual;
-    DWORDLONG ullAvailExtendedVirtual;
-} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GlobalMemoryStatusEx(
-         LPMEMORYSTATUSEX lpBuffer
-    );
-
-__declspec(dllimport)
-    
-HLOCAL
-__stdcall
-LocalAlloc(
-         UINT uFlags,
-         SIZE_T uBytes
-    );
-
-__declspec(dllimport)
-    
-HLOCAL
-__stdcall
-LocalReAlloc(
-         HLOCAL hMem,
-         SIZE_T uBytes,
-         UINT uFlags
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-LocalLock(
-         HLOCAL hMem
-    );
-
-__declspec(dllimport)
-    
-HLOCAL
-__stdcall
-LocalHandle(
-         LPCVOID pMem
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LocalUnlock(
-         HLOCAL hMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-LocalSize(
-         HLOCAL hMem
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-LocalFlags(
-         HLOCAL hMem
-    );
-
-__declspec(dllimport)
-HLOCAL
-__stdcall
-LocalFree(
-     HLOCAL hMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-LocalShrink(
-         HLOCAL hMem,
-         UINT cbNewSize
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-LocalCompact(
-         UINT uMinFree
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlushInstructionCache(
-         HANDLE hProcess,
-             LPCVOID lpBaseAddress,
-         SIZE_T dwSize
-    );
-
-__declspec(dllimport)
- 
-LPVOID
-__stdcall
-VirtualAlloc(
-           LPVOID lpAddress,
-             SIZE_T dwSize,
-             DWORD flAllocationType,
-             DWORD flProtect
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualFree(
-         LPVOID lpAddress,
-         SIZE_T dwSize,
-         DWORD dwFreeType
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualProtect(
-          LPVOID lpAddress,
-          SIZE_T dwSize,
-          DWORD flNewProtect,
-         PDWORD lpflOldProtect
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-VirtualQuery(
-           LPCVOID lpAddress,
-           PMEMORY_BASIC_INFORMATION lpBuffer,
-             SIZE_T dwLength
-    );
-
-__declspec(dllimport)
- 
-LPVOID
-__stdcall
-VirtualAllocEx(
-             HANDLE hProcess,
-           LPVOID lpAddress,
-             SIZE_T dwSize,
-             DWORD flAllocationType,
-             DWORD flProtect
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetWriteWatch(
-         DWORD dwFlags,
-         PVOID lpBaseAddress,
-         SIZE_T dwRegionSize,
-           PVOID *lpAddresses,
-         ULONG_PTR *lpdwCount,
-         PULONG lpdwGranularity
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-ResetWriteWatch(
-         LPVOID lpBaseAddress,
-         SIZE_T dwRegionSize
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-GetLargePageMinimum(
-    void
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-EnumSystemFirmwareTables(
-         DWORD FirmwareTableProviderSignature,
-             PVOID pFirmwareTableEnumBuffer,
-         DWORD BufferSize
-    );
-    
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemFirmwareTable(
-         DWORD FirmwareTableProviderSignature,
-         DWORD FirmwareTableID,
-             PVOID pFirmwareTableBuffer,
-         DWORD BufferSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualFreeEx(
-         HANDLE hProcess,
-         LPVOID lpAddress,
-         SIZE_T dwSize,
-         DWORD  dwFreeType
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualProtectEx(
-          HANDLE hProcess,
-          LPVOID lpAddress,
-          SIZE_T dwSize,
-          DWORD flNewProtect,
-         PDWORD lpflOldProtect
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-VirtualQueryEx(
-             HANDLE hProcess,
-           LPCVOID lpAddress,
-           PMEMORY_BASIC_INFORMATION lpBuffer,
-             SIZE_T dwLength
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-HeapCreate(
-         DWORD flOptions,
-         SIZE_T dwInitialSize,
-         SIZE_T dwMaximumSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapDestroy(
-         HANDLE hHeap
-    );
-
-
-__declspec(dllimport)
- 
-LPVOID
-__stdcall
-HeapAlloc(
-         HANDLE hHeap,
-         DWORD dwFlags,
-         SIZE_T dwBytes
-    );
-
-__declspec(dllimport)
- 
-LPVOID
-__stdcall
-HeapReAlloc(
-         HANDLE hHeap,
-            DWORD dwFlags,
-     LPVOID lpMem,
-            SIZE_T dwBytes
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapFree(
-         HANDLE hHeap,
-            DWORD dwFlags,
-     LPVOID lpMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-HeapSize(
-         HANDLE hHeap,
-         DWORD dwFlags,
-         LPCVOID lpMem
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapValidate(
-             HANDLE hHeap,
-             DWORD dwFlags,
-           LPCVOID lpMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-HeapCompact(
-         HANDLE hHeap,
-         DWORD dwFlags
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-GetProcessHeap( void );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProcessHeaps(
-         DWORD NumberOfHeaps,
-           PHANDLE ProcessHeaps
-    );
-
-typedef struct _PROCESS_HEAP_ENTRY {
-    PVOID lpData;
-    DWORD cbData;
-    BYTE cbOverhead;
-    BYTE iRegionIndex;
-    WORD wFlags;
-    union {
-        struct {
-            HANDLE hMem;
-            DWORD dwReserved[ 3 ];
-        } Block;
-        struct {
-            DWORD dwCommittedSize;
-            DWORD dwUnCommittedSize;
-            LPVOID lpFirstBlock;
-            LPVOID lpLastBlock;
-        } Region;
-    };
-} PROCESS_HEAP_ENTRY, *LPPROCESS_HEAP_ENTRY, *PPROCESS_HEAP_ENTRY;
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapLock(
-         HANDLE hHeap
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapUnlock(
-         HANDLE hHeap
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapWalk(
-            HANDLE hHeap,
-         LPPROCESS_HEAP_ENTRY lpEntry
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapSetInformation (
-         HANDLE HeapHandle, 
-         HEAP_INFORMATION_CLASS HeapInformationClass,
-             PVOID HeapInformation,
-         SIZE_T HeapInformationLength
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapQueryInformation (
-              HANDLE HeapHandle, 
-              HEAP_INFORMATION_CLASS HeapInformationClass,
-             PVOID HeapInformation,
-              SIZE_T HeapInformationLength,
-           PSIZE_T ReturnLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetBinaryTypeA(
-          LPCSTR lpApplicationName,
-         LPDWORD  lpBinaryType
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetBinaryTypeW(
-          LPCWSTR lpApplicationName,
-         LPDWORD  lpBinaryType
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetShortPathNameA(
-         LPCSTR lpszLongPath,
-           LPSTR  lpszShortPath,
-         DWORD cchBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetShortPathNameW(
-         LPCWSTR lpszLongPath,
-           LPWSTR  lpszShortPath,
-         DWORD cchBuffer
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLongPathNameA(
-         LPCSTR lpszShortPath,
-           LPSTR  lpszLongPath,
-         DWORD cchBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLongPathNameW(
-         LPCWSTR lpszShortPath,
-           LPWSTR  lpszLongPath,
-         DWORD cchBuffer
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessAffinityMask(
-          HANDLE hProcess,
-         PDWORD_PTR lpProcessAffinityMask,
-         PDWORD_PTR lpSystemAffinityMask
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessAffinityMask(
-         HANDLE hProcess,
-         DWORD_PTR dwProcessAffinityMask
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessHandleCount(
-          HANDLE hProcess,
-         PDWORD pdwHandleCount
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessTimes(
-          HANDLE hProcess,
-         LPFILETIME lpCreationTime,
-         LPFILETIME lpExitTime,
-         LPFILETIME lpKernelTime,
-         LPFILETIME lpUserTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessIoCounters(
-          HANDLE hProcess,
-         PIO_COUNTERS lpIoCounters
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessWorkingSetSize(
-          HANDLE hProcess,
-         PSIZE_T lpMinimumWorkingSetSize,
-         PSIZE_T lpMaximumWorkingSetSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessWorkingSetSizeEx(
-          HANDLE hProcess,
-         PSIZE_T lpMinimumWorkingSetSize,
-         PSIZE_T lpMaximumWorkingSetSize,
-         PDWORD Flags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessWorkingSetSize(
-         HANDLE hProcess,
-         SIZE_T dwMinimumWorkingSetSize,
-         SIZE_T dwMaximumWorkingSetSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessWorkingSetSizeEx(
-         HANDLE hProcess,
-         SIZE_T dwMinimumWorkingSetSize,
-         SIZE_T dwMaximumWorkingSetSize,
-         DWORD Flags
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenProcess(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         DWORD dwProcessId
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-GetCurrentProcess(
-    void
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentProcessId(
-    void
-    );
-
-__declspec(dllimport)
-__declspec(noreturn)
-void
-__stdcall
-ExitProcess(
-         UINT uExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TerminateProcess(
-         HANDLE hProcess,
-         UINT uExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetExitCodeProcess(
-          HANDLE hProcess,
-         LPDWORD lpExitCode
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-FatalExit(
-         int ExitCode
-    );
-
-__declspec(dllimport)
-    
-
-LPCH
-__stdcall
-GetEnvironmentStrings(
-    void
-    );
-
-__declspec(dllimport)
-    
-
-LPWCH
-__stdcall
-GetEnvironmentStringsW(
-    void
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEnvironmentStringsA(
-          LPCH NewEnvironment
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEnvironmentStringsW(
-          LPWCH NewEnvironment
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeEnvironmentStringsA(
-          LPCH
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeEnvironmentStringsW(
-          LPWCH
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-RaiseException(
-         DWORD dwExceptionCode,
-         DWORD dwExceptionFlags,
-         DWORD nNumberOfArguments,
-             const ULONG_PTR *lpArguments
-    );
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-UnhandledExceptionFilter(
-         struct _EXCEPTION_POINTERS *ExceptionInfo
-    );
-
-typedef LONG (__stdcall *PTOP_LEVEL_EXCEPTION_FILTER)(
-         struct _EXCEPTION_POINTERS *ExceptionInfo
-    );
-typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
-
-__declspec(dllimport)
-LPTOP_LEVEL_EXCEPTION_FILTER
-__stdcall
-SetUnhandledExceptionFilter(
-         LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-CreateFiber(
-             SIZE_T dwStackSize,
-             LPFIBER_START_ROUTINE lpStartAddress,
-           LPVOID lpParameter
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-CreateFiberEx(
-             SIZE_T dwStackCommitSize,
-             SIZE_T dwStackReserveSize,
-             DWORD dwFlags,
-             LPFIBER_START_ROUTINE lpStartAddress,
-           LPVOID lpParameter
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-DeleteFiber(
-         LPVOID lpFiber
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-ConvertThreadToFiber(
-           LPVOID lpParameter
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-ConvertThreadToFiberEx(
-           LPVOID lpParameter,
-             DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ConvertFiberToThread(
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-SwitchToFiber(
-         LPVOID lpFiber
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SwitchToThread(
-    void
-    );
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateThread(
-            LPSECURITY_ATTRIBUTES lpThreadAttributes,
-              SIZE_T dwStackSize,
-              LPTHREAD_START_ROUTINE lpStartAddress,
-            LPVOID lpParameter,
-              DWORD dwCreationFlags,
-           LPDWORD lpThreadId
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateRemoteThread(
-              HANDLE hProcess,
-            LPSECURITY_ATTRIBUTES lpThreadAttributes,
-              SIZE_T dwStackSize,
-              LPTHREAD_START_ROUTINE lpStartAddress,
-            LPVOID lpParameter,
-              DWORD dwCreationFlags,
-           LPDWORD lpThreadId
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-GetCurrentThread(
-    void
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentThreadId(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadStackGuarantee (
-         PULONG StackSizeInBytes
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProcessIdOfThread(
-         HANDLE Thread
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetThreadId(
-         HANDLE Thread
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProcessId(
-         HANDLE Process
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentProcessorNumber(
-    void
-    );
-
-__declspec(dllimport)
-DWORD_PTR
-__stdcall
-SetThreadAffinityMask(
-         HANDLE hThread,
-         DWORD_PTR dwThreadAffinityMask
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetThreadIdealProcessor(
-         HANDLE hThread,
-         DWORD dwIdealProcessor
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessPriorityBoost(
-         HANDLE hProcess,
-         BOOL bDisablePriorityBoost
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessPriorityBoost(
-          HANDLE hProcess,
-         PBOOL  pDisablePriorityBoost
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RequestWakeupLatency(
-         LATENCY_TIME latency
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsSystemResumeAutomatic(
-    void
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenThread(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         DWORD dwThreadId
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadPriority(
-         HANDLE hThread,
-         int nPriority
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadPriorityBoost(
-         HANDLE hThread,
-         BOOL bDisablePriorityBoost
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadPriorityBoost(
-          HANDLE hThread,
-         PBOOL pDisablePriorityBoost
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-GetThreadPriority(
-         HANDLE hThread
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadTimes(
-          HANDLE hThread,
-         LPFILETIME lpCreationTime,
-         LPFILETIME lpExitTime,
-         LPFILETIME lpKernelTime,
-         LPFILETIME lpUserTime
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadIOPendingFlag(
-          HANDLE hThread,
-         PBOOL  lpIOIsPending
-    );
-
-
-
-__declspec(dllimport)
-__declspec(noreturn)
-void
-__stdcall
-ExitThread(
-         DWORD dwExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TerminateThread(
-         HANDLE hThread,
-         DWORD dwExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetExitCodeThread(
-          HANDLE hThread,
-         LPDWORD lpExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadSelectorEntry(
-          HANDLE hThread,
-          DWORD dwSelector,
-         LPLDT_ENTRY lpSelectorEntry
-    );
-
-__declspec(dllimport)
-EXECUTION_STATE
-__stdcall
-SetThreadExecutionState(
-         EXECUTION_STATE esFlags
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLastError(
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-SetLastError(
-         DWORD dwErrCode
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetOverlappedResult(
-          HANDLE hFile,
-          LPOVERLAPPED lpOverlapped,
-         LPDWORD lpNumberOfBytesTransferred,
-          BOOL bWait
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateIoCompletionPort(
-             HANDLE FileHandle,
-           HANDLE ExistingCompletionPort,
-             ULONG_PTR CompletionKey,
-             DWORD NumberOfConcurrentThreads
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetQueuedCompletionStatus(
-          HANDLE CompletionPort,
-         LPDWORD lpNumberOfBytesTransferred,
-         PULONG_PTR lpCompletionKey,
-         LPOVERLAPPED *lpOverlapped,
-          DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PostQueuedCompletionStatus(
-             HANDLE CompletionPort,
-             DWORD dwNumberOfBytesTransferred,
-             ULONG_PTR dwCompletionKey,
-           LPOVERLAPPED lpOverlapped
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-SetErrorMode(
-         UINT uMode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadProcessMemory(
-              HANDLE hProcess,
-              LPCVOID lpBaseAddress,
-           LPVOID lpBuffer,
-              SIZE_T nSize,
-           SIZE_T * lpNumberOfBytesRead
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProcessMemory(
-              HANDLE hProcess,
-              LPVOID lpBaseAddress,
-           LPCVOID lpBuffer,
-              SIZE_T nSize,
-           SIZE_T * lpNumberOfBytesWritten
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadContext(
-            HANDLE hThread,
-         LPCONTEXT lpContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadContext(
-         HANDLE hThread,
-         const CONTEXT *lpContext
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SuspendThread(
-         HANDLE hThread
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-ResumeThread(
-         HANDLE hThread
-    );
-
-
-
-
-typedef
-void
-(__stdcall *PAPCFUNC)(
-         ULONG_PTR dwParam
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-QueueUserAPC(
-         PAPCFUNC pfnAPC,
-         HANDLE hThread,
-         ULONG_PTR dwData
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDebuggerPresent(
-    void
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckRemoteDebuggerPresent(
-          HANDLE hProcess,
-         PBOOL pbDebuggerPresent
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-DebugBreak(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitForDebugEvent(
-         LPDEBUG_EVENT lpDebugEvent,
-         DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ContinueDebugEvent(
-         DWORD dwProcessId,
-         DWORD dwThreadId,
-         DWORD dwContinueStatus
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DebugActiveProcess(
-         DWORD dwProcessId
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DebugActiveProcessStop(
-         DWORD dwProcessId
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DebugSetProcessKillOnExit(
-         BOOL KillOnExit
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DebugBreakProcess (
-         HANDLE Process
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-InitializeCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-EnterCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-LeaveCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitializeCriticalSectionAndSpinCount(
-         LPCRITICAL_SECTION lpCriticalSection,
-          DWORD dwSpinCount
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetCriticalSectionSpinCount(
-         LPCRITICAL_SECTION lpCriticalSection,
-            DWORD dwSpinCount
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TryEnterCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-DeleteCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEvent(
-         HANDLE hEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ResetEvent(
-         HANDLE hEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PulseEvent(
-         HANDLE hEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReleaseSemaphore(
-              HANDLE hSemaphore,
-              LONG lReleaseCount,
-           LPLONG lpPreviousCount
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReleaseMutex(
-         HANDLE hMutex
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForSingleObject(
-         HANDLE hHandle,
-         DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForMultipleObjects(
-         DWORD nCount,
-           const HANDLE *lpHandles,
-         BOOL bWaitAll,
-         DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-Sleep(
-         DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-LoadResource(
-           HMODULE hModule,
-         HRSRC hResInfo
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SizeofResource(
-           HMODULE hModule,
-         HRSRC hResInfo
-    );
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalDeleteAtom(
-         ATOM nAtom
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitAtomTable(
-         DWORD nSize
-    );
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-DeleteAtom(
-         ATOM nAtom
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-SetHandleCount(
-         UINT uNumber
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLogicalDrives(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockFile(
-         HANDLE hFile,
-         DWORD dwFileOffsetLow,
-         DWORD dwFileOffsetHigh,
-         DWORD nNumberOfBytesToLockLow,
-         DWORD nNumberOfBytesToLockHigh
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnlockFile(
-         HANDLE hFile,
-         DWORD dwFileOffsetLow,
-         DWORD dwFileOffsetHigh,
-         DWORD nNumberOfBytesToUnlockLow,
-         DWORD nNumberOfBytesToUnlockHigh
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockFileEx(
-               HANDLE hFile,
-               DWORD dwFlags,
-      DWORD dwReserved,
-               DWORD nNumberOfBytesToLockLow,
-               DWORD nNumberOfBytesToLockHigh,
-            LPOVERLAPPED lpOverlapped
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnlockFileEx(
-               HANDLE hFile,
-      DWORD dwReserved,
-               DWORD nNumberOfBytesToUnlockLow,
-               DWORD nNumberOfBytesToUnlockHigh,
-            LPOVERLAPPED lpOverlapped
-    );
-
-typedef struct _BY_HANDLE_FILE_INFORMATION {
-    DWORD dwFileAttributes;
-    FILETIME ftCreationTime;
-    FILETIME ftLastAccessTime;
-    FILETIME ftLastWriteTime;
-    DWORD dwVolumeSerialNumber;
-    DWORD nFileSizeHigh;
-    DWORD nFileSizeLow;
-    DWORD nNumberOfLinks;
-    DWORD nFileIndexHigh;
-    DWORD nFileIndexLow;
-} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileInformationByHandle(
-          HANDLE hFile,
-         LPBY_HANDLE_FILE_INFORMATION lpFileInformation
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFileType(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFileSize(
-              HANDLE hFile,
-           LPDWORD lpFileSizeHigh
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileSizeEx(
-          HANDLE hFile,
-         PLARGE_INTEGER lpFileSize
-    );
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-GetStdHandle(
-         DWORD nStdHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetStdHandle(
-         DWORD nStdHandle,
-         HANDLE hHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteFile(
-                HANDLE hFile,
-           LPCVOID lpBuffer,
-                DWORD nNumberOfBytesToWrite,
-             LPDWORD lpNumberOfBytesWritten,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadFile(
-                HANDLE hFile,
-           LPVOID lpBuffer,
-                DWORD nNumberOfBytesToRead,
-             LPDWORD lpNumberOfBytesRead,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlushFileBuffers(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeviceIoControl(
-                HANDLE hDevice,
-                DWORD dwIoControlCode,
-             LPVOID lpInBuffer,
-                DWORD nInBufferSize,
-             LPVOID lpOutBuffer,
-                DWORD nOutBufferSize,
-             LPDWORD lpBytesReturned,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RequestDeviceWakeup(
-         HANDLE hDevice
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CancelDeviceWakeupRequest(
-         HANDLE hDevice
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDevicePowerState(
-          HANDLE hDevice,
-         BOOL *pfOn
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMessageWaitingIndicator(
-         HANDLE hMsgIndicator,
-         ULONG ulMsgCount
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEndOfFile(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetFilePointer(
-             HANDLE hFile,
-             LONG lDistanceToMove,
-           PLONG lpDistanceToMoveHigh,
-             DWORD dwMoveMethod
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFilePointerEx(
-              HANDLE hFile,
-              LARGE_INTEGER liDistanceToMove,
-           PLARGE_INTEGER lpNewFilePointer,
-              DWORD dwMoveMethod
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindClose(
-         HANDLE hFindFile
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileTime(
-              HANDLE hFile,
-           LPFILETIME lpCreationTime,
-           LPFILETIME lpLastAccessTime,
-           LPFILETIME lpLastWriteTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileTime(
-             HANDLE hFile,
-           const FILETIME *lpCreationTime,
-           const FILETIME *lpLastAccessTime,
-           const FILETIME *lpLastWriteTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileValidData(
-         HANDLE hFile,
-         LONGLONG ValidDataLength
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileShortNameA(
-         HANDLE hFile,
-         LPCSTR lpShortName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileShortNameW(
-         HANDLE hFile,
-         LPCWSTR lpShortName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseHandle(
-         HANDLE hObject
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DuplicateHandle(
-                HANDLE hSourceProcessHandle,
-                HANDLE hSourceHandle,
-                HANDLE hTargetProcessHandle,
-                  LPHANDLE lpTargetHandle,
-                DWORD dwDesiredAccess,
-                BOOL bInheritHandle,
-                DWORD dwOptions
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetHandleInformation(
-          HANDLE hObject,
-         LPDWORD lpdwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetHandleInformation(
-         HANDLE hObject,
-         DWORD dwMask,
-         DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-LoadModule(
-         LPCSTR lpModuleName,
-         LPVOID lpParameterBlock
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-WinExec(
-         LPCSTR lpCmdLine,
-         UINT uCmdShow
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClearCommBreak(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClearCommError(
-              HANDLE hFile,
-           LPDWORD lpErrors,
-           LPCOMSTAT lpStat
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetupComm(
-         HANDLE hFile,
-         DWORD dwInQueue,
-         DWORD dwOutQueue
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EscapeCommFunction(
-         HANDLE hFile,
-         DWORD dwFunc
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommConfig(
-              HANDLE hCommDev,
-           LPCOMMCONFIG lpCC,
-           LPDWORD lpdwSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommMask(
-          HANDLE hFile,
-         LPDWORD lpEvtMask
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommProperties(
-          HANDLE hFile,
-         LPCOMMPROP lpCommProp
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommModemStatus(
-          HANDLE hFile,
-         LPDWORD lpModemStat
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommState(
-          HANDLE hFile,
-         LPDCB lpDCB
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommTimeouts(
-          HANDLE hFile,
-         LPCOMMTIMEOUTS lpCommTimeouts
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PurgeComm(
-         HANDLE hFile,
-         DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommBreak(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommConfig(
-         HANDLE hCommDev,
-           LPCOMMCONFIG lpCC,
-         DWORD dwSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommMask(
-         HANDLE hFile,
-         DWORD dwEvtMask
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommState(
-         HANDLE hFile,
-         LPDCB lpDCB
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommTimeouts(
-         HANDLE hFile,
-         LPCOMMTIMEOUTS lpCommTimeouts
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TransmitCommChar(
-         HANDLE hFile,
-         char cChar
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitCommEvent(
-                HANDLE hFile,
-             LPDWORD lpEvtMask,
-           LPOVERLAPPED lpOverlapped
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetTapePosition(
-         HANDLE hDevice,
-         DWORD dwPositionMethod,
-         DWORD dwPartition,
-         DWORD dwOffsetLow,
-         DWORD dwOffsetHigh,
-         BOOL bImmediate
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTapePosition(
-          HANDLE hDevice,
-          DWORD dwPositionType,
-         LPDWORD lpdwPartition,
-         LPDWORD lpdwOffsetLow,
-         LPDWORD lpdwOffsetHigh
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-PrepareTape(
-         HANDLE hDevice,
-         DWORD dwOperation,
-         BOOL bImmediate
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-EraseTape(
-         HANDLE hDevice,
-         DWORD dwEraseType,
-         BOOL bImmediate
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CreateTapePartition(
-         HANDLE hDevice,
-         DWORD dwPartitionMethod,
-         DWORD dwCount,
-         DWORD dwSize
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WriteTapemark(
-         HANDLE hDevice,
-         DWORD dwTapemarkType,
-         DWORD dwTapemarkCount,
-         BOOL bImmediate
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTapeStatus(
-         HANDLE hDevice
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTapeParameters(
-            HANDLE hDevice,
-            DWORD dwOperation,
-         LPDWORD lpdwSize,
-         LPVOID lpTapeInformation
-    );
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetTapeParameters(
-         HANDLE hDevice,
-         DWORD dwOperation,
-         LPVOID lpTapeInformation
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-Beep(
-         DWORD dwFreq,
-         DWORD dwDuration
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-MulDiv(
-         int nNumber,
-         int nNumerator,
-         int nDenominator
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GetSystemTime(
-         LPSYSTEMTIME lpSystemTime
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GetSystemTimeAsFileTime(
-         LPFILETIME lpSystemTimeAsFileTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSystemTime(
-         const SYSTEMTIME *lpSystemTime
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GetLocalTime(
-         LPSYSTEMTIME lpSystemTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetLocalTime(
-         const SYSTEMTIME *lpSystemTime
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GetSystemInfo(
-         LPSYSTEM_INFO lpSystemInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSystemRegistryQuota(
-           PDWORD pdwQuotaAllowed,
-           PDWORD pdwQuotaUsed
-    );
-
-BOOL
-__stdcall
-GetSystemTimes(
-           LPFILETIME lpIdleTime,
-           LPFILETIME lpKernelTime,
-           LPFILETIME lpUserTime
-    );
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-GetNativeSystemInfo(
-         LPSYSTEM_INFO lpSystemInfo
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsProcessorFeaturePresent(
-         DWORD ProcessorFeature
-    );
-
-typedef struct _TIME_ZONE_INFORMATION {
-    LONG Bias;
-    WCHAR StandardName[ 32 ];
-    SYSTEMTIME StandardDate;
-    LONG StandardBias;
-    WCHAR DaylightName[ 32 ];
-    SYSTEMTIME DaylightDate;
-    LONG DaylightBias;
-} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SystemTimeToTzSpecificLocalTime(
-           LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
-             LPSYSTEMTIME lpUniversalTime,
-            LPSYSTEMTIME lpLocalTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TzSpecificLocalTimeToSystemTime(
-           LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
-             LPSYSTEMTIME lpLocalTime,
-            LPSYSTEMTIME lpUniversalTime
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTimeZoneInformation(
-         LPTIME_ZONE_INFORMATION lpTimeZoneInformation
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetTimeZoneInformation(
-         const TIME_ZONE_INFORMATION *lpTimeZoneInformation
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SystemTimeToFileTime(
-          const SYSTEMTIME *lpSystemTime,
-         LPFILETIME lpFileTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FileTimeToLocalFileTime(
-          const FILETIME *lpFileTime,
-         LPFILETIME lpLocalFileTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LocalFileTimeToFileTime(
-          const FILETIME *lpLocalFileTime,
-         LPFILETIME lpFileTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FileTimeToSystemTime(
-          const FILETIME *lpFileTime,
-         LPSYSTEMTIME lpSystemTime
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-CompareFileTime(
-         const FILETIME *lpFileTime1,
-         const FILETIME *lpFileTime2
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FileTimeToDosDateTime(
-          const FILETIME *lpFileTime,
-         LPWORD lpFatDate,
-         LPWORD lpFatTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DosDateTimeToFileTime(
-          WORD wFatDate,
-          WORD wFatTime,
-         LPFILETIME lpFileTime
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTickCount(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSystemTimeAdjustment(
-         DWORD dwTimeAdjustment,
-         BOOL  bTimeAdjustmentDisabled
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSystemTimeAdjustment(
-         PDWORD lpTimeAdjustment,
-         PDWORD lpTimeIncrement,
-         PBOOL  lpTimeAdjustmentDisabled
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-FormatMessageA(
-    DWORD dwFlags,
-    LPCVOID lpSource,
-    DWORD dwMessageId,
-    DWORD dwLanguageId,
-    LPSTR lpBuffer,
-    DWORD nSize,
-    va_list *Arguments
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-FormatMessageW(
-    DWORD dwFlags,
-    LPCVOID lpSource,
-    DWORD dwMessageId,
-    DWORD dwLanguageId,
-    LPWSTR lpBuffer,
-    DWORD nSize,
-    va_list *Arguments
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreatePipe(
-           PHANDLE hReadPipe,
-           PHANDLE hWritePipe,
-           LPSECURITY_ATTRIBUTES lpPipeAttributes,
-             DWORD nSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ConnectNamedPipe(
-                HANDLE hNamedPipe,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DisconnectNamedPipe(
-         HANDLE hNamedPipe
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetNamedPipeHandleState(
-             HANDLE hNamedPipe,
-           LPDWORD lpMode,
-           LPDWORD lpMaxCollectionCount,
-           LPDWORD lpCollectDataTimeout
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNamedPipeInfo(
-              HANDLE hNamedPipe,
-           LPDWORD lpFlags,
-           LPDWORD lpOutBufferSize,
-           LPDWORD lpInBufferSize,
-           LPDWORD lpMaxInstances
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekNamedPipe(
-              HANDLE hNamedPipe,
-             LPVOID lpBuffer,
-              DWORD nBufferSize,
-           LPDWORD lpBytesRead,
-           LPDWORD lpTotalBytesAvail,
-           LPDWORD lpBytesLeftThisMessage
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TransactNamedPipe(
-                HANDLE hNamedPipe,
-             LPVOID lpInBuffer,
-                DWORD nInBufferSize,
-             LPVOID lpOutBuffer,
-                DWORD nOutBufferSize,
-               LPDWORD lpBytesRead,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMailslotA(
-             LPCSTR lpName,
-             DWORD nMaxMessageSize,
-             DWORD lReadTimeout,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMailslotW(
-             LPCWSTR lpName,
-             DWORD nMaxMessageSize,
-             DWORD lReadTimeout,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMailslotInfo(
-              HANDLE hMailslot,
-           LPDWORD lpMaxMessageSize,
-           LPDWORD lpNextSize,
-           LPDWORD lpMessageCount,
-           LPDWORD lpReadTimeout
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMailslotInfo(
-         HANDLE hMailslot,
-         DWORD lReadTimeout
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-MapViewOfFile(
-         HANDLE hFileMappingObject,
-         DWORD dwDesiredAccess,
-         DWORD dwFileOffsetHigh,
-         DWORD dwFileOffsetLow,
-         SIZE_T dwNumberOfBytesToMap
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlushViewOfFile(
-         LPCVOID lpBaseAddress,
-         SIZE_T dwNumberOfBytesToFlush
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnmapViewOfFile(
-         LPCVOID lpBaseAddress
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EncryptFileA(
-         LPCSTR lpFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EncryptFileW(
-         LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DecryptFileA(
-               LPCSTR lpFileName,
-      DWORD dwReserved
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DecryptFileW(
-               LPCWSTR lpFileName,
-      DWORD dwReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FileEncryptionStatusA(
-          LPCSTR lpFileName,
-         LPDWORD  lpStatus
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FileEncryptionStatusW(
-          LPCWSTR lpFileName,
-         LPDWORD  lpStatus
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-DWORD
-(__stdcall *PFE_EXPORT_FUNC)(
-           PBYTE pbData,
-           PVOID pvCallbackContext,
-             ULONG ulLength
-    );
-
-typedef
-DWORD
-(__stdcall *PFE_IMPORT_FUNC)(
-           PBYTE pbData,
-           PVOID pvCallbackContext,
-          PULONG ulLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-OpenEncryptedFileRawA(
-                LPCSTR lpFileName,
-                ULONG    ulFlags,
-                  PVOID   *pvContext
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-OpenEncryptedFileRawW(
-                LPCWSTR lpFileName,
-                ULONG    ulFlags,
-                  PVOID   *pvContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-ReadEncryptedFileRaw(
-             PFE_EXPORT_FUNC pfExportCallback,
-           PVOID           pvCallbackContext,
-             PVOID           pvContext
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WriteEncryptedFileRaw(
-             PFE_IMPORT_FUNC pfImportCallback,
-           PVOID           pvCallbackContext,
-             PVOID           pvContext
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-CloseEncryptedFileRaw(
-         PVOID           pvContext
-    );
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-lstrcmpA(
-         LPCSTR lpString1,
-         LPCSTR lpString2
-    );
-__declspec(dllimport)
-int
-__stdcall
-lstrcmpW(
-         LPCWSTR lpString1,
-         LPCWSTR lpString2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-lstrcmpiA(
-         LPCSTR lpString1,
-         LPCSTR lpString2
-    );
-__declspec(dllimport)
-int
-__stdcall
-lstrcmpiW(
-         LPCWSTR lpString1,
-         LPCWSTR lpString2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPSTR
-__stdcall
-lstrcpynA(
-         LPSTR lpString1,
-         LPCSTR lpString2,
-         int iMaxLength
-    );
-__declspec(dllimport)
-    
-LPWSTR
-__stdcall
-lstrcpynW(
-         LPWSTR lpString1,
-         LPCWSTR lpString2,
-         int iMaxLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPSTR
-__stdcall
-lstrcpyA(
-         LPSTR lpString1,
-          LPCSTR lpString2
-    );
-__declspec(dllimport)
-    
-LPWSTR
-__stdcall
-lstrcpyW(
-         LPWSTR lpString1,
-          LPCWSTR lpString2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPSTR
-__stdcall
-lstrcatA(
-         LPSTR lpString1,
-            LPCSTR lpString2
-    );
-__declspec(dllimport)
-    
-LPWSTR
-__stdcall
-lstrcatW(
-         LPWSTR lpString1,
-            LPCWSTR lpString2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-lstrlenA(
-         LPCSTR lpString
-    );
-__declspec(dllimport)
-int
-__stdcall
-lstrlenW(
-         LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HFILE
-__stdcall
-OpenFile(
-            LPCSTR lpFileName,
-         LPOFSTRUCT lpReOpenBuff,
-            UINT uStyle
-    );
-
-__declspec(dllimport)
-    
-HFILE
-__stdcall
-_lopen(
-         LPCSTR lpPathName,
-         int iReadWrite
-    );
-
-__declspec(dllimport)
-    
-HFILE
-__stdcall
-_lcreat(
-         LPCSTR lpPathName,
-         int  iAttribute
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-_lread(
-         HFILE hFile,
-           LPVOID lpBuffer,
-         UINT uBytes
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-_lwrite(
-         HFILE hFile,
-           LPCCH lpBuffer,
-         UINT uBytes
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-_hread(
-         HFILE hFile,
-           LPVOID lpBuffer,
-         long lBytes
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-_hwrite(
-         HFILE hFile,
-           LPCCH lpBuffer,
-         long lBytes
-    );
-
-__declspec(dllimport)
-HFILE
-__stdcall
-_lclose(
-         HFILE hFile
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-_llseek(
-         HFILE hFile,
-         LONG lOffset,
-         int iOrigin
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsTextUnicode(
-           const void* lpv,
-                int iSize,
-           LPINT lpiResult
-    );
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-FlsAlloc(
-           PFLS_CALLBACK_FUNCTION lpCallback
-    );
-
-__declspec(dllimport)
-PVOID
-__stdcall
-FlsGetValue(
-         DWORD dwFlsIndex
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlsSetValue(
-             DWORD dwFlsIndex,
-           PVOID lpFlsData
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlsFree(
-         DWORD dwFlsIndex
-    );
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-TlsAlloc(
-    void
-    );
-
-__declspec(dllimport)
-LPVOID
-__stdcall
-TlsGetValue(
-         DWORD dwTlsIndex
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TlsSetValue(
-             DWORD dwTlsIndex,
-           LPVOID lpTlsValue
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TlsFree(
-         DWORD dwTlsIndex
-    );
-
-typedef
-void
-(__stdcall *LPOVERLAPPED_COMPLETION_ROUTINE)(
-            DWORD dwErrorCode,
-            DWORD dwNumberOfBytesTransfered,
-         LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SleepEx(
-         DWORD dwMilliseconds,
-         BOOL bAlertable
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForSingleObjectEx(
-         HANDLE hHandle,
-         DWORD dwMilliseconds,
-         BOOL bAlertable
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForMultipleObjectsEx(
-         DWORD nCount,
-           const HANDLE *lpHandles,
-         BOOL bWaitAll,
-         DWORD dwMilliseconds,
-         BOOL bAlertable
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SignalObjectAndWait(
-         HANDLE hObjectToSignal,
-         HANDLE hObjectToWaitOn,
-         DWORD dwMilliseconds,
-         BOOL bAlertable
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadFileEx(
-             HANDLE hFile,
-         LPVOID lpBuffer,
-             DWORD nNumberOfBytesToRead,
-          LPOVERLAPPED lpOverlapped,
-           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteFileEx(
-             HANDLE hFile,
-           LPCVOID lpBuffer,
-             DWORD nNumberOfBytesToWrite,
-          LPOVERLAPPED lpOverlapped,
-           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupRead(
-            HANDLE hFile,
-           LPBYTE lpBuffer,
-            DWORD nNumberOfBytesToRead,
-           LPDWORD lpNumberOfBytesRead,
-            BOOL bAbort,
-            BOOL bProcessSecurity,
-         LPVOID *lpContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupSeek(
-            HANDLE hFile,
-            DWORD  dwLowBytesToSeek,
-            DWORD  dwHighBytesToSeek,
-           LPDWORD lpdwLowByteSeeked,
-           LPDWORD lpdwHighByteSeeked,
-         LPVOID *lpContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupWrite(
-            HANDLE hFile,
-           LPBYTE lpBuffer,
-            DWORD nNumberOfBytesToWrite,
-           LPDWORD lpNumberOfBytesWritten,
-            BOOL bAbort,
-            BOOL bProcessSecurity,
-         LPVOID *lpContext
-    );
-
-
-
-
-typedef struct _WIN32_STREAM_ID {
-        DWORD          dwStreamId ;
-        DWORD          dwStreamAttributes ;
-        LARGE_INTEGER  Size ;
-        DWORD          dwStreamNameSize ;
-        WCHAR          cStreamName[ 1 ] ;
-} WIN32_STREAM_ID, *LPWIN32_STREAM_ID ;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadFileScatter(
-               HANDLE hFile,
-               FILE_SEGMENT_ELEMENT aSegmentArray[],
-               DWORD nNumberOfBytesToRead,
-      LPDWORD lpReserved,
-            LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteFileGather(
-               HANDLE hFile,
-               FILE_SEGMENT_ELEMENT aSegmentArray[],
-               DWORD nNumberOfBytesToWrite,
-      LPDWORD lpReserved,
-            LPOVERLAPPED lpOverlapped
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _STARTUPINFOA {
-    DWORD   cb;
-    LPSTR   lpReserved;
-    LPSTR   lpDesktop;
-    LPSTR   lpTitle;
-    DWORD   dwX;
-    DWORD   dwY;
-    DWORD   dwXSize;
-    DWORD   dwYSize;
-    DWORD   dwXCountChars;
-    DWORD   dwYCountChars;
-    DWORD   dwFillAttribute;
-    DWORD   dwFlags;
-    WORD    wShowWindow;
-    WORD    cbReserved2;
-    LPBYTE  lpReserved2;
-    HANDLE  hStdInput;
-    HANDLE  hStdOutput;
-    HANDLE  hStdError;
-} STARTUPINFOA, *LPSTARTUPINFOA;
-typedef struct _STARTUPINFOW {
-    DWORD   cb;
-    LPWSTR  lpReserved;
-    LPWSTR  lpDesktop;
-    LPWSTR  lpTitle;
-    DWORD   dwX;
-    DWORD   dwY;
-    DWORD   dwXSize;
-    DWORD   dwYSize;
-    DWORD   dwXCountChars;
-    DWORD   dwYCountChars;
-    DWORD   dwFillAttribute;
-    DWORD   dwFlags;
-    WORD    wShowWindow;
-    WORD    cbReserved2;
-    LPBYTE  lpReserved2;
-    HANDLE  hStdInput;
-    HANDLE  hStdOutput;
-    HANDLE  hStdError;
-} STARTUPINFOW, *LPSTARTUPINFOW;
-
-typedef STARTUPINFOW STARTUPINFO;
-typedef LPSTARTUPINFOW LPSTARTUPINFO;
-
-
-
-
-
-
-
-typedef struct _WIN32_FIND_DATAA {
-    DWORD dwFileAttributes;
-    FILETIME ftCreationTime;
-    FILETIME ftLastAccessTime;
-    FILETIME ftLastWriteTime;
-    DWORD nFileSizeHigh;
-    DWORD nFileSizeLow;
-    DWORD dwReserved0;
-    DWORD dwReserved1;
-    CHAR   cFileName[ 260 ];
-    CHAR   cAlternateFileName[ 14 ];
-
-
-
-
-
-} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
-typedef struct _WIN32_FIND_DATAW {
-    DWORD dwFileAttributes;
-    FILETIME ftCreationTime;
-    FILETIME ftLastAccessTime;
-    FILETIME ftLastWriteTime;
-    DWORD nFileSizeHigh;
-    DWORD nFileSizeLow;
-    DWORD dwReserved0;
-    DWORD dwReserved1;
-    WCHAR  cFileName[ 260 ];
-    WCHAR  cAlternateFileName[ 14 ];
-
-
-
-
-
-} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;
-
-typedef WIN32_FIND_DATAW WIN32_FIND_DATA;
-typedef PWIN32_FIND_DATAW PWIN32_FIND_DATA;
-typedef LPWIN32_FIND_DATAW LPWIN32_FIND_DATA;
-
-
-
-
-
-
-typedef struct _WIN32_FILE_ATTRIBUTE_DATA {
-    DWORD dwFileAttributes;
-    FILETIME ftCreationTime;
-    FILETIME ftLastAccessTime;
-    FILETIME ftLastWriteTime;
-    DWORD nFileSizeHigh;
-    DWORD nFileSizeLow;
-} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA;
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMutexA(
-           LPSECURITY_ATTRIBUTES lpMutexAttributes,
-             BOOL bInitialOwner,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMutexW(
-           LPSECURITY_ATTRIBUTES lpMutexAttributes,
-             BOOL bInitialOwner,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenMutexA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenMutexW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateEventA(
-           LPSECURITY_ATTRIBUTES lpEventAttributes,
-             BOOL bManualReset,
-             BOOL bInitialState,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateEventW(
-           LPSECURITY_ATTRIBUTES lpEventAttributes,
-             BOOL bManualReset,
-             BOOL bInitialState,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenEventA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenEventW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateSemaphoreA(
-           LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
-             LONG lInitialCount,
-             LONG lMaximumCount,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateSemaphoreW(
-           LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
-             LONG lInitialCount,
-             LONG lMaximumCount,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenSemaphoreA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenSemaphoreW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-
-typedef
-void
-(__stdcall *PTIMERAPCROUTINE)(
-           LPVOID lpArgToCompletionRoutine,
-             DWORD dwTimerLowValue,
-             DWORD dwTimerHighValue
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateWaitableTimerA(
-           LPSECURITY_ATTRIBUTES lpTimerAttributes,
-             BOOL bManualReset,
-           LPCSTR lpTimerName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateWaitableTimerW(
-           LPSECURITY_ATTRIBUTES lpTimerAttributes,
-             BOOL bManualReset,
-           LPCWSTR lpTimerName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenWaitableTimerA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpTimerName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenWaitableTimerW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpTimerName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWaitableTimer(
-             HANDLE hTimer,
-             const LARGE_INTEGER *lpDueTime,
-             LONG lPeriod,
-           PTIMERAPCROUTINE pfnCompletionRoutine,
-           LPVOID lpArgToCompletionRoutine,
-             BOOL fResume
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CancelWaitableTimer(
-         HANDLE hTimer
-    );
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateFileMappingA(
-             HANDLE hFile,
-           LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
-             DWORD flProtect,
-             DWORD dwMaximumSizeHigh,
-             DWORD dwMaximumSizeLow,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateFileMappingW(
-             HANDLE hFile,
-           LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
-             DWORD flProtect,
-             DWORD dwMaximumSizeHigh,
-             DWORD dwMaximumSizeLow,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenFileMappingA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenFileMappingW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLogicalDriveStringsA(
-         DWORD nBufferLength,
-             LPSTR lpBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLogicalDriveStringsW(
-         DWORD nBufferLength,
-             LPWSTR lpBuffer
-    );
-
-
-
-
-
-
-
-
-typedef enum _MEMORY_RESOURCE_NOTIFICATION_TYPE {
-    LowMemoryResourceNotification,
-    HighMemoryResourceNotification
-} MEMORY_RESOURCE_NOTIFICATION_TYPE;
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMemoryResourceNotification(
-         MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryMemoryResourceNotification(
-          HANDLE ResourceNotificationHandle,
-         PBOOL  ResourceState
-    );
-
-
-
-
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-LoadLibraryA(
-         LPCSTR lpLibFileName
-    );
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-LoadLibraryW(
-         LPCWSTR lpLibFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-LoadLibraryExA(
-               LPCSTR lpLibFileName,
-      HANDLE hFile,
-               DWORD dwFlags
-    );
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-LoadLibraryExW(
-               LPCWSTR lpLibFileName,
-      HANDLE hFile,
-               DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetModuleFileNameA(
-           HMODULE hModule,
-           LPCH lpFilename,
-             DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetModuleFileNameW(
-           HMODULE hModule,
-           LPWCH lpFilename,
-             DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-GetModuleHandleA(
-           LPCSTR lpModuleName
-    );
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-GetModuleHandleW(
-           LPCWSTR lpModuleName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-BOOL
-(__stdcall*
-PGET_MODULE_HANDLE_EXA)(
-                DWORD        dwFlags,
-              LPCSTR     lpModuleName,
-                  HMODULE*    phModule
-    );
-typedef
-BOOL
-(__stdcall*
-PGET_MODULE_HANDLE_EXW)(
-                DWORD        dwFlags,
-              LPCWSTR     lpModuleName,
-                  HMODULE*    phModule
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetModuleHandleExA(
-                DWORD    dwFlags,
-              LPCSTR lpModuleName,
-         HMODULE* phModule
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetModuleHandleExW(
-                DWORD    dwFlags,
-              LPCWSTR lpModuleName,
-         HMODULE* phModule
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessA(
-              LPCSTR lpApplicationName,
-           LPSTR lpCommandLine,
-              LPSECURITY_ATTRIBUTES lpProcessAttributes,
-              LPSECURITY_ATTRIBUTES lpThreadAttributes,
-                BOOL bInheritHandles,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCSTR lpCurrentDirectory,
-                LPSTARTUPINFOA lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessW(
-              LPCWSTR lpApplicationName,
-           LPWSTR lpCommandLine,
-              LPSECURITY_ATTRIBUTES lpProcessAttributes,
-              LPSECURITY_ATTRIBUTES lpThreadAttributes,
-                BOOL bInheritHandles,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCWSTR lpCurrentDirectory,
-                LPSTARTUPINFOW lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessShutdownParameters(
-         DWORD dwLevel,
-         DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessShutdownParameters(
-         LPDWORD lpdwLevel,
-         LPDWORD lpdwFlags
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProcessVersion(
-         DWORD ProcessId
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-FatalAppExitA(
-         UINT uAction,
-         LPCSTR lpMessageText
-    );
-__declspec(dllimport)
-void
-__stdcall
-FatalAppExitW(
-         UINT uAction,
-         LPCWSTR lpMessageText
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-GetStartupInfoA(
-         LPSTARTUPINFOA lpStartupInfo
-    );
-__declspec(dllimport)
-void
-__stdcall
-GetStartupInfoW(
-         LPSTARTUPINFOW lpStartupInfo
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPSTR
-__stdcall
-GetCommandLineA(
-    void
-    );
-__declspec(dllimport)
-    
-LPWSTR
-__stdcall
-GetCommandLineW(
-    void
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetEnvironmentVariableA(
-         LPCSTR lpName,
-             LPSTR lpBuffer,
-         DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetEnvironmentVariableW(
-         LPCWSTR lpName,
-             LPWSTR lpBuffer,
-         DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEnvironmentVariableA(
-             LPCSTR lpName,
-           LPCSTR lpValue
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEnvironmentVariableW(
-             LPCWSTR lpName,
-           LPCWSTR lpValue
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-ExpandEnvironmentStringsA(
-         LPCSTR lpSrc,
-             LPSTR lpDst,
-         DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-ExpandEnvironmentStringsW(
-         LPCWSTR lpSrc,
-             LPWSTR lpDst,
-         DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFirmwareEnvironmentVariableA(
-         LPCSTR lpName,
-         LPCSTR lpGuid,
-             PVOID pBuffer,
-         DWORD    nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFirmwareEnvironmentVariableW(
-         LPCWSTR lpName,
-         LPCWSTR lpGuid,
-             PVOID pBuffer,
-         DWORD    nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFirmwareEnvironmentVariableA(
-         LPCSTR lpName,
-         LPCSTR lpGuid,
-             PVOID pValue,
-         DWORD    nSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFirmwareEnvironmentVariableW(
-         LPCWSTR lpName,
-         LPCWSTR lpGuid,
-             PVOID pValue,
-         DWORD    nSize
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-OutputDebugStringA(
-         LPCSTR lpOutputString
-    );
-__declspec(dllimport)
-void
-__stdcall
-OutputDebugStringW(
-         LPCWSTR lpOutputString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HRSRC
-__stdcall
-FindResourceA(
-           HMODULE hModule,
-             LPCSTR lpName,
-             LPCSTR lpType
-    );
-__declspec(dllimport)
-    
-HRSRC
-__stdcall
-FindResourceW(
-           HMODULE hModule,
-             LPCWSTR lpName,
-             LPCWSTR lpType
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HRSRC
-__stdcall
-FindResourceExA(
-           HMODULE hModule,
-             LPCSTR lpType,
-             LPCSTR lpName,
-             WORD    wLanguage
-    );
-__declspec(dllimport)
-    
-HRSRC
-__stdcall
-FindResourceExW(
-           HMODULE hModule,
-             LPCWSTR lpType,
-             LPCWSTR lpName,
-             WORD    wLanguage
-    );
-
-
-
-
-
-
-
-typedef BOOL (__stdcall* ENUMRESTYPEPROCA)(       HMODULE hModule,      LPSTR lpType,
-     LONG_PTR lParam);
-typedef BOOL (__stdcall* ENUMRESTYPEPROCW)(       HMODULE hModule,      LPWSTR lpType,
-     LONG_PTR lParam);
-
-
-
-
-
-typedef BOOL (__stdcall* ENUMRESNAMEPROCA)(       HMODULE hModule,      LPCSTR lpType,
-     LPSTR lpName,      LONG_PTR lParam);
-typedef BOOL (__stdcall* ENUMRESNAMEPROCW)(       HMODULE hModule,      LPCWSTR lpType,
-     LPWSTR lpName,      LONG_PTR lParam);
-
-
-
-
-
-typedef BOOL (__stdcall* ENUMRESLANGPROCA)(       HMODULE hModule,      LPCSTR lpType,
-     LPCSTR lpName,      WORD  wLanguage,      LONG_PTR lParam);
-typedef BOOL (__stdcall* ENUMRESLANGPROCW)(       HMODULE hModule,      LPCWSTR lpType,
-     LPCWSTR lpName,      WORD  wLanguage,      LONG_PTR lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceTypesA(
-           HMODULE hModule,
-             ENUMRESTYPEPROCA lpEnumFunc,
-             LONG_PTR lParam
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceTypesW(
-           HMODULE hModule,
-             ENUMRESTYPEPROCW lpEnumFunc,
-             LONG_PTR lParam
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceNamesA(
-           HMODULE hModule,
-             LPCSTR lpType,
-             ENUMRESNAMEPROCA lpEnumFunc,
-             LONG_PTR lParam
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceNamesW(
-           HMODULE hModule,
-             LPCWSTR lpType,
-             ENUMRESNAMEPROCW lpEnumFunc,
-             LONG_PTR lParam
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceLanguagesA(
-           HMODULE hModule,
-             LPCSTR lpType,
-             LPCSTR lpName,
-             ENUMRESLANGPROCA lpEnumFunc,
-             LONG_PTR lParam
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceLanguagesW(
-           HMODULE hModule,
-             LPCWSTR lpType,
-             LPCWSTR lpName,
-             ENUMRESLANGPROCW lpEnumFunc,
-             LONG_PTR lParam
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-BeginUpdateResourceA(
-         LPCSTR pFileName,
-         BOOL bDeleteExistingResources
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-BeginUpdateResourceW(
-         LPCWSTR pFileName,
-         BOOL bDeleteExistingResources
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateResourceA(
-         HANDLE hUpdate,
-         LPCSTR lpType,
-         LPCSTR lpName,
-         WORD wLanguage,
-             LPVOID lpData,
-         DWORD cb
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateResourceW(
-         HANDLE hUpdate,
-         LPCWSTR lpType,
-         LPCWSTR lpName,
-         WORD wLanguage,
-             LPVOID lpData,
-         DWORD cb
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndUpdateResourceA(
-         HANDLE hUpdate,
-         BOOL   fDiscard
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EndUpdateResourceW(
-         HANDLE hUpdate,
-         BOOL   fDiscard
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalAddAtomA(
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalAddAtomW(
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalFindAtomA(
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalFindAtomW(
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GlobalGetAtomNameA(
-         ATOM nAtom,
-           LPSTR lpBuffer,
-         int nSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GlobalGetAtomNameW(
-         ATOM nAtom,
-           LPWSTR lpBuffer,
-         int nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-AddAtomA(
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-AddAtomW(
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-FindAtomA(
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-FindAtomW(
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetAtomNameA(
-         ATOM nAtom,
-           LPSTR lpBuffer,
-         int nSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetAtomNameW(
-         ATOM nAtom,
-           LPWSTR lpBuffer,
-         int nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetProfileIntA(
-         LPCSTR lpAppName,
-         LPCSTR lpKeyName,
-         INT nDefault
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetProfileIntW(
-         LPCWSTR lpAppName,
-         LPCWSTR lpKeyName,
-         INT nDefault
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProfileStringA(
-           LPCSTR lpAppName,
-           LPCSTR lpKeyName,
-           LPCSTR lpDefault,
-             LPSTR lpReturnedString,
-             DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProfileStringW(
-           LPCWSTR lpAppName,
-           LPCWSTR lpKeyName,
-           LPCWSTR lpDefault,
-             LPWSTR lpReturnedString,
-             DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProfileStringA(
-           LPCSTR lpAppName,
-           LPCSTR lpKeyName,
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProfileStringW(
-           LPCWSTR lpAppName,
-           LPCWSTR lpKeyName,
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProfileSectionA(
-         LPCSTR lpAppName,
-             LPSTR lpReturnedString,
-         DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProfileSectionW(
-         LPCWSTR lpAppName,
-             LPWSTR lpReturnedString,
-         DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProfileSectionA(
-         LPCSTR lpAppName,
-         LPCSTR lpString
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProfileSectionW(
-         LPCWSTR lpAppName,
-         LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetPrivateProfileIntA(
-             LPCSTR lpAppName,
-             LPCSTR lpKeyName,
-             INT nDefault,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetPrivateProfileIntW(
-             LPCWSTR lpAppName,
-             LPCWSTR lpKeyName,
-             INT nDefault,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileStringA(
-           LPCSTR lpAppName,
-           LPCSTR lpKeyName,
-           LPCSTR lpDefault,
-             LPSTR lpReturnedString,
-             DWORD nSize,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileStringW(
-           LPCWSTR lpAppName,
-           LPCWSTR lpKeyName,
-           LPCWSTR lpDefault,
-             LPWSTR lpReturnedString,
-             DWORD nSize,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileStringA(
-           LPCSTR lpAppName,
-           LPCSTR lpKeyName,
-           LPCSTR lpString,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileStringW(
-           LPCWSTR lpAppName,
-           LPCWSTR lpKeyName,
-           LPCWSTR lpString,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileSectionA(
-             LPCSTR lpAppName,
-             LPSTR lpReturnedString,
-             DWORD nSize,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileSectionW(
-             LPCWSTR lpAppName,
-             LPWSTR lpReturnedString,
-             DWORD nSize,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileSectionA(
-             LPCSTR lpAppName,
-             LPCSTR lpString,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileSectionW(
-             LPCWSTR lpAppName,
-             LPCWSTR lpString,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileSectionNamesA(
-             LPSTR lpszReturnBuffer,
-             DWORD nSize,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileSectionNamesW(
-             LPWSTR lpszReturnBuffer,
-             DWORD nSize,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetPrivateProfileStructA(
-             LPCSTR lpszSection,
-             LPCSTR lpszKey,
-           LPVOID   lpStruct,
-             UINT     uSizeStruct,
-           LPCSTR szFile
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetPrivateProfileStructW(
-             LPCWSTR lpszSection,
-             LPCWSTR lpszKey,
-           LPVOID   lpStruct,
-             UINT     uSizeStruct,
-           LPCWSTR szFile
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileStructA(
-             LPCSTR lpszSection,
-             LPCSTR lpszKey,
-             LPVOID lpStruct,
-             UINT     uSizeStruct,
-           LPCSTR szFile
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileStructW(
-             LPCWSTR lpszSection,
-             LPCWSTR lpszKey,
-             LPVOID lpStruct,
-             UINT     uSizeStruct,
-           LPCWSTR szFile
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetDriveTypeA(
-           LPCSTR lpRootPathName
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetDriveTypeW(
-           LPCWSTR lpRootPathName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemDirectoryA(
-             LPSTR lpBuffer,
-         UINT uSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemDirectoryW(
-             LPWSTR lpBuffer,
-         UINT uSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTempPathA(
-         DWORD nBufferLength,
-           LPSTR lpBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTempPathW(
-         DWORD nBufferLength,
-           LPWSTR lpBuffer
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetTempFileNameA(
-         LPCSTR lpPathName,
-         LPCSTR lpPrefixString,
-         UINT uUnique,
-         LPSTR lpTempFileName
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetTempFileNameW(
-         LPCWSTR lpPathName,
-         LPCWSTR lpPrefixString,
-         UINT uUnique,
-         LPWSTR lpTempFileName
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetWindowsDirectoryA(
-             LPSTR lpBuffer,
-         UINT uSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetWindowsDirectoryW(
-             LPWSTR lpBuffer,
-         UINT uSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemWindowsDirectoryA(
-             LPSTR lpBuffer,
-         UINT uSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemWindowsDirectoryW(
-             LPWSTR lpBuffer,
-         UINT uSize
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemWow64DirectoryA(
-             LPSTR lpBuffer,
-         UINT uSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemWow64DirectoryW(
-             LPWSTR lpBuffer,
-         UINT uSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOLEAN
-__stdcall
-Wow64EnableWow64FsRedirection (
-         BOOLEAN Wow64FsEnableRedirection
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-Wow64DisableWow64FsRedirection (
-         PVOID *OldValue
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-Wow64RevertWow64FsRedirection (
-         PVOID OlValue
-    );
-    
-
-
-
-
-typedef UINT (__stdcall* PGET_SYSTEM_WOW64_DIRECTORY_A)(         LPSTR lpBuffer,      UINT uSize);
-typedef UINT (__stdcall* PGET_SYSTEM_WOW64_DIRECTORY_W)(         LPWSTR lpBuffer,      UINT uSize);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCurrentDirectoryA(
-         LPCSTR lpPathName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCurrentDirectoryW(
-         LPCWSTR lpPathName
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentDirectoryA(
-         DWORD nBufferLength,
-             LPSTR lpBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentDirectoryW(
-         DWORD nBufferLength,
-             LPWSTR lpBuffer
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDiskFreeSpaceA(
-            LPCSTR lpRootPathName,
-           LPDWORD lpSectorsPerCluster,
-           LPDWORD lpBytesPerSector,
-           LPDWORD lpNumberOfFreeClusters,
-           LPDWORD lpTotalNumberOfClusters
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDiskFreeSpaceW(
-            LPCWSTR lpRootPathName,
-           LPDWORD lpSectorsPerCluster,
-           LPDWORD lpBytesPerSector,
-           LPDWORD lpNumberOfFreeClusters,
-           LPDWORD lpTotalNumberOfClusters
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDiskFreeSpaceExA(
-            LPCSTR lpDirectoryName,
-           PULARGE_INTEGER lpFreeBytesAvailableToCaller,
-           PULARGE_INTEGER lpTotalNumberOfBytes,
-           PULARGE_INTEGER lpTotalNumberOfFreeBytes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDiskFreeSpaceExW(
-            LPCWSTR lpDirectoryName,
-           PULARGE_INTEGER lpFreeBytesAvailableToCaller,
-           PULARGE_INTEGER lpTotalNumberOfBytes,
-           PULARGE_INTEGER lpTotalNumberOfFreeBytes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateDirectoryA(
-             LPCSTR lpPathName,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateDirectoryW(
-             LPCWSTR lpPathName,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateDirectoryExA(
-             LPCSTR lpTemplateDirectory,
-             LPCSTR lpNewDirectory,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateDirectoryExW(
-             LPCWSTR lpTemplateDirectory,
-             LPCWSTR lpNewDirectory,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RemoveDirectoryA(
-         LPCSTR lpPathName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-RemoveDirectoryW(
-         LPCWSTR lpPathName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFullPathNameA(
-                    LPCSTR lpFileName,
-                    DWORD nBufferLength,
-             LPSTR lpBuffer,
-                    LPSTR *lpFilePart
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFullPathNameW(
-                    LPCWSTR lpFileName,
-                    DWORD nBufferLength,
-             LPWSTR lpBuffer,
-                    LPWSTR *lpFilePart
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DefineDosDeviceA(
-             DWORD dwFlags,
-             LPCSTR lpDeviceName,
-           LPCSTR lpTargetPath
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DefineDosDeviceW(
-             DWORD dwFlags,
-             LPCWSTR lpDeviceName,
-           LPCWSTR lpTargetPath
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-QueryDosDeviceA(
-           LPCSTR lpDeviceName,
-             LPSTR lpTargetPath,
-             DWORD ucchMax
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-QueryDosDeviceW(
-           LPCWSTR lpDeviceName,
-             LPWSTR lpTargetPath,
-             DWORD ucchMax
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateFileA(
-             LPCSTR lpFileName,
-             DWORD dwDesiredAccess,
-             DWORD dwShareMode,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-             DWORD dwCreationDisposition,
-             DWORD dwFlagsAndAttributes,
-           HANDLE hTemplateFile
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateFileW(
-             LPCWSTR lpFileName,
-             DWORD dwDesiredAccess,
-             DWORD dwShareMode,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-             DWORD dwCreationDisposition,
-             DWORD dwFlagsAndAttributes,
-           HANDLE hTemplateFile
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileAttributesA(
-         LPCSTR lpFileName,
-         DWORD dwFileAttributes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileAttributesW(
-         LPCWSTR lpFileName,
-         DWORD dwFileAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFileAttributesA(
-         LPCSTR lpFileName
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFileAttributesW(
-         LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-typedef enum _GET_FILEEX_INFO_LEVELS {
-    GetFileExInfoStandard,
-    GetFileExMaxInfoLevel
-} GET_FILEEX_INFO_LEVELS;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileAttributesExA(
-          LPCSTR lpFileName,
-          GET_FILEEX_INFO_LEVELS fInfoLevelId,
-         LPVOID lpFileInformation
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileAttributesExW(
-          LPCWSTR lpFileName,
-          GET_FILEEX_INFO_LEVELS fInfoLevelId,
-         LPVOID lpFileInformation
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCompressedFileSizeA(
-          LPCSTR lpFileName,
-         LPDWORD  lpFileSizeHigh
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCompressedFileSizeW(
-          LPCWSTR lpFileName,
-         LPDWORD  lpFileSizeHigh
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteFileA(
-         LPCSTR lpFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteFileW(
-         LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckNameLegalDOS8Dot3A(
-              LPCSTR lpName,
-           LPSTR lpOemName,
-              DWORD OemNameSize,
-           PBOOL pbNameContainsSpaces ,
-             PBOOL pbNameLegal
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckNameLegalDOS8Dot3W(
-              LPCWSTR lpName,
-           LPSTR lpOemName,
-              DWORD OemNameSize,
-           PBOOL pbNameContainsSpaces ,
-             PBOOL pbNameLegal
-    );
-
-
-
-
-
-
-
-
-
-typedef enum _FINDEX_INFO_LEVELS {
-    FindExInfoStandard,
-    FindExInfoMaxInfoLevel
-} FINDEX_INFO_LEVELS;
-
-typedef enum _FINDEX_SEARCH_OPS {
-    FindExSearchNameMatch,
-    FindExSearchLimitToDirectories,
-    FindExSearchLimitToDevices,
-    FindExSearchMaxSearchOp
-} FINDEX_SEARCH_OPS;
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstFileExA(
-               LPCSTR lpFileName,
-               FINDEX_INFO_LEVELS fInfoLevelId,
-              LPVOID lpFindFileData,
-               FINDEX_SEARCH_OPS fSearchOp,
-      LPVOID lpSearchFilter,
-               DWORD dwAdditionalFlags
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstFileExW(
-               LPCWSTR lpFileName,
-               FINDEX_INFO_LEVELS fInfoLevelId,
-              LPVOID lpFindFileData,
-               FINDEX_SEARCH_OPS fSearchOp,
-      LPVOID lpSearchFilter,
-               DWORD dwAdditionalFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstFileA(
-          LPCSTR lpFileName,
-         LPWIN32_FIND_DATAA lpFindFileData
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstFileW(
-          LPCWSTR lpFileName,
-         LPWIN32_FIND_DATAW lpFindFileData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextFileA(
-          HANDLE hFindFile,
-         LPWIN32_FIND_DATAA lpFindFileData
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextFileW(
-          HANDLE hFindFile,
-         LPWIN32_FIND_DATAW lpFindFileData
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SearchPathA(
-            LPCSTR lpPath,
-              LPCSTR lpFileName,
-            LPCSTR lpExtension,
-              DWORD nBufferLength,
-             LPSTR lpBuffer,
-           LPSTR *lpFilePart
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-SearchPathW(
-            LPCWSTR lpPath,
-              LPCWSTR lpFileName,
-            LPCWSTR lpExtension,
-              DWORD nBufferLength,
-             LPWSTR lpBuffer,
-           LPWSTR *lpFilePart
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyFileA(
-         LPCSTR lpExistingFileName,
-         LPCSTR lpNewFileName,
-         BOOL bFailIfExists
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyFileW(
-         LPCWSTR lpExistingFileName,
-         LPCWSTR lpNewFileName,
-         BOOL bFailIfExists
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-DWORD
-(__stdcall *LPPROGRESS_ROUTINE)(
-             LARGE_INTEGER TotalFileSize,
-             LARGE_INTEGER TotalBytesTransferred,
-             LARGE_INTEGER StreamSize,
-             LARGE_INTEGER StreamBytesTransferred,
-             DWORD dwStreamNumber,
-             DWORD dwCallbackReason,
-             HANDLE hSourceFile,
-             HANDLE hDestinationFile,
-           LPVOID lpData
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyFileExA(
-             LPCSTR lpExistingFileName,
-             LPCSTR lpNewFileName,
-           LPPROGRESS_ROUTINE lpProgressRoutine,
-           LPVOID lpData,
-           LPBOOL pbCancel,
-             DWORD dwCopyFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyFileExW(
-             LPCWSTR lpExistingFileName,
-             LPCWSTR lpNewFileName,
-           LPPROGRESS_ROUTINE lpProgressRoutine,
-           LPVOID lpData,
-           LPBOOL pbCancel,
-             DWORD dwCopyFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileA(
-         LPCSTR lpExistingFileName,
-         LPCSTR lpNewFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileW(
-         LPCWSTR lpExistingFileName,
-         LPCWSTR lpNewFileName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileExA(
-         LPCSTR lpExistingFileName,
-         LPCSTR lpNewFileName,
-         DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileExW(
-         LPCWSTR lpExistingFileName,
-         LPCWSTR lpNewFileName,
-         DWORD dwFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileWithProgressA(
-             LPCSTR lpExistingFileName,
-             LPCSTR lpNewFileName,
-           LPPROGRESS_ROUTINE lpProgressRoutine,
-           LPVOID lpData,
-             DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileWithProgressW(
-             LPCWSTR lpExistingFileName,
-             LPCWSTR lpNewFileName,
-           LPPROGRESS_ROUTINE lpProgressRoutine,
-           LPVOID lpData,
-             DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReplaceFileA(
-               LPCSTR  lpReplacedFileName,
-               LPCSTR  lpReplacementFileName,
-             LPCSTR  lpBackupFileName,
-               DWORD   dwReplaceFlags,
-      LPVOID  lpExclude,
-      LPVOID  lpReserved
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReplaceFileW(
-               LPCWSTR lpReplacedFileName,
-               LPCWSTR lpReplacementFileName,
-             LPCWSTR lpBackupFileName,
-               DWORD   dwReplaceFlags,
-      LPVOID  lpExclude,
-      LPVOID  lpReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateHardLinkA(
-               LPCSTR lpFileName,
-               LPCSTR lpExistingFileName,
-      LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateHardLinkW(
-               LPCWSTR lpFileName,
-               LPCWSTR lpExistingFileName,
-      LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _STREAM_INFO_LEVELS {
-    
-    FindStreamInfoStandard,
-    FindStreamInfoMaxInfoLevel
-
-} STREAM_INFO_LEVELS;
-
-typedef struct _WIN32_FIND_STREAM_DATA {
-    
-    LARGE_INTEGER StreamSize;
-    WCHAR cStreamName[ 260 + 36 ]; 
-
-} WIN32_FIND_STREAM_DATA, *PWIN32_FIND_STREAM_DATA; 
-
-    
-HANDLE
-__stdcall
-FindFirstStreamW(
-               LPCWSTR lpFileName,
-               STREAM_INFO_LEVELS InfoLevel,
-              LPVOID lpFindStreamData,
-      DWORD dwFlags
-    );
-
-BOOL
-__stdcall
-FindNextStreamW(
-          HANDLE hFindStream,
-         LPVOID lpFindStreamData
-    );
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateNamedPipeA(
-             LPCSTR lpName,
-             DWORD dwOpenMode,
-             DWORD dwPipeMode,
-             DWORD nMaxInstances,
-             DWORD nOutBufferSize,
-             DWORD nInBufferSize,
-             DWORD nDefaultTimeOut,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateNamedPipeW(
-             LPCWSTR lpName,
-             DWORD dwOpenMode,
-             DWORD dwPipeMode,
-             DWORD nMaxInstances,
-             DWORD nOutBufferSize,
-             DWORD nInBufferSize,
-             DWORD nDefaultTimeOut,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNamedPipeHandleStateA(
-              HANDLE hNamedPipe,
-           LPDWORD lpState,
-           LPDWORD lpCurInstances,
-           LPDWORD lpMaxCollectionCount,
-           LPDWORD lpCollectDataTimeout,
-           LPSTR lpUserName,
-              DWORD nMaxUserNameSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNamedPipeHandleStateW(
-              HANDLE hNamedPipe,
-           LPDWORD lpState,
-           LPDWORD lpCurInstances,
-           LPDWORD lpMaxCollectionCount,
-           LPDWORD lpCollectDataTimeout,
-           LPWSTR lpUserName,
-              DWORD nMaxUserNameSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CallNamedPipeA(
-          LPCSTR lpNamedPipeName,
-             LPVOID lpInBuffer,
-          DWORD nInBufferSize,
-             LPVOID lpOutBuffer,
-          DWORD nOutBufferSize,
-         LPDWORD lpBytesRead,
-          DWORD nTimeOut
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CallNamedPipeW(
-          LPCWSTR lpNamedPipeName,
-             LPVOID lpInBuffer,
-          DWORD nInBufferSize,
-             LPVOID lpOutBuffer,
-          DWORD nOutBufferSize,
-         LPDWORD lpBytesRead,
-          DWORD nTimeOut
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitNamedPipeA(
-         LPCSTR lpNamedPipeName,
-         DWORD nTimeOut
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitNamedPipeW(
-         LPCWSTR lpNamedPipeName,
-         DWORD nTimeOut
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetVolumeLabelA(
-           LPCSTR lpRootPathName,
-           LPCSTR lpVolumeName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetVolumeLabelW(
-           LPCWSTR lpRootPathName,
-           LPCWSTR lpVolumeName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-SetFileApisToOEM( void );
-
-__declspec(dllimport)
-void
-__stdcall
-SetFileApisToANSI( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AreFileApisANSI( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumeInformationA(
-            LPCSTR lpRootPathName,
-           LPSTR lpVolumeNameBuffer,
-              DWORD nVolumeNameSize,
-           LPDWORD lpVolumeSerialNumber,
-           LPDWORD lpMaximumComponentLength,
-           LPDWORD lpFileSystemFlags,
-           LPSTR lpFileSystemNameBuffer,
-              DWORD nFileSystemNameSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumeInformationW(
-            LPCWSTR lpRootPathName,
-           LPWSTR lpVolumeNameBuffer,
-              DWORD nVolumeNameSize,
-           LPDWORD lpVolumeSerialNumber,
-           LPDWORD lpMaximumComponentLength,
-           LPDWORD lpFileSystemFlags,
-           LPWSTR lpFileSystemNameBuffer,
-              DWORD nFileSystemNameSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CancelIo(
-         HANDLE hFile
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClearEventLogA (
-             HANDLE hEventLog,
-           LPCSTR lpBackupFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ClearEventLogW (
-             HANDLE hEventLog,
-           LPCWSTR lpBackupFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupEventLogA (
-         HANDLE hEventLog,
-         LPCSTR lpBackupFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupEventLogW (
-         HANDLE hEventLog,
-         LPCWSTR lpBackupFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseEventLog (
-         HANDLE hEventLog
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeregisterEventSource (
-         HANDLE hEventLog
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-NotifyChangeEventLog(
-         HANDLE  hEventLog,
-         HANDLE  hEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumberOfEventLogRecords (
-          HANDLE hEventLog,
-         PDWORD NumberOfRecords
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetOldestEventLogRecord (
-          HANDLE hEventLog,
-         PDWORD OldestRecord
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenEventLogA (
-           LPCSTR lpUNCServerName,
-             LPCSTR lpSourceName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenEventLogW (
-           LPCWSTR lpUNCServerName,
-             LPCWSTR lpSourceName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-RegisterEventSourceA (
-           LPCSTR lpUNCServerName,
-             LPCSTR lpSourceName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-RegisterEventSourceW (
-           LPCWSTR lpUNCServerName,
-             LPCWSTR lpSourceName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenBackupEventLogA (
-           LPCSTR lpUNCServerName,
-             LPCSTR lpFileName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenBackupEventLogW (
-           LPCWSTR lpUNCServerName,
-             LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadEventLogA (
-          HANDLE     hEventLog,
-          DWORD      dwReadFlags,
-          DWORD      dwRecordOffset,
-           LPVOID     lpBuffer,
-          DWORD      nNumberOfBytesToRead,
-         DWORD      *pnBytesRead,
-         DWORD      *pnMinNumberOfBytesNeeded
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadEventLogW (
-          HANDLE     hEventLog,
-          DWORD      dwReadFlags,
-          DWORD      dwRecordOffset,
-           LPVOID     lpBuffer,
-          DWORD      nNumberOfBytesToRead,
-         DWORD      *pnBytesRead,
-         DWORD      *pnMinNumberOfBytesNeeded
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReportEventA (
-             HANDLE     hEventLog,
-             WORD       wType,
-             WORD       wCategory,
-             DWORD      dwEventID,
-           PSID       lpUserSid,
-             WORD       wNumStrings,
-             DWORD      dwDataSize,
-           LPCSTR   *lpStrings,
-             LPVOID lpRawData
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReportEventW (
-             HANDLE     hEventLog,
-             WORD       wType,
-             WORD       wCategory,
-             DWORD      dwEventID,
-           PSID       lpUserSid,
-             WORD       wNumStrings,
-             DWORD      dwDataSize,
-           LPCWSTR   *lpStrings,
-             LPVOID lpRawData
-    );
-
-
-
-
-
-
-
-
-
-typedef struct _EVENTLOG_FULL_INFORMATION
-{
-    DWORD    dwFull;
-}
-EVENTLOG_FULL_INFORMATION, *LPEVENTLOG_FULL_INFORMATION;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetEventLogInformation (
-          HANDLE     hEventLog,
-          DWORD      dwInfoLevel,
-           LPVOID lpBuffer,
-          DWORD      cbBufSize,
-         LPDWORD    pcbBytesNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DuplicateToken(
-                HANDLE ExistingTokenHandle,
-                SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
-                  PHANDLE DuplicateTokenHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetKernelObjectSecurity (
-          HANDLE Handle,
-          SECURITY_INFORMATION RequestedInformation,
-         PSECURITY_DESCRIPTOR pSecurityDescriptor,
-          DWORD nLength,
-         LPDWORD lpnLengthNeeded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ImpersonateNamedPipeClient(
-         HANDLE hNamedPipe
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ImpersonateSelf(
-         SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RevertToSelf (
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadToken (
-           PHANDLE Thread,
-           HANDLE Token
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheck (
-            PSECURITY_DESCRIPTOR pSecurityDescriptor,
-            HANDLE ClientToken,
-            DWORD DesiredAccess,
-            PGENERIC_MAPPING GenericMapping,
-           PPRIVILEGE_SET PrivilegeSet,
-         LPDWORD PrivilegeSetLength,
-           LPDWORD GrantedAccess,
-           LPBOOL AccessStatus
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByType (
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-           PSID PrincipalSelfSid,
-             HANDLE ClientToken,
-             DWORD DesiredAccess,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-           PPRIVILEGE_SET PrivilegeSet,
-          LPDWORD PrivilegeSetLength,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultList (
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-           PSID PrincipalSelfSid,
-             HANDLE ClientToken,
-             DWORD DesiredAccess,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-           PPRIVILEGE_SET PrivilegeSet,
-          LPDWORD PrivilegeSetLength,
-            LPDWORD GrantedAccessList,
-            LPDWORD AccessStatusList
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OpenProcessToken (
-                HANDLE ProcessHandle,
-                DWORD DesiredAccess,
-                  PHANDLE TokenHandle
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OpenThreadToken (
-                HANDLE ThreadHandle,
-                DWORD DesiredAccess,
-                BOOL OpenAsSelf,
-                  PHANDLE TokenHandle
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTokenInformation (
-              HANDLE TokenHandle,
-              TOKEN_INFORMATION_CLASS TokenInformationClass,
-             LPVOID TokenInformation,
-              DWORD TokenInformationLength,
-           PDWORD ReturnLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetTokenInformation (
-         HANDLE TokenHandle,
-         TOKEN_INFORMATION_CLASS TokenInformationClass,
-           LPVOID TokenInformation,
-         DWORD TokenInformationLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AdjustTokenPrivileges (
-              HANDLE TokenHandle,
-              BOOL DisableAllPrivileges,
-            PTOKEN_PRIVILEGES NewState,
-              DWORD BufferLength,
-             PTOKEN_PRIVILEGES PreviousState,
-           PDWORD ReturnLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AdjustTokenGroups (
-              HANDLE TokenHandle,
-              BOOL ResetToDefault,
-            PTOKEN_GROUPS NewState,
-              DWORD BufferLength,
-             PTOKEN_GROUPS PreviousState,
-           PDWORD ReturnLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PrivilegeCheck (
-            HANDLE ClientToken,
-         PPRIVILEGE_SET RequiredPrivileges,
-           LPBOOL pfResult
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckAndAuditAlarmA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             LPSTR ObjectTypeName,
-           LPSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-             DWORD DesiredAccess,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus,
-            LPBOOL pfGenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckAndAuditAlarmW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             LPWSTR ObjectTypeName,
-           LPWSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-             DWORD DesiredAccess,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus,
-            LPBOOL pfGenerateOnClose
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeAndAuditAlarmA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             LPCSTR ObjectTypeName,
-           LPCSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus,
-            LPBOOL pfGenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeAndAuditAlarmW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             LPCWSTR ObjectTypeName,
-           LPCWSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus,
-            LPBOOL pfGenerateOnClose
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultListAndAuditAlarmA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             LPCSTR ObjectTypeName,
-           LPCSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPDWORD AccessStatusList,
-            LPBOOL pfGenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultListAndAuditAlarmW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             LPCWSTR ObjectTypeName,
-           LPCWSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPDWORD AccessStatusList,
-            LPBOOL pfGenerateOnClose
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultListAndAuditAlarmByHandleA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             HANDLE ClientToken,
-             LPCSTR ObjectTypeName,
-           LPCSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPDWORD AccessStatusList,
-            LPBOOL pfGenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultListAndAuditAlarmByHandleW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             HANDLE ClientToken,
-             LPCWSTR ObjectTypeName,
-           LPCWSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPDWORD AccessStatusList,
-            LPBOOL pfGenerateOnClose
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectOpenAuditAlarmA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             LPSTR ObjectTypeName,
-           LPSTR ObjectName,
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-             HANDLE ClientToken,
-             DWORD DesiredAccess,
-             DWORD GrantedAccess,
-           PPRIVILEGE_SET Privileges,
-             BOOL ObjectCreation,
-             BOOL AccessGranted,
-            LPBOOL GenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectOpenAuditAlarmW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             LPWSTR ObjectTypeName,
-           LPWSTR ObjectName,
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-             HANDLE ClientToken,
-             DWORD DesiredAccess,
-             DWORD GrantedAccess,
-           PPRIVILEGE_SET Privileges,
-             BOOL ObjectCreation,
-             BOOL AccessGranted,
-            LPBOOL GenerateOnClose
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectPrivilegeAuditAlarmA (
-         LPCSTR SubsystemName,
-         LPVOID HandleId,
-         HANDLE ClientToken,
-         DWORD DesiredAccess,
-         PPRIVILEGE_SET Privileges,
-         BOOL AccessGranted
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectPrivilegeAuditAlarmW (
-         LPCWSTR SubsystemName,
-         LPVOID HandleId,
-         HANDLE ClientToken,
-         DWORD DesiredAccess,
-         PPRIVILEGE_SET Privileges,
-         BOOL AccessGranted
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectCloseAuditAlarmA (
-         LPCSTR SubsystemName,
-         LPVOID HandleId,
-         BOOL GenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectCloseAuditAlarmW (
-         LPCWSTR SubsystemName,
-         LPVOID HandleId,
-         BOOL GenerateOnClose
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectDeleteAuditAlarmA (
-         LPCSTR SubsystemName,
-         LPVOID HandleId,
-         BOOL GenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectDeleteAuditAlarmW (
-         LPCWSTR SubsystemName,
-         LPVOID HandleId,
-         BOOL GenerateOnClose
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PrivilegedServiceAuditAlarmA (
-         LPCSTR SubsystemName,
-         LPCSTR ServiceName,
-         HANDLE ClientToken,
-         PPRIVILEGE_SET Privileges,
-         BOOL AccessGranted
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-PrivilegedServiceAuditAlarmW (
-         LPCWSTR SubsystemName,
-         LPCWSTR ServiceName,
-         HANDLE ClientToken,
-         PPRIVILEGE_SET Privileges,
-         BOOL AccessGranted
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWellKnownSid (
-         PSID pSid,
-         WELL_KNOWN_SID_TYPE WellKnownSidType
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateWellKnownSid(
-             WELL_KNOWN_SID_TYPE WellKnownSidType,
-           PSID DomainSid,
-           PSID pSid,
-          DWORD *cbSid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EqualDomainSid(
-          PSID pSid1,
-          PSID pSid2,
-         BOOL *pfEqual
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetWindowsAccountDomainSid(
-            PSID pSid,
-             PSID pDomainSid,
-         DWORD* cbDomainSid
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidSid (
-         PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EqualSid (
-         PSID pSid1,
-         PSID pSid2
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EqualPrefixSid (
-         PSID pSid1,
-         PSID pSid2
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetSidLengthRequired (
-         UCHAR nSubAuthorityCount
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllocateAndInitializeSid (
-                PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
-                BYTE nSubAuthorityCount,
-                DWORD nSubAuthority0,
-                DWORD nSubAuthority1,
-                DWORD nSubAuthority2,
-                DWORD nSubAuthority3,
-                DWORD nSubAuthority4,
-                DWORD nSubAuthority5,
-                DWORD nSubAuthority6,
-                DWORD nSubAuthority7,
-                  PSID *pSid
-    );
-
-__declspec(dllimport)
-PVOID
-__stdcall
-FreeSid(
-         PSID pSid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitializeSid (
-         PSID Sid,
-          PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
-          BYTE nSubAuthorityCount
-    );
-
-
-__declspec(dllimport)
-    
-PSID_IDENTIFIER_AUTHORITY
-__stdcall
-GetSidIdentifierAuthority (
-         PSID pSid
-    );
-
-
-__declspec(dllimport)
-    
-PDWORD
-__stdcall
-GetSidSubAuthority (
-         PSID pSid,
-         DWORD nSubAuthority
-    );
-
-
-__declspec(dllimport)
-    
-PUCHAR
-__stdcall
-GetSidSubAuthorityCount (
-         PSID pSid
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLengthSid (
-         PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CopySid (
-         DWORD nDestinationSidLength,
-         PSID pDestinationSid,
-         PSID pSourceSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AreAllAccessesGranted (
-         DWORD GrantedAccess,
-         DWORD DesiredAccess
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AreAnyAccessesGranted (
-         DWORD GrantedAccess,
-         DWORD DesiredAccess
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-MapGenericMask (
-         PDWORD AccessMask,
-            PGENERIC_MAPPING GenericMapping
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidAcl (
-         PACL pAcl
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitializeAcl (
-         PACL pAcl,
-         DWORD nAclLength,
-         DWORD dwAclRevision
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetAclInformation (
-         PACL pAcl,
-         LPVOID pAclInformation,
-         DWORD nAclInformationLength,
-         ACL_INFORMATION_CLASS dwAclInformationClass
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetAclInformation (
-         PACL pAcl,
-           LPVOID pAclInformation,
-            DWORD nAclInformationLength,
-            ACL_INFORMATION_CLASS dwAclInformationClass
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAce (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD dwStartingAceIndex,
-           LPVOID pAceList,
-            DWORD nAceListLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteAce (
-         PACL pAcl,
-            DWORD dwAceIndex
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetAce (
-                PACL pAcl,
-                DWORD dwAceIndex,
-                  LPVOID *pAce
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessAllowedAce (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AccessMask,
-            PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessAllowedAceEx (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AceFlags,
-            DWORD AccessMask,
-            PSID pSid
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessDeniedAce (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AccessMask,
-            PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessDeniedAceEx (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AceFlags,
-            DWORD AccessMask,
-            PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAuditAccessAce(
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD dwAccessMask,
-            PSID pSid,
-            BOOL bAuditSuccess,
-            BOOL bAuditFailure
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAuditAccessAceEx(
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AceFlags,
-            DWORD dwAccessMask,
-            PSID pSid,
-            BOOL bAuditSuccess,
-            BOOL bAuditFailure
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessAllowedObjectAce (
-          PACL pAcl,
-             DWORD dwAceRevision,
-             DWORD AceFlags,
-             DWORD AccessMask,
-           GUID *ObjectTypeGuid,
-           GUID *InheritedObjectTypeGuid,
-             PSID pSid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessDeniedObjectAce (
-          PACL pAcl,
-             DWORD dwAceRevision,
-             DWORD AceFlags,
-             DWORD AccessMask,
-           GUID *ObjectTypeGuid,
-           GUID *InheritedObjectTypeGuid,
-             PSID pSid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAuditAccessObjectAce (
-          PACL pAcl,
-             DWORD dwAceRevision,
-             DWORD AceFlags,
-             DWORD AccessMask,
-           GUID *ObjectTypeGuid,
-           GUID *InheritedObjectTypeGuid,
-             PSID pSid,
-             BOOL bAuditSuccess,
-             BOOL bAuditFailure
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindFirstFreeAce (
-                PACL pAcl,
-                  LPVOID *pAce
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitializeSecurityDescriptor (
-         PSECURITY_DESCRIPTOR pSecurityDescriptor,
-          DWORD dwRevision
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidSecurityDescriptor (
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetSecurityDescriptorLength (
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorControl (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-         PSECURITY_DESCRIPTOR_CONTROL pControl,
-         LPDWORD lpdwRevision
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorControl (
-         PSECURITY_DESCRIPTOR pSecurityDescriptor,
-         SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
-         SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorDacl (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-             BOOL bDaclPresent,
-           PACL pDacl,
-             BOOL bDaclDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorDacl (
-                PSECURITY_DESCRIPTOR pSecurityDescriptor,
-               LPBOOL lpbDaclPresent,
-                  PACL *pDacl,
-               LPBOOL lpbDaclDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorSacl (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-             BOOL bSaclPresent,
-           PACL pSacl,
-             BOOL bSaclDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorSacl (
-                PSECURITY_DESCRIPTOR pSecurityDescriptor,
-               LPBOOL lpbSaclPresent,
-                  PACL *pSacl,
-               LPBOOL lpbSaclDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorOwner (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-           PSID pOwner,
-             BOOL bOwnerDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorOwner (
-                PSECURITY_DESCRIPTOR pSecurityDescriptor,
-                  PSID *pOwner,
-               LPBOOL lpbOwnerDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorGroup (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-           PSID pGroup,
-             BOOL bGroupDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorGroup (
-                PSECURITY_DESCRIPTOR pSecurityDescriptor,
-                  PSID *pGroup,
-               LPBOOL lpbGroupDefaulted
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetSecurityDescriptorRMControl(
-          PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PUCHAR RMControl
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetSecurityDescriptorRMControl(
-          PSECURITY_DESCRIPTOR SecurityDescriptor,
-         PUCHAR RMControl
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreatePrivateObjectSecurity (
-              PSECURITY_DESCRIPTOR ParentDescriptor,
-              PSECURITY_DESCRIPTOR CreatorDescriptor,
-                  PSECURITY_DESCRIPTOR * NewDescriptor,
-                BOOL IsDirectoryObject,
-              HANDLE Token,
-                PGENERIC_MAPPING GenericMapping
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ConvertToAutoInheritPrivateObjectSecurity(
-              PSECURITY_DESCRIPTOR ParentDescriptor,
-                PSECURITY_DESCRIPTOR CurrentSecurityDescriptor,
-                  PSECURITY_DESCRIPTOR *NewSecurityDescriptor,
-              GUID *ObjectType,
-                BOOLEAN IsDirectoryObject,
-                PGENERIC_MAPPING GenericMapping
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreatePrivateObjectSecurityEx (
-              PSECURITY_DESCRIPTOR ParentDescriptor,
-              PSECURITY_DESCRIPTOR CreatorDescriptor,
-                  PSECURITY_DESCRIPTOR * NewDescriptor,
-              GUID *ObjectType,
-                BOOL IsContainerObject,
-                ULONG AutoInheritFlags,
-              HANDLE Token,
-                PGENERIC_MAPPING GenericMapping
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreatePrivateObjectSecurityWithMultipleInheritance (
-              PSECURITY_DESCRIPTOR ParentDescriptor,
-              PSECURITY_DESCRIPTOR CreatorDescriptor,
-                  PSECURITY_DESCRIPTOR * NewDescriptor,
-             GUID **ObjectTypes,
-                ULONG GuidCount,
-                BOOL IsContainerObject,
-                ULONG AutoInheritFlags,
-              HANDLE Token,
-                PGENERIC_MAPPING GenericMapping
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPrivateObjectSecurity (
-                  SECURITY_INFORMATION SecurityInformation,
-                  PSECURITY_DESCRIPTOR ModificationDescriptor,
-             PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
-                  PGENERIC_MAPPING GenericMapping,
-                HANDLE Token
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPrivateObjectSecurityEx (
-                  SECURITY_INFORMATION SecurityInformation,
-                  PSECURITY_DESCRIPTOR ModificationDescriptor,
-             PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
-                  ULONG AutoInheritFlags,
-                  PGENERIC_MAPPING GenericMapping,
-                HANDLE Token
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetPrivateObjectSecurity (
-          PSECURITY_DESCRIPTOR ObjectDescriptor,
-          SECURITY_INFORMATION SecurityInformation,
-             PSECURITY_DESCRIPTOR ResultantDescriptor,
-          DWORD DescriptorLength,
-         PDWORD ReturnLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyPrivateObjectSecurity (
-     PSECURITY_DESCRIPTOR * ObjectDescriptor
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MakeSelfRelativeSD (
-            PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,
-             PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
-         LPDWORD lpdwBufferLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MakeAbsoluteSD (
-            PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
-             PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,
-         LPDWORD lpdwAbsoluteSecurityDescriptorSize,
-             PACL pDacl,
-         LPDWORD lpdwDaclSize,
-             PACL pSacl,
-         LPDWORD lpdwSaclSize,
-             PSID pOwner,
-         LPDWORD lpdwOwnerSize,
-             PSID pPrimaryGroup,
-         LPDWORD lpdwPrimaryGroupSize
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MakeAbsoluteSD2 (
-               PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
-         LPDWORD lpdwBufferSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileSecurityA (
-         LPCSTR lpFileName,
-         SECURITY_INFORMATION SecurityInformation,
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileSecurityW (
-         LPCWSTR lpFileName,
-         SECURITY_INFORMATION SecurityInformation,
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileSecurityA (
-          LPCSTR lpFileName,
-          SECURITY_INFORMATION RequestedInformation,
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-          DWORD nLength,
-         LPDWORD lpnLengthNeeded
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileSecurityW (
-          LPCWSTR lpFileName,
-          SECURITY_INFORMATION RequestedInformation,
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-          DWORD nLength,
-         LPDWORD lpnLengthNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetKernelObjectSecurity (
-         HANDLE Handle,
-         SECURITY_INFORMATION SecurityInformation,
-         PSECURITY_DESCRIPTOR SecurityDescriptor
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstChangeNotificationA(
-         LPCSTR lpPathName,
-         BOOL bWatchSubtree,
-         DWORD dwNotifyFilter
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstChangeNotificationW(
-         LPCWSTR lpPathName,
-         BOOL bWatchSubtree,
-         DWORD dwNotifyFilter
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextChangeNotification(
-         HANDLE hChangeHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindCloseChangeNotification(
-         HANDLE hChangeHandle
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadDirectoryChangesW(
-             HANDLE hDirectory,
-           LPVOID lpBuffer,
-             DWORD nBufferLength,
-             BOOL bWatchSubtree,
-             DWORD dwNotifyFilter,
-            LPDWORD lpBytesReturned,
-          LPOVERLAPPED lpOverlapped,
-           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualLock(
-         LPVOID lpAddress,
-         SIZE_T dwSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualUnlock(
-         LPVOID lpAddress,
-         SIZE_T dwSize
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-MapViewOfFileEx(
-             HANDLE hFileMappingObject,
-             DWORD dwDesiredAccess,
-             DWORD dwFileOffsetHigh,
-             DWORD dwFileOffsetLow,
-             SIZE_T dwNumberOfBytesToMap,
-           LPVOID lpBaseAddress
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPriorityClass(
-         HANDLE hProcess,
-         DWORD dwPriorityClass
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPriorityClass(
-         HANDLE hProcess
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadReadPtr(
-           const void *lp,
-             UINT_PTR ucb
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadWritePtr(
-           LPVOID lp,
-             UINT_PTR ucb
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadHugeReadPtr(
-           const void *lp,
-             UINT_PTR ucb
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadHugeWritePtr(
-           LPVOID lp,
-             UINT_PTR ucb
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadCodePtr(
-           FARPROC lpfn
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadStringPtrA(
-           LPCSTR lpsz,
-             UINT_PTR ucchMax
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadStringPtrW(
-           LPCWSTR lpsz,
-             UINT_PTR ucchMax
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupAccountSidA(
-           LPCSTR lpSystemName,
-         PSID Sid,
-             LPSTR Name,
-          LPDWORD cchName,
-             LPSTR ReferencedDomainName,
-         LPDWORD cchReferencedDomainName,
-         PSID_NAME_USE peUse
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupAccountSidW(
-           LPCWSTR lpSystemName,
-         PSID Sid,
-             LPWSTR Name,
-          LPDWORD cchName,
-             LPWSTR ReferencedDomainName,
-         LPDWORD cchReferencedDomainName,
-         PSID_NAME_USE peUse
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupAccountNameA(
-           LPCSTR lpSystemName,
-             LPCSTR lpAccountName,
-             PSID Sid,
-          LPDWORD cbSid,
-             LPSTR ReferencedDomainName,
-          LPDWORD cchReferencedDomainName,
-            PSID_NAME_USE peUse
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupAccountNameW(
-           LPCWSTR lpSystemName,
-             LPCWSTR lpAccountName,
-             PSID Sid,
-          LPDWORD cbSid,
-             LPWSTR ReferencedDomainName,
-          LPDWORD cchReferencedDomainName,
-            PSID_NAME_USE peUse
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeValueA(
-           LPCSTR lpSystemName,
-             LPCSTR lpName,
-            PLUID   lpLuid
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeValueW(
-           LPCWSTR lpSystemName,
-             LPCWSTR lpName,
-            PLUID   lpLuid
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeNameA(
-           LPCSTR lpSystemName,
-             PLUID   lpLuid,
-             LPSTR lpName,
-          LPDWORD cchName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeNameW(
-           LPCWSTR lpSystemName,
-             PLUID   lpLuid,
-             LPWSTR lpName,
-          LPDWORD cchName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeDisplayNameA(
-           LPCSTR lpSystemName,
-             LPCSTR lpName,
-             LPSTR lpDisplayName,
-          LPDWORD cchDisplayName,
-            LPDWORD lpLanguageId
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeDisplayNameW(
-           LPCWSTR lpSystemName,
-             LPCWSTR lpName,
-             LPWSTR lpDisplayName,
-          LPDWORD cchDisplayName,
-            LPDWORD lpLanguageId
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllocateLocallyUniqueId(
-         PLUID Luid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BuildCommDCBA(
-          LPCSTR lpDef,
-         LPDCB lpDCB
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-BuildCommDCBW(
-          LPCWSTR lpDef,
-         LPDCB lpDCB
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BuildCommDCBAndTimeoutsA(
-          LPCSTR lpDef,
-         LPDCB lpDCB,
-         LPCOMMTIMEOUTS lpCommTimeouts
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-BuildCommDCBAndTimeoutsW(
-          LPCWSTR lpDef,
-         LPDCB lpDCB,
-         LPCOMMTIMEOUTS lpCommTimeouts
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CommConfigDialogA(
-             LPCSTR lpszName,
-           HWND hWnd,
-          LPCOMMCONFIG lpCC
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CommConfigDialogW(
-             LPCWSTR lpszName,
-           HWND hWnd,
-          LPCOMMCONFIG lpCC
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDefaultCommConfigA(
-            LPCSTR lpszName,
-           LPCOMMCONFIG lpCC,
-         LPDWORD lpdwSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDefaultCommConfigW(
-            LPCWSTR lpszName,
-           LPCOMMCONFIG lpCC,
-         LPDWORD lpdwSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDefaultCommConfigA(
-         LPCSTR lpszName,
-           LPCOMMCONFIG lpCC,
-         DWORD dwSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDefaultCommConfigW(
-         LPCWSTR lpszName,
-           LPCOMMCONFIG lpCC,
-         DWORD dwSize
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComputerNameA (
-           LPSTR lpBuffer,
-         LPDWORD nSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComputerNameW (
-           LPWSTR lpBuffer,
-         LPDWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetComputerNameA (
-         LPCSTR lpComputerName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetComputerNameW (
-         LPCWSTR lpComputerName
-    );
-
-
-
-
-
-
-
-
-
-typedef enum _COMPUTER_NAME_FORMAT {
-    ComputerNameNetBIOS,
-    ComputerNameDnsHostname,
-    ComputerNameDnsDomain,
-    ComputerNameDnsFullyQualified,
-    ComputerNamePhysicalNetBIOS,
-    ComputerNamePhysicalDnsHostname,
-    ComputerNamePhysicalDnsDomain,
-    ComputerNamePhysicalDnsFullyQualified,
-    ComputerNameMax
-} COMPUTER_NAME_FORMAT ;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComputerNameExA (
-            COMPUTER_NAME_FORMAT NameType,
-             LPSTR lpBuffer,
-         LPDWORD nSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComputerNameExW (
-            COMPUTER_NAME_FORMAT NameType,
-             LPWSTR lpBuffer,
-         LPDWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetComputerNameExA (
-         COMPUTER_NAME_FORMAT NameType,
-         LPCSTR lpBuffer
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetComputerNameExW (
-         COMPUTER_NAME_FORMAT NameType,
-         LPCWSTR lpBuffer
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DnsHostnameToComputerNameA (
-            LPCSTR Hostname,
-             LPSTR ComputerName,
-         LPDWORD nSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DnsHostnameToComputerNameW (
-            LPCWSTR Hostname,
-             LPWSTR ComputerName,
-         LPDWORD nSize
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserNameA (
-           LPSTR lpBuffer,
-         LPDWORD pcbBuffer
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserNameW (
-           LPWSTR lpBuffer,
-         LPDWORD pcbBuffer
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LogonUserA (
-                LPCSTR lpszUsername,
-              LPCSTR lpszDomain,
-                LPCSTR lpszPassword,
-                DWORD dwLogonType,
-                DWORD dwLogonProvider,
-                  PHANDLE phToken
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LogonUserW (
-                LPCWSTR lpszUsername,
-              LPCWSTR lpszDomain,
-                LPCWSTR lpszPassword,
-                DWORD dwLogonType,
-                DWORD dwLogonProvider,
-                  PHANDLE phToken
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LogonUserExA (
-                    LPCSTR lpszUsername,
-                  LPCSTR lpszDomain,
-                    LPCSTR lpszPassword,
-                    DWORD dwLogonType,
-                    DWORD dwLogonProvider,
-                    PHANDLE phToken,
-                    PSID  *ppLogonSid,
-                       PVOID *ppProfileBuffer,
-                 LPDWORD pdwProfileLength,
-                 PQUOTA_LIMITS pQuotaLimits
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LogonUserExW (
-                    LPCWSTR lpszUsername,
-                  LPCWSTR lpszDomain,
-                    LPCWSTR lpszPassword,
-                    DWORD dwLogonType,
-                    DWORD dwLogonProvider,
-                    PHANDLE phToken,
-                    PSID  *ppLogonSid,
-                       PVOID *ppProfileBuffer,
-                 LPDWORD pdwProfileLength,
-                 PQUOTA_LIMITS pQuotaLimits
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ImpersonateLoggedOnUser(
-         HANDLE  hToken
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessAsUserA (
-              HANDLE hToken,
-              LPCSTR lpApplicationName,
-           LPSTR lpCommandLine,
-              LPSECURITY_ATTRIBUTES lpProcessAttributes,
-              LPSECURITY_ATTRIBUTES lpThreadAttributes,
-                BOOL bInheritHandles,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCSTR lpCurrentDirectory,
-                LPSTARTUPINFOA lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessAsUserW (
-              HANDLE hToken,
-              LPCWSTR lpApplicationName,
-           LPWSTR lpCommandLine,
-              LPSECURITY_ATTRIBUTES lpProcessAttributes,
-              LPSECURITY_ATTRIBUTES lpThreadAttributes,
-                BOOL bInheritHandles,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCWSTR lpCurrentDirectory,
-                LPSTARTUPINFOW lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessWithLogonW(
-                LPCWSTR lpUsername,
-              LPCWSTR lpDomain,
-                LPCWSTR lpPassword,
-                DWORD dwLogonFlags,
-              LPCWSTR lpApplicationName,
-           LPWSTR lpCommandLine,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCWSTR lpCurrentDirectory,
-                LPSTARTUPINFOW lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-      );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessWithTokenW(
-                HANDLE hToken,
-                DWORD dwLogonFlags,
-              LPCWSTR lpApplicationName,
-           LPWSTR lpCommandLine,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCWSTR lpCurrentDirectory,
-                LPSTARTUPINFOW lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-      );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ImpersonateAnonymousToken(
-         HANDLE ThreadHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DuplicateTokenEx(
-                HANDLE hExistingToken,
-                DWORD dwDesiredAccess,
-              LPSECURITY_ATTRIBUTES lpTokenAttributes,
-                SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
-                TOKEN_TYPE TokenType,
-                  PHANDLE phNewToken);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateRestrictedToken(
-                HANDLE ExistingTokenHandle,
-                DWORD Flags,
-                DWORD DisableSidCount,
-             PSID_AND_ATTRIBUTES SidsToDisable,
-                DWORD DeletePrivilegeCount,
-             PLUID_AND_ATTRIBUTES PrivilegesToDelete,
-                DWORD RestrictedSidCount,
-             PSID_AND_ATTRIBUTES SidsToRestrict,
-                  PHANDLE NewTokenHandle
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsTokenRestricted(
-         HANDLE TokenHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsTokenUntrusted(
-         HANDLE TokenHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckTokenMembership(
-           HANDLE TokenHandle,
-             PSID SidToCheck,
-            PBOOL IsMember
-    );
-
-
-
-
-
-
-
-typedef WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACK ;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RegisterWaitForSingleObject(
-                  PHANDLE phNewWaitObject,
-                HANDLE hObject,
-                WAITORTIMERCALLBACK Callback,
-              PVOID Context,
-                ULONG dwMilliseconds,
-                ULONG dwFlags
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-RegisterWaitForSingleObjectEx(
-             HANDLE hObject,
-             WAITORTIMERCALLBACK Callback,
-           PVOID Context,
-             ULONG dwMilliseconds,
-             ULONG dwFlags
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-UnregisterWait(
-         HANDLE WaitHandle
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-UnregisterWaitEx(
-             HANDLE WaitHandle,
-           HANDLE CompletionEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueueUserWorkItem(
-             LPTHREAD_START_ROUTINE Function,
-           PVOID Context,
-             ULONG Flags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BindIoCompletionCallback (
-         HANDLE FileHandle,
-         LPOVERLAPPED_COMPLETION_ROUTINE Function,
-         ULONG Flags
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateTimerQueue(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateTimerQueueTimer(
-                  PHANDLE phNewTimer,
-              HANDLE TimerQueue,
-                WAITORTIMERCALLBACK Callback,
-              PVOID Parameter,
-                DWORD DueTime,
-                DWORD Period,
-                ULONG Flags
-    ) ;
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-ChangeTimerQueueTimer(
-           HANDLE TimerQueue,
-          HANDLE Timer,
-             ULONG DueTime,
-             ULONG Period
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-DeleteTimerQueueTimer(
-           HANDLE TimerQueue,
-             HANDLE Timer,
-           HANDLE CompletionEvent
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-DeleteTimerQueueEx(
-             HANDLE TimerQueue,
-           HANDLE CompletionEvent
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-SetTimerQueueTimer(
-           HANDLE TimerQueue,
-             WAITORTIMERCALLBACK Callback,
-           PVOID Parameter,
-             DWORD DueTime,
-             DWORD Period,
-             BOOL PreferIo
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-CancelTimerQueueTimer(
-           HANDLE TimerQueue,
-             HANDLE Timer
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-DeleteTimerQueue(
-         HANDLE TimerQueue
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagHW_PROFILE_INFOA {
-    DWORD  dwDockInfo;
-    CHAR   szHwProfileGuid[39];
-    CHAR   szHwProfileName[80];
-} HW_PROFILE_INFOA, *LPHW_PROFILE_INFOA;
-typedef struct tagHW_PROFILE_INFOW {
-    DWORD  dwDockInfo;
-    WCHAR  szHwProfileGuid[39];
-    WCHAR  szHwProfileName[80];
-} HW_PROFILE_INFOW, *LPHW_PROFILE_INFOW;
-
-typedef HW_PROFILE_INFOW HW_PROFILE_INFO;
-typedef LPHW_PROFILE_INFOW LPHW_PROFILE_INFO;
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCurrentHwProfileA (
-         LPHW_PROFILE_INFOA  lpHwProfileInfo
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCurrentHwProfileW (
-         LPHW_PROFILE_INFOW  lpHwProfileInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryPerformanceCounter(
-         LARGE_INTEGER *lpPerformanceCount
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryPerformanceFrequency(
-         LARGE_INTEGER *lpFrequency
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVersionExA(
-         LPOSVERSIONINFOA lpVersionInformation
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVersionExW(
-         LPOSVERSIONINFOW lpVersionInformation
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VerifyVersionInfoA(
-         LPOSVERSIONINFOEXA lpVersionInformation,
-            DWORD dwTypeMask,
-            DWORDLONG dwlConditionMask
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-VerifyVersionInfoW(
-         LPOSVERSIONINFOEXW lpVersionInformation,
-            DWORD dwTypeMask,
-            DWORDLONG dwlConditionMask
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
- 
- 
- 
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SYSTEM_POWER_STATUS {
-    BYTE ACLineStatus;
-    BYTE BatteryFlag;
-    BYTE BatteryLifePercent;
-    BYTE Reserved1;
-    DWORD BatteryLifeTime;
-    DWORD BatteryFullLifeTime;
-}   SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
-
-BOOL
-__stdcall
-GetSystemPowerStatus(
-         LPSYSTEM_POWER_STATUS lpSystemPowerStatus
-    );
-
-BOOL
-__stdcall
-SetSystemPowerState(
-         BOOL fSuspend,
-         BOOL fForce
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllocateUserPhysicalPages(
-            HANDLE hProcess,
-         PULONG_PTR NumberOfPages,
-           PULONG_PTR PageArray
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeUserPhysicalPages(
-            HANDLE hProcess,
-         PULONG_PTR NumberOfPages,
-           PULONG_PTR PageArray
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MapUserPhysicalPages(
-         PVOID VirtualAddress,
-         ULONG_PTR NumberOfPages,
-             PULONG_PTR PageArray
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MapUserPhysicalPagesScatter(
-           PVOID *VirtualAddresses,
-         ULONG_PTR NumberOfPages,
-             PULONG_PTR PageArray
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateJobObjectA(
-           LPSECURITY_ATTRIBUTES lpJobAttributes,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateJobObjectW(
-           LPSECURITY_ATTRIBUTES lpJobAttributes,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenJobObjectA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenJobObjectW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AssignProcessToJobObject(
-         HANDLE hJob,
-         HANDLE hProcess
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TerminateJobObject(
-         HANDLE hJob,
-         UINT uExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryInformationJobObject(
-            HANDLE hJob,
-              JOBOBJECTINFOCLASS JobObjectInformationClass,
-           LPVOID lpJobObjectInformation,
-              DWORD cbJobObjectInformationLength,
-           LPDWORD lpReturnLength
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetInformationJobObject(
-         HANDLE hJob,
-         JOBOBJECTINFOCLASS JobObjectInformationClass,
-           LPVOID lpJobObjectInformation,
-         DWORD cbJobObjectInformationLength
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsProcessInJob (
-             HANDLE ProcessHandle,
-           HANDLE JobHandle,
-            PBOOL Result
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateJobSet (
-         ULONG NumJob,
-           PJOB_SET_ARRAY UserJobSet,
-         ULONG Flags);
-
-__declspec(dllimport)
-    
-PVOID
-__stdcall
-AddVectoredExceptionHandler (
-         ULONG First,
-         PVECTORED_EXCEPTION_HANDLER Handler
-    );
-
-__declspec(dllimport)
-ULONG
-__stdcall
-RemoveVectoredExceptionHandler (
-         PVOID Handle
-    );
-
-__declspec(dllimport)
-    
-PVOID
-__stdcall
-AddVectoredContinueHandler (
-         ULONG First,
-         PVECTORED_EXCEPTION_HANDLER Handler
-    );
-
-__declspec(dllimport)
-ULONG
-__stdcall
-RemoveVectoredContinueHandler (
-         PVOID Handle
-    );
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstVolumeA(
-         LPSTR lpszVolumeName,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstVolumeW(
-         LPWSTR lpszVolumeName,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextVolumeA(
-         HANDLE hFindVolume,
-         LPSTR lpszVolumeName,
-            DWORD cchBufferLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextVolumeW(
-         HANDLE hFindVolume,
-         LPWSTR lpszVolumeName,
-            DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindVolumeClose(
-         HANDLE hFindVolume
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstVolumeMountPointA(
-         LPCSTR lpszRootPathName,
-         LPSTR lpszVolumeMountPoint,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstVolumeMountPointW(
-         LPCWSTR lpszRootPathName,
-         LPWSTR lpszVolumeMountPoint,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextVolumeMountPointA(
-         HANDLE hFindVolumeMountPoint,
-         LPSTR lpszVolumeMountPoint,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextVolumeMountPointW(
-         HANDLE hFindVolumeMountPoint,
-         LPWSTR lpszVolumeMountPoint,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindVolumeMountPointClose(
-         HANDLE hFindVolumeMountPoint
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetVolumeMountPointA(
-         LPCSTR lpszVolumeMountPoint,
-         LPCSTR lpszVolumeName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetVolumeMountPointW(
-         LPCWSTR lpszVolumeMountPoint,
-         LPCWSTR lpszVolumeName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteVolumeMountPointA(
-         LPCSTR lpszVolumeMountPoint
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteVolumeMountPointW(
-         LPCWSTR lpszVolumeMountPoint
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumeNameForVolumeMountPointA(
-         LPCSTR lpszVolumeMountPoint,
-         LPSTR lpszVolumeName,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumeNameForVolumeMountPointW(
-         LPCWSTR lpszVolumeMountPoint,
-         LPWSTR lpszVolumeName,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumePathNameA(
-         LPCSTR lpszFileName,
-         LPSTR lpszVolumePathName,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumePathNameW(
-         LPCWSTR lpszFileName,
-         LPWSTR lpszVolumePathName,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumePathNamesForVolumeNameA(
-          LPCSTR lpszVolumeName,
-              LPCH lpszVolumePathNames,
-          DWORD cchBufferLength,
-         PDWORD lpcchReturnLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumePathNamesForVolumeNameW(
-          LPCWSTR lpszVolumeName,
-              LPWCH lpszVolumePathNames,
-          DWORD cchBufferLength,
-         PDWORD lpcchReturnLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagACTCTXA {
-    ULONG       cbSize;
-    DWORD       dwFlags;
-    LPCSTR      lpSource;
-    USHORT      wProcessorArchitecture;
-    LANGID      wLangId;
-    LPCSTR      lpAssemblyDirectory;
-    LPCSTR      lpResourceName;
-    LPCSTR      lpApplicationName;
-    HMODULE     hModule;
-} ACTCTXA, *PACTCTXA;
-typedef struct tagACTCTXW {
-    ULONG       cbSize;
-    DWORD       dwFlags;
-    LPCWSTR     lpSource;
-    USHORT      wProcessorArchitecture;
-    LANGID      wLangId;
-    LPCWSTR     lpAssemblyDirectory;
-    LPCWSTR     lpResourceName;
-    LPCWSTR     lpApplicationName;
-    HMODULE     hModule;
-} ACTCTXW, *PACTCTXW;
-
-typedef ACTCTXW ACTCTX;
-typedef PACTCTXW PACTCTX;
-
-
-
-
-
-typedef const ACTCTXA *PCACTCTXA;
-typedef const ACTCTXW *PCACTCTXW;
-
-typedef ACTCTXW ACTCTX;
-typedef PCACTCTXW PCACTCTX;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateActCtxA(
-         PCACTCTXA pActCtx
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateActCtxW(
-         PCACTCTXW pActCtx
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-AddRefActCtx(
-         HANDLE hActCtx
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-ReleaseActCtx(
-         HANDLE hActCtx
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ZombifyActCtx(
-         HANDLE hActCtx
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ActivateActCtx(
-         HANDLE hActCtx,
-           ULONG_PTR *lpCookie
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeactivateActCtx(
-         DWORD dwFlags,
-         ULONG_PTR ulCookie
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCurrentActCtx(
-                  HANDLE *lphActCtx);
-
-
-
-
-
-typedef struct tagACTCTX_SECTION_KEYED_DATA_2600 {
-    ULONG cbSize;
-    ULONG ulDataFormatVersion;
-    PVOID lpData;
-    ULONG ulLength;
-    PVOID lpSectionGlobalData;
-    ULONG ulSectionGlobalDataLength;
-    PVOID lpSectionBase;
-    ULONG ulSectionTotalLength;
-    HANDLE hActCtx;
-    ULONG ulAssemblyRosterIndex;
-} ACTCTX_SECTION_KEYED_DATA_2600, *PACTCTX_SECTION_KEYED_DATA_2600;
-typedef const ACTCTX_SECTION_KEYED_DATA_2600 * PCACTCTX_SECTION_KEYED_DATA_2600;
-
-typedef struct tagACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA {
-    PVOID lpInformation;
-    PVOID lpSectionBase;
-    ULONG ulSectionLength;
-    PVOID lpSectionGlobalDataBase;
-    ULONG ulSectionGlobalDataLength;
-} ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, *PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;
-typedef const ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA *PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;
-
-typedef struct tagACTCTX_SECTION_KEYED_DATA {
-    ULONG cbSize;
-    ULONG ulDataFormatVersion;
-    PVOID lpData;
-    ULONG ulLength;
-    PVOID lpSectionGlobalData;
-    ULONG ulSectionGlobalDataLength;
-    PVOID lpSectionBase;
-    ULONG ulSectionTotalLength;
-    HANDLE hActCtx;
-    ULONG ulAssemblyRosterIndex;
-
-    ULONG ulFlags;
-    ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA AssemblyMetadata;
-} ACTCTX_SECTION_KEYED_DATA, *PACTCTX_SECTION_KEYED_DATA;
-typedef const ACTCTX_SECTION_KEYED_DATA * PCACTCTX_SECTION_KEYED_DATA;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindActCtxSectionStringA(
-               DWORD dwFlags,
-      const GUID *lpExtensionGuid,
-               ULONG ulSectionId,
-               LPCSTR lpStringToFind,
-              PACTCTX_SECTION_KEYED_DATA ReturnedData
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FindActCtxSectionStringW(
-               DWORD dwFlags,
-      const GUID *lpExtensionGuid,
-               ULONG ulSectionId,
-               LPCWSTR lpStringToFind,
-              PACTCTX_SECTION_KEYED_DATA ReturnedData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindActCtxSectionGuid(
-               DWORD dwFlags,
-      const GUID *lpExtensionGuid,
-               ULONG ulSectionId,
-             const GUID *lpGuidToFind,
-              PACTCTX_SECTION_KEYED_DATA ReturnedData
-    );
-
-
-
-
-
-
-
-
-typedef struct _ACTIVATION_CONTEXT_BASIC_INFORMATION {
-    HANDLE  hActCtx;
-    DWORD   dwFlags;
-} ACTIVATION_CONTEXT_BASIC_INFORMATION, *PACTIVATION_CONTEXT_BASIC_INFORMATION;
-
-typedef const struct _ACTIVATION_CONTEXT_BASIC_INFORMATION *PCACTIVATION_CONTEXT_BASIC_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryActCtxW(
-              DWORD dwFlags,
-              HANDLE hActCtx,
-            PVOID pvSubInstance,
-              ULONG ulInfoClass,
-             PVOID pvBuffer,
-              SIZE_T cbBuffer,
-           SIZE_T *pcbWrittenOrRequired
-    );
-
-typedef BOOL (__stdcall * PQUERYACTCTXW_FUNC)(
-              DWORD dwFlags,
-              HANDLE hActCtx,
-            PVOID pvSubInstance,
-              ULONG ulInfoClass,
-             PVOID pvBuffer,
-              SIZE_T cbBuffer,
-           SIZE_T *pcbWrittenOrRequired
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ProcessIdToSessionId(
-          DWORD dwProcessId,
-         DWORD *pSessionId
-    );
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WTSGetActiveConsoleSessionId();
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWow64Process(
-          HANDLE hProcess,
-         PBOOL Wow64Process
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetLogicalProcessorInformation(
-           PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
-         PDWORD ReturnedLength
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumaHighestNodeNumber(
-         PULONG HighestNodeNumber
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumaProcessorNode(
-          UCHAR Processor,
-         PUCHAR NodeNumber
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumaNodeProcessorMask(
-          UCHAR Node,
-         PULONGLONG ProcessorMask
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumaAvailableMemoryNode(
-          UCHAR Node,
-         PULONGLONG AvailableBytes
-    );
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DRAWPATRECT {
-        POINT ptPosition;
-        POINT ptSize;
-        WORD wStyle;
-        WORD wPattern;
-} DRAWPATRECT, *PDRAWPATRECT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PSINJECTDATA {
-
-    DWORD   DataBytes;      
-    WORD    InjectionPoint; 
-    WORD    PageNumber;     
-
-    
-
-} PSINJECTDATA, *PPSINJECTDATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PSFEATURE_OUTPUT {
-
-    BOOL bPageIndependent;
-    BOOL bSetPageDevice;
-
-} PSFEATURE_OUTPUT, *PPSFEATURE_OUTPUT;
-
-
-
-
-
-typedef struct _PSFEATURE_CUSTPAPER {
-
-    LONG lOrientation;
-    LONG lWidth;
-    LONG lHeight;
-    LONG lWidthOffset;
-    LONG lHeightOffset;
-
-} PSFEATURE_CUSTPAPER, *PPSFEATURE_CUSTPAPER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  tagXFORM
-  {
-    FLOAT   eM11;
-    FLOAT   eM12;
-    FLOAT   eM21;
-    FLOAT   eM22;
-    FLOAT   eDx;
-    FLOAT   eDy;
-  } XFORM, *PXFORM,  *LPXFORM;
-
-
-typedef struct tagBITMAP
-  {
-    LONG        bmType;
-    LONG        bmWidth;
-    LONG        bmHeight;
-    LONG        bmWidthBytes;
-    WORD        bmPlanes;
-    WORD        bmBitsPixel;
-    LPVOID      bmBits;
-  } BITMAP, *PBITMAP,  *NPBITMAP,  *LPBITMAP;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct tagRGBTRIPLE {
-        BYTE    rgbtBlue;
-        BYTE    rgbtGreen;
-        BYTE    rgbtRed;
-} RGBTRIPLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-typedef struct tagRGBQUAD {
-        BYTE    rgbBlue;
-        BYTE    rgbGreen;
-        BYTE    rgbRed;
-        BYTE    rgbReserved;
-} RGBQUAD;
-typedef RGBQUAD * LPRGBQUAD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LONG   LCSCSTYPE;
-
-
-typedef LONG    LCSGAMUTMATCH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef long            FXPT16DOT16,  *LPFXPT16DOT16;
-typedef long            FXPT2DOT30,  *LPFXPT2DOT30;
-
-
-
-
-typedef struct tagCIEXYZ
-{
-        FXPT2DOT30 ciexyzX;
-        FXPT2DOT30 ciexyzY;
-        FXPT2DOT30 ciexyzZ;
-} CIEXYZ;
-typedef CIEXYZ   *LPCIEXYZ;
-
-typedef struct tagICEXYZTRIPLE
-{
-        CIEXYZ  ciexyzRed;
-        CIEXYZ  ciexyzGreen;
-        CIEXYZ  ciexyzBlue;
-} CIEXYZTRIPLE;
-typedef CIEXYZTRIPLE     *LPCIEXYZTRIPLE;
-
-
-
-
-
-
-typedef struct tagLOGCOLORSPACEA {
-    DWORD lcsSignature;
-    DWORD lcsVersion;
-    DWORD lcsSize;
-    LCSCSTYPE lcsCSType;
-    LCSGAMUTMATCH lcsIntent;
-    CIEXYZTRIPLE lcsEndpoints;
-    DWORD lcsGammaRed;
-    DWORD lcsGammaGreen;
-    DWORD lcsGammaBlue;
-    CHAR   lcsFilename[260];
-} LOGCOLORSPACEA, *LPLOGCOLORSPACEA;
-typedef struct tagLOGCOLORSPACEW {
-    DWORD lcsSignature;
-    DWORD lcsVersion;
-    DWORD lcsSize;
-    LCSCSTYPE lcsCSType;
-    LCSGAMUTMATCH lcsIntent;
-    CIEXYZTRIPLE lcsEndpoints;
-    DWORD lcsGammaRed;
-    DWORD lcsGammaGreen;
-    DWORD lcsGammaBlue;
-    WCHAR  lcsFilename[260];
-} LOGCOLORSPACEW, *LPLOGCOLORSPACEW;
-
-typedef LOGCOLORSPACEW LOGCOLORSPACE;
-typedef LPLOGCOLORSPACEW LPLOGCOLORSPACE;
-
-
-
-
-
-
-
-
-typedef struct tagBITMAPCOREHEADER {
-        DWORD   bcSize;                 
-        WORD    bcWidth;
-        WORD    bcHeight;
-        WORD    bcPlanes;
-        WORD    bcBitCount;
-} BITMAPCOREHEADER,  *LPBITMAPCOREHEADER, *PBITMAPCOREHEADER;
-
-typedef struct tagBITMAPINFOHEADER{
-        DWORD      biSize;
-        LONG       biWidth;
-        LONG       biHeight;
-        WORD       biPlanes;
-        WORD       biBitCount;
-        DWORD      biCompression;
-        DWORD      biSizeImage;
-        LONG       biXPelsPerMeter;
-        LONG       biYPelsPerMeter;
-        DWORD      biClrUsed;
-        DWORD      biClrImportant;
-} BITMAPINFOHEADER,  *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
-
-
-typedef struct {
-        DWORD        bV4Size;
-        LONG         bV4Width;
-        LONG         bV4Height;
-        WORD         bV4Planes;
-        WORD         bV4BitCount;
-        DWORD        bV4V4Compression;
-        DWORD        bV4SizeImage;
-        LONG         bV4XPelsPerMeter;
-        LONG         bV4YPelsPerMeter;
-        DWORD        bV4ClrUsed;
-        DWORD        bV4ClrImportant;
-        DWORD        bV4RedMask;
-        DWORD        bV4GreenMask;
-        DWORD        bV4BlueMask;
-        DWORD        bV4AlphaMask;
-        DWORD        bV4CSType;
-        CIEXYZTRIPLE bV4Endpoints;
-        DWORD        bV4GammaRed;
-        DWORD        bV4GammaGreen;
-        DWORD        bV4GammaBlue;
-} BITMAPV4HEADER,  *LPBITMAPV4HEADER, *PBITMAPV4HEADER;
-
-
-
-typedef struct {
-        DWORD        bV5Size;
-        LONG         bV5Width;
-        LONG         bV5Height;
-        WORD         bV5Planes;
-        WORD         bV5BitCount;
-        DWORD        bV5Compression;
-        DWORD        bV5SizeImage;
-        LONG         bV5XPelsPerMeter;
-        LONG         bV5YPelsPerMeter;
-        DWORD        bV5ClrUsed;
-        DWORD        bV5ClrImportant;
-        DWORD        bV5RedMask;
-        DWORD        bV5GreenMask;
-        DWORD        bV5BlueMask;
-        DWORD        bV5AlphaMask;
-        DWORD        bV5CSType;
-        CIEXYZTRIPLE bV5Endpoints;
-        DWORD        bV5GammaRed;
-        DWORD        bV5GammaGreen;
-        DWORD        bV5GammaBlue;
-        DWORD        bV5Intent;
-        DWORD        bV5ProfileData;
-        DWORD        bV5ProfileSize;
-        DWORD        bV5Reserved;
-} BITMAPV5HEADER,  *LPBITMAPV5HEADER, *PBITMAPV5HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagBITMAPINFO {
-    BITMAPINFOHEADER    bmiHeader;
-    RGBQUAD             bmiColors[1];
-} BITMAPINFO,  *LPBITMAPINFO, *PBITMAPINFO;
-
-typedef struct tagBITMAPCOREINFO {
-    BITMAPCOREHEADER    bmciHeader;
-    RGBTRIPLE           bmciColors[1];
-} BITMAPCOREINFO,  *LPBITMAPCOREINFO, *PBITMAPCOREINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-typedef struct tagBITMAPFILEHEADER {
-        WORD    bfType;
-        DWORD   bfSize;
-        WORD    bfReserved1;
-        WORD    bfReserved2;
-        DWORD   bfOffBits;
-} BITMAPFILEHEADER,  *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagFONTSIGNATURE
-{
-    DWORD fsUsb[4];
-    DWORD fsCsb[2];
-} FONTSIGNATURE, *PFONTSIGNATURE, *LPFONTSIGNATURE;
-
-typedef struct tagCHARSETINFO
-{
-    UINT ciCharset;
-    UINT ciACP;
-    FONTSIGNATURE fs;
-} CHARSETINFO, *PCHARSETINFO,  *NPCHARSETINFO,  *LPCHARSETINFO;
-
-
-
-
-
-
-typedef struct tagLOCALESIGNATURE
-{
-    DWORD lsUsb[4];
-    DWORD lsCsbDefault[2];
-    DWORD lsCsbSupported[2];
-} LOCALESIGNATURE, *PLOCALESIGNATURE, *LPLOCALESIGNATURE;
-
-
-
-
-
-
-
-
-typedef struct tagHANDLETABLE
-  {
-    HGDIOBJ     objectHandle[1];
-  } HANDLETABLE, *PHANDLETABLE,  *LPHANDLETABLE;
-
-typedef struct tagMETARECORD
-  {
-    DWORD       rdSize;
-    WORD        rdFunction;
-    WORD        rdParm[1];
-  } METARECORD;
-typedef struct tagMETARECORD  *PMETARECORD;
-typedef struct tagMETARECORD   *LPMETARECORD;
-
-typedef struct tagMETAFILEPICT
-  {
-    LONG        mm;
-    LONG        xExt;
-    LONG        yExt;
-    HMETAFILE   hMF;
-  } METAFILEPICT,  *LPMETAFILEPICT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-typedef struct tagMETAHEADER
-{
-    WORD        mtType;
-    WORD        mtHeaderSize;
-    WORD        mtVersion;
-    DWORD       mtSize;
-    WORD        mtNoObjects;
-    DWORD       mtMaxRecord;
-    WORD        mtNoParameters;
-} METAHEADER;
-typedef struct tagMETAHEADER  *PMETAHEADER;
-typedef struct tagMETAHEADER   *LPMETAHEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-typedef struct tagENHMETARECORD
-{
-    DWORD   iType;              
-    DWORD   nSize;              
-    DWORD   dParm[1];           
-} ENHMETARECORD, *PENHMETARECORD, *LPENHMETARECORD;
-
-typedef struct tagENHMETAHEADER
-{
-    DWORD   iType;              
-    DWORD   nSize;              
-                                
-    RECTL   rclBounds;          
-    RECTL   rclFrame;           
-    DWORD   dSignature;         
-    DWORD   nVersion;           
-    DWORD   nBytes;             
-    DWORD   nRecords;           
-    WORD    nHandles;           
-                                
-    WORD    sReserved;          
-    DWORD   nDescription;       
-                                
-    DWORD   offDescription;     
-                                
-    DWORD   nPalEntries;        
-    SIZEL   szlDevice;          
-    SIZEL   szlMillimeters;     
-
-    DWORD   cbPixelFormat;      
-                                
-    DWORD   offPixelFormat;     
-                                
-    DWORD   bOpenGL;            
-                                
-
-
-    SIZEL   szlMicrometers;     
-
-
-} ENHMETAHEADER, *PENHMETAHEADER, *LPENHMETAHEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    typedef WCHAR BCHAR;
-
-
-
-
-
-
-typedef struct tagTEXTMETRICA
-{
-    LONG        tmHeight;
-    LONG        tmAscent;
-    LONG        tmDescent;
-    LONG        tmInternalLeading;
-    LONG        tmExternalLeading;
-    LONG        tmAveCharWidth;
-    LONG        tmMaxCharWidth;
-    LONG        tmWeight;
-    LONG        tmOverhang;
-    LONG        tmDigitizedAspectX;
-    LONG        tmDigitizedAspectY;
-    BYTE        tmFirstChar;
-    BYTE        tmLastChar;
-    BYTE        tmDefaultChar;
-    BYTE        tmBreakChar;
-    BYTE        tmItalic;
-    BYTE        tmUnderlined;
-    BYTE        tmStruckOut;
-    BYTE        tmPitchAndFamily;
-    BYTE        tmCharSet;
-} TEXTMETRICA, *PTEXTMETRICA,  *NPTEXTMETRICA,  *LPTEXTMETRICA;
-typedef struct tagTEXTMETRICW
-{
-    LONG        tmHeight;
-    LONG        tmAscent;
-    LONG        tmDescent;
-    LONG        tmInternalLeading;
-    LONG        tmExternalLeading;
-    LONG        tmAveCharWidth;
-    LONG        tmMaxCharWidth;
-    LONG        tmWeight;
-    LONG        tmOverhang;
-    LONG        tmDigitizedAspectX;
-    LONG        tmDigitizedAspectY;
-    WCHAR       tmFirstChar;
-    WCHAR       tmLastChar;
-    WCHAR       tmDefaultChar;
-    WCHAR       tmBreakChar;
-    BYTE        tmItalic;
-    BYTE        tmUnderlined;
-    BYTE        tmStruckOut;
-    BYTE        tmPitchAndFamily;
-    BYTE        tmCharSet;
-} TEXTMETRICW, *PTEXTMETRICW,  *NPTEXTMETRICW,  *LPTEXTMETRICW;
-
-typedef TEXTMETRICW TEXTMETRIC;
-typedef PTEXTMETRICW PTEXTMETRIC;
-typedef NPTEXTMETRICW NPTEXTMETRIC;
-typedef LPTEXTMETRICW LPTEXTMETRIC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,4)
-
-
-
-
-
-
-
-
-typedef struct tagNEWTEXTMETRICA
-{
-    LONG        tmHeight;
-    LONG        tmAscent;
-    LONG        tmDescent;
-    LONG        tmInternalLeading;
-    LONG        tmExternalLeading;
-    LONG        tmAveCharWidth;
-    LONG        tmMaxCharWidth;
-    LONG        tmWeight;
-    LONG        tmOverhang;
-    LONG        tmDigitizedAspectX;
-    LONG        tmDigitizedAspectY;
-    BYTE        tmFirstChar;
-    BYTE        tmLastChar;
-    BYTE        tmDefaultChar;
-    BYTE        tmBreakChar;
-    BYTE        tmItalic;
-    BYTE        tmUnderlined;
-    BYTE        tmStruckOut;
-    BYTE        tmPitchAndFamily;
-    BYTE        tmCharSet;
-    DWORD   ntmFlags;
-    UINT    ntmSizeEM;
-    UINT    ntmCellHeight;
-    UINT    ntmAvgWidth;
-} NEWTEXTMETRICA, *PNEWTEXTMETRICA,  *NPNEWTEXTMETRICA,  *LPNEWTEXTMETRICA;
-typedef struct tagNEWTEXTMETRICW
-{
-    LONG        tmHeight;
-    LONG        tmAscent;
-    LONG        tmDescent;
-    LONG        tmInternalLeading;
-    LONG        tmExternalLeading;
-    LONG        tmAveCharWidth;
-    LONG        tmMaxCharWidth;
-    LONG        tmWeight;
-    LONG        tmOverhang;
-    LONG        tmDigitizedAspectX;
-    LONG        tmDigitizedAspectY;
-    WCHAR       tmFirstChar;
-    WCHAR       tmLastChar;
-    WCHAR       tmDefaultChar;
-    WCHAR       tmBreakChar;
-    BYTE        tmItalic;
-    BYTE        tmUnderlined;
-    BYTE        tmStruckOut;
-    BYTE        tmPitchAndFamily;
-    BYTE        tmCharSet;
-    DWORD   ntmFlags;
-    UINT    ntmSizeEM;
-    UINT    ntmCellHeight;
-    UINT    ntmAvgWidth;
-} NEWTEXTMETRICW, *PNEWTEXTMETRICW,  *NPNEWTEXTMETRICW,  *LPNEWTEXTMETRICW;
-
-typedef NEWTEXTMETRICW NEWTEXTMETRIC;
-typedef PNEWTEXTMETRICW PNEWTEXTMETRIC;
-typedef NPNEWTEXTMETRICW NPNEWTEXTMETRIC;
-typedef LPNEWTEXTMETRICW LPNEWTEXTMETRIC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-typedef struct tagNEWTEXTMETRICEXA
-{
-    NEWTEXTMETRICA  ntmTm;
-    FONTSIGNATURE   ntmFontSig;
-}NEWTEXTMETRICEXA;
-typedef struct tagNEWTEXTMETRICEXW
-{
-    NEWTEXTMETRICW  ntmTm;
-    FONTSIGNATURE   ntmFontSig;
-}NEWTEXTMETRICEXW;
-
-typedef NEWTEXTMETRICEXW NEWTEXTMETRICEX;
-
-
-
-
-
-
-
-
-
-typedef struct tagPELARRAY
-  {
-    LONG        paXCount;
-    LONG        paYCount;
-    LONG        paXExt;
-    LONG        paYExt;
-    BYTE        paRGBs;
-  } PELARRAY, *PPELARRAY,  *NPPELARRAY,  *LPPELARRAY;
-
-
-typedef struct tagLOGBRUSH
-  {
-    UINT        lbStyle;
-    COLORREF    lbColor;
-    ULONG_PTR    lbHatch;    
-  } LOGBRUSH, *PLOGBRUSH,  *NPLOGBRUSH,  *LPLOGBRUSH;
-
-typedef struct tagLOGBRUSH32
-  {
-    UINT        lbStyle;
-    COLORREF    lbColor;
-    ULONG       lbHatch;
-  } LOGBRUSH32, *PLOGBRUSH32,  *NPLOGBRUSH32,  *LPLOGBRUSH32;
-
-typedef LOGBRUSH            PATTERN;
-typedef PATTERN             *PPATTERN;
-typedef PATTERN         *NPPATTERN;
-typedef PATTERN          *LPPATTERN;
-
-
-typedef struct tagLOGPEN
-  {
-    UINT        lopnStyle;
-    POINT       lopnWidth;
-    COLORREF    lopnColor;
-  } LOGPEN, *PLOGPEN,  *NPLOGPEN,  *LPLOGPEN;
-
-typedef struct tagEXTLOGPEN {
-    DWORD       elpPenStyle;
-    DWORD       elpWidth;
-    UINT        elpBrushStyle;
-    COLORREF    elpColor;
-    ULONG_PTR    elpHatch;     
-    DWORD       elpNumEntries;
-    DWORD       elpStyleEntry[1];
-} EXTLOGPEN, *PEXTLOGPEN,  *NPEXTLOGPEN,  *LPEXTLOGPEN;
-
-
-
-typedef struct tagPALETTEENTRY {
-    BYTE        peRed;
-    BYTE        peGreen;
-    BYTE        peBlue;
-    BYTE        peFlags;
-} PALETTEENTRY, *PPALETTEENTRY,  *LPPALETTEENTRY;
-
-
-
-
-
-typedef struct tagLOGPALETTE {
-    WORD        palVersion;
-    WORD        palNumEntries;
-    PALETTEENTRY        palPalEntry[1];
-} LOGPALETTE, *PLOGPALETTE,  *NPLOGPALETTE,  *LPLOGPALETTE;
-
-
-
-
-
-
-typedef struct tagLOGFONTA
-{
-    LONG      lfHeight;
-    LONG      lfWidth;
-    LONG      lfEscapement;
-    LONG      lfOrientation;
-    LONG      lfWeight;
-    BYTE      lfItalic;
-    BYTE      lfUnderline;
-    BYTE      lfStrikeOut;
-    BYTE      lfCharSet;
-    BYTE      lfOutPrecision;
-    BYTE      lfClipPrecision;
-    BYTE      lfQuality;
-    BYTE      lfPitchAndFamily;
-    CHAR      lfFaceName[32];
-} LOGFONTA, *PLOGFONTA,  *NPLOGFONTA,  *LPLOGFONTA;
-typedef struct tagLOGFONTW
-{
-    LONG      lfHeight;
-    LONG      lfWidth;
-    LONG      lfEscapement;
-    LONG      lfOrientation;
-    LONG      lfWeight;
-    BYTE      lfItalic;
-    BYTE      lfUnderline;
-    BYTE      lfStrikeOut;
-    BYTE      lfCharSet;
-    BYTE      lfOutPrecision;
-    BYTE      lfClipPrecision;
-    BYTE      lfQuality;
-    BYTE      lfPitchAndFamily;
-    WCHAR     lfFaceName[32];
-} LOGFONTW, *PLOGFONTW,  *NPLOGFONTW,  *LPLOGFONTW;
-
-typedef LOGFONTW LOGFONT;
-typedef PLOGFONTW PLOGFONT;
-typedef NPLOGFONTW NPLOGFONT;
-typedef LPLOGFONTW LPLOGFONT;
-
-
-
-
-
-
-
-
-
-
-typedef struct tagENUMLOGFONTA
-{
-    LOGFONTA elfLogFont;
-    BYTE     elfFullName[64];
-    BYTE     elfStyle[32];
-} ENUMLOGFONTA, * LPENUMLOGFONTA;
-
-typedef struct tagENUMLOGFONTW
-{
-    LOGFONTW elfLogFont;
-    WCHAR    elfFullName[64];
-    WCHAR    elfStyle[32];
-} ENUMLOGFONTW, * LPENUMLOGFONTW;
-
-typedef ENUMLOGFONTW ENUMLOGFONT;
-typedef LPENUMLOGFONTW LPENUMLOGFONT;
-
-
-
-
-
-
-typedef struct tagENUMLOGFONTEXA
-{
-    LOGFONTA    elfLogFont;
-    BYTE        elfFullName[64];
-    BYTE        elfStyle[32];
-    BYTE        elfScript[32];
-} ENUMLOGFONTEXA,  *LPENUMLOGFONTEXA;
-typedef struct tagENUMLOGFONTEXW
-{
-    LOGFONTW    elfLogFont;
-    WCHAR       elfFullName[64];
-    WCHAR       elfStyle[32];
-    WCHAR       elfScript[32];
-} ENUMLOGFONTEXW,  *LPENUMLOGFONTEXW;
-
-typedef ENUMLOGFONTEXW ENUMLOGFONTEX;
-typedef LPENUMLOGFONTEXW LPENUMLOGFONTEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                    
-
-                                    
-
-                                    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPANOSE
-{
-    BYTE    bFamilyType;
-    BYTE    bSerifStyle;
-    BYTE    bWeight;
-    BYTE    bProportion;
-    BYTE    bContrast;
-    BYTE    bStrokeVariation;
-    BYTE    bArmStyle;
-    BYTE    bLetterform;
-    BYTE    bMidline;
-    BYTE    bXHeight;
-} PANOSE, * LPPANOSE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagEXTLOGFONTA {
-    LOGFONTA    elfLogFont;
-    BYTE        elfFullName[64];
-    BYTE        elfStyle[32];
-    DWORD       elfVersion;     
-    DWORD       elfStyleSize;
-    DWORD       elfMatch;
-    DWORD       elfReserved;
-    BYTE        elfVendorId[4];
-    DWORD       elfCulture;     
-    PANOSE      elfPanose;
-} EXTLOGFONTA, *PEXTLOGFONTA,  *NPEXTLOGFONTA,  *LPEXTLOGFONTA;
-typedef struct tagEXTLOGFONTW {
-    LOGFONTW    elfLogFont;
-    WCHAR       elfFullName[64];
-    WCHAR       elfStyle[32];
-    DWORD       elfVersion;     
-    DWORD       elfStyleSize;
-    DWORD       elfMatch;
-    DWORD       elfReserved;
-    BYTE        elfVendorId[4];
-    DWORD       elfCulture;     
-    PANOSE      elfPanose;
-} EXTLOGFONTW, *PEXTLOGFONTW,  *NPEXTLOGFONTW,  *LPEXTLOGFONTW;
-
-typedef EXTLOGFONTW EXTLOGFONT;
-typedef PEXTLOGFONTW PEXTLOGFONT;
-typedef NPEXTLOGFONTW NPEXTLOGFONT;
-typedef LPEXTLOGFONTW LPEXTLOGFONT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                             
-
-                             
-
-                             
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _devicemodeA {
-    BYTE   dmDeviceName[32];
-    WORD dmSpecVersion;
-    WORD dmDriverVersion;
-    WORD dmSize;
-    WORD dmDriverExtra;
-    DWORD dmFields;
-    union {
-      
-      struct {
-        short dmOrientation;
-        short dmPaperSize;
-        short dmPaperLength;
-        short dmPaperWidth;
-        short dmScale;
-        short dmCopies;
-        short dmDefaultSource;
-        short dmPrintQuality;
-      };
-      
-      struct {
-        POINTL dmPosition;
-        DWORD  dmDisplayOrientation;
-        DWORD  dmDisplayFixedOutput; 
-      };
-    };
-    short dmColor;
-    short dmDuplex;
-    short dmYResolution;
-    short dmTTOption;
-    short dmCollate;
-    BYTE   dmFormName[32];
-    WORD   dmLogPixels;
-    DWORD  dmBitsPerPel;
-    DWORD  dmPelsWidth;
-    DWORD  dmPelsHeight;
-    union {
-        DWORD  dmDisplayFlags;
-        DWORD  dmNup;
-    };
-    DWORD  dmDisplayFrequency;
-
-    DWORD  dmICMMethod;
-    DWORD  dmICMIntent;
-    DWORD  dmMediaType;
-    DWORD  dmDitherType;
-    DWORD  dmReserved1;
-    DWORD  dmReserved2;
-
-    DWORD  dmPanningWidth;
-    DWORD  dmPanningHeight;
-
-
-} DEVMODEA, *PDEVMODEA, *NPDEVMODEA, *LPDEVMODEA;
-typedef struct _devicemodeW {
-    WCHAR  dmDeviceName[32];
-    WORD dmSpecVersion;
-    WORD dmDriverVersion;
-    WORD dmSize;
-    WORD dmDriverExtra;
-    DWORD dmFields;
-    union {
-      
-      struct {
-        short dmOrientation;
-        short dmPaperSize;
-        short dmPaperLength;
-        short dmPaperWidth;
-        short dmScale;
-        short dmCopies;
-        short dmDefaultSource;
-        short dmPrintQuality;
-      };
-      
-      struct {
-        POINTL dmPosition;
-        DWORD  dmDisplayOrientation;
-        DWORD  dmDisplayFixedOutput; 
-      };
-    };
-    short dmColor;
-    short dmDuplex;
-    short dmYResolution;
-    short dmTTOption;
-    short dmCollate;
-    WCHAR  dmFormName[32];
-    WORD   dmLogPixels;
-    DWORD  dmBitsPerPel;
-    DWORD  dmPelsWidth;
-    DWORD  dmPelsHeight;
-    union {
-        DWORD  dmDisplayFlags;
-        DWORD  dmNup;
-    };
-    DWORD  dmDisplayFrequency;
-
-    DWORD  dmICMMethod;
-    DWORD  dmICMIntent;
-    DWORD  dmMediaType;
-    DWORD  dmDitherType;
-    DWORD  dmReserved1;
-    DWORD  dmReserved2;
-
-    DWORD  dmPanningWidth;
-    DWORD  dmPanningHeight;
-
-
-} DEVMODEW, *PDEVMODEW, *NPDEVMODEW, *LPDEVMODEW;
-
-typedef DEVMODEW DEVMODE;
-typedef PDEVMODEW PDEVMODE;
-typedef NPDEVMODEW NPDEVMODE;
-typedef LPDEVMODEW LPDEVMODE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISPLAY_DEVICEA {
-    DWORD  cb;
-    CHAR   DeviceName[32];
-    CHAR   DeviceString[128];
-    DWORD  StateFlags;
-    CHAR   DeviceID[128];
-    CHAR   DeviceKey[128];
-} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA;
-typedef struct _DISPLAY_DEVICEW {
-    DWORD  cb;
-    WCHAR  DeviceName[32];
-    WCHAR  DeviceString[128];
-    DWORD  StateFlags;
-    WCHAR  DeviceID[128];
-    WCHAR  DeviceKey[128];
-} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW, *LPDISPLAY_DEVICEW;
-
-typedef DISPLAY_DEVICEW DISPLAY_DEVICE;
-typedef PDISPLAY_DEVICEW PDISPLAY_DEVICE;
-typedef LPDISPLAY_DEVICEW LPDISPLAY_DEVICE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RGNDATAHEADER {
-    DWORD   dwSize;
-    DWORD   iType;
-    DWORD   nCount;
-    DWORD   nRgnSize;
-    RECT    rcBound;
-} RGNDATAHEADER, *PRGNDATAHEADER;
-
-typedef struct _RGNDATA {
-    RGNDATAHEADER   rdh;
-    char            Buffer[1];
-} RGNDATA, *PRGNDATA,  *NPRGNDATA,  *LPRGNDATA;
-
-
-
-
-
-typedef struct _ABC {
-    int     abcA;
-    UINT    abcB;
-    int     abcC;
-} ABC, *PABC,  *NPABC,  *LPABC;
-
-typedef struct _ABCFLOAT {
-    FLOAT   abcfA;
-    FLOAT   abcfB;
-    FLOAT   abcfC;
-} ABCFLOAT, *PABCFLOAT,  *NPABCFLOAT,  *LPABCFLOAT;
-
-
-
-
-
-
-typedef struct _OUTLINETEXTMETRICA {
-    UINT    otmSize;
-    TEXTMETRICA otmTextMetrics;
-    BYTE    otmFiller;
-    PANOSE  otmPanoseNumber;
-    UINT    otmfsSelection;
-    UINT    otmfsType;
-     int    otmsCharSlopeRise;
-     int    otmsCharSlopeRun;
-     int    otmItalicAngle;
-    UINT    otmEMSquare;
-     int    otmAscent;
-     int    otmDescent;
-    UINT    otmLineGap;
-    UINT    otmsCapEmHeight;
-    UINT    otmsXHeight;
-    RECT    otmrcFontBox;
-     int    otmMacAscent;
-     int    otmMacDescent;
-    UINT    otmMacLineGap;
-    UINT    otmusMinimumPPEM;
-    POINT   otmptSubscriptSize;
-    POINT   otmptSubscriptOffset;
-    POINT   otmptSuperscriptSize;
-    POINT   otmptSuperscriptOffset;
-    UINT    otmsStrikeoutSize;
-     int    otmsStrikeoutPosition;
-     int    otmsUnderscoreSize;
-     int    otmsUnderscorePosition;
-    PSTR    otmpFamilyName;
-    PSTR    otmpFaceName;
-    PSTR    otmpStyleName;
-    PSTR    otmpFullName;
-} OUTLINETEXTMETRICA, *POUTLINETEXTMETRICA,  *NPOUTLINETEXTMETRICA,  *LPOUTLINETEXTMETRICA;
-typedef struct _OUTLINETEXTMETRICW {
-    UINT    otmSize;
-    TEXTMETRICW otmTextMetrics;
-    BYTE    otmFiller;
-    PANOSE  otmPanoseNumber;
-    UINT    otmfsSelection;
-    UINT    otmfsType;
-     int    otmsCharSlopeRise;
-     int    otmsCharSlopeRun;
-     int    otmItalicAngle;
-    UINT    otmEMSquare;
-     int    otmAscent;
-     int    otmDescent;
-    UINT    otmLineGap;
-    UINT    otmsCapEmHeight;
-    UINT    otmsXHeight;
-    RECT    otmrcFontBox;
-     int    otmMacAscent;
-     int    otmMacDescent;
-    UINT    otmMacLineGap;
-    UINT    otmusMinimumPPEM;
-    POINT   otmptSubscriptSize;
-    POINT   otmptSubscriptOffset;
-    POINT   otmptSuperscriptSize;
-    POINT   otmptSuperscriptOffset;
-    UINT    otmsStrikeoutSize;
-     int    otmsStrikeoutPosition;
-     int    otmsUnderscoreSize;
-     int    otmsUnderscorePosition;
-    PSTR    otmpFamilyName;
-    PSTR    otmpFaceName;
-    PSTR    otmpStyleName;
-    PSTR    otmpFullName;
-} OUTLINETEXTMETRICW, *POUTLINETEXTMETRICW,  *NPOUTLINETEXTMETRICW,  *LPOUTLINETEXTMETRICW;
-
-typedef OUTLINETEXTMETRICW OUTLINETEXTMETRIC;
-typedef POUTLINETEXTMETRICW POUTLINETEXTMETRIC;
-typedef NPOUTLINETEXTMETRICW NPOUTLINETEXTMETRIC;
-typedef LPOUTLINETEXTMETRICW LPOUTLINETEXTMETRIC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPOLYTEXTA
-{
-    int       x;
-    int       y;
-    UINT      n;
-    LPCSTR    lpstr;
-    UINT      uiFlags;
-    RECT      rcl;
-    int      *pdx;
-} POLYTEXTA, *PPOLYTEXTA,  *NPPOLYTEXTA,  *LPPOLYTEXTA;
-typedef struct tagPOLYTEXTW
-{
-    int       x;
-    int       y;
-    UINT      n;
-    LPCWSTR   lpstr;
-    UINT      uiFlags;
-    RECT      rcl;
-    int      *pdx;
-} POLYTEXTW, *PPOLYTEXTW,  *NPPOLYTEXTW,  *LPPOLYTEXTW;
-
-typedef POLYTEXTW POLYTEXT;
-typedef PPOLYTEXTW PPOLYTEXT;
-typedef NPPOLYTEXTW NPPOLYTEXT;
-typedef LPPOLYTEXTW LPPOLYTEXT;
-
-
-
-
-
-
-
-typedef struct _FIXED {
-
-    WORD    fract;
-    short   value;
-
-
-
-
-} FIXED;
-
-
-typedef struct _MAT2 {
-     FIXED  eM11;
-     FIXED  eM12;
-     FIXED  eM21;
-     FIXED  eM22;
-} MAT2,  *LPMAT2;
-
-
-
-typedef struct _GLYPHMETRICS {
-    UINT    gmBlackBoxX;
-    UINT    gmBlackBoxY;
-    POINT   gmptGlyphOrigin;
-    short   gmCellIncX;
-    short   gmCellIncY;
-} GLYPHMETRICS,  *LPGLYPHMETRICS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPOINTFX
-{
-    FIXED x;
-    FIXED y;
-} POINTFX, * LPPOINTFX;
-
-typedef struct tagTTPOLYCURVE
-{
-    WORD    wType;
-    WORD    cpfx;
-    POINTFX apfx[1];
-} TTPOLYCURVE, * LPTTPOLYCURVE;
-
-typedef struct tagTTPOLYGONHEADER
-{
-    DWORD   cb;
-    DWORD   dwType;
-    POINTFX pfxStart;
-} TTPOLYGONHEADER, * LPTTPOLYGONHEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagGCP_RESULTSA
-    {
-    DWORD   lStructSize;
-    LPSTR     lpOutString;
-    UINT  *lpOrder;
-    int   *lpDx;
-    int   *lpCaretPos;
-    LPSTR   lpClass;
-    LPWSTR  lpGlyphs;
-    UINT    nGlyphs;
-    int     nMaxFit;
-    } GCP_RESULTSA, * LPGCP_RESULTSA;
-typedef struct tagGCP_RESULTSW
-    {
-    DWORD   lStructSize;
-    LPWSTR    lpOutString;
-    UINT  *lpOrder;
-    int   *lpDx;
-    int   *lpCaretPos;
-    LPSTR   lpClass;
-    LPWSTR  lpGlyphs;
-    UINT    nGlyphs;
-    int     nMaxFit;
-    } GCP_RESULTSW, * LPGCP_RESULTSW;
-
-typedef GCP_RESULTSW GCP_RESULTS;
-typedef LPGCP_RESULTSW LPGCP_RESULTS;
-
-
-
-
-
-
-typedef struct _RASTERIZER_STATUS {
-    short   nSize;
-    short   wFlags;
-    short   nLanguageID;
-} RASTERIZER_STATUS,  *LPRASTERIZER_STATUS;
-
-
-
-
-
-
-typedef struct tagPIXELFORMATDESCRIPTOR
-{
-    WORD  nSize;
-    WORD  nVersion;
-    DWORD dwFlags;
-    BYTE  iPixelType;
-    BYTE  cColorBits;
-    BYTE  cRedBits;
-    BYTE  cRedShift;
-    BYTE  cGreenBits;
-    BYTE  cGreenShift;
-    BYTE  cBlueBits;
-    BYTE  cBlueShift;
-    BYTE  cAlphaBits;
-    BYTE  cAlphaShift;
-    BYTE  cAccumBits;
-    BYTE  cAccumRedBits;
-    BYTE  cAccumGreenBits;
-    BYTE  cAccumBlueBits;
-    BYTE  cAccumAlphaBits;
-    BYTE  cDepthBits;
-    BYTE  cStencilBits;
-    BYTE  cAuxBuffers;
-    BYTE  iLayerType;
-    BYTE  bReserved;
-    DWORD dwLayerMask;
-    DWORD dwVisibleMask;
-    DWORD dwDamageMask;
-} PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR,  *LPPIXELFORMATDESCRIPTOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef int (__stdcall* OLDFONTENUMPROCA)(const LOGFONTA *, const TEXTMETRICA *, DWORD, LPARAM);
-typedef int (__stdcall* OLDFONTENUMPROCW)(const LOGFONTW *, const TEXTMETRICW *, DWORD, LPARAM);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef OLDFONTENUMPROCA    FONTENUMPROCA;
-typedef OLDFONTENUMPROCW    FONTENUMPROCW;
-
-typedef FONTENUMPROCW FONTENUMPROC;
-
-
-
-
-typedef int (__stdcall* GOBJENUMPROC)(LPVOID, LPARAM);
-typedef void (__stdcall* LINEDDAPROC)(int, int, LPARAM);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __stdcall AddFontResourceA(     LPCSTR);
-__declspec(dllimport) int __stdcall AddFontResourceW(     LPCWSTR);
-
-
-
-
-
-
-__declspec(dllimport) BOOL	__stdcall AnimatePalette(      HPALETTE hPal,      UINT iStartIndex,     	UINT cEntries,        const PALETTEENTRY * ppe);
-__declspec(dllimport) BOOL	__stdcall Arc(      HDC hdc,      int x1,      int y1,      int x2,      int y2,      int x3,      int y3,      int x4,      int y4);
-__declspec(dllimport) BOOL	__stdcall BitBlt(      HDC hdc,      int x,      int y,      int cx,      int cy,        HDC hdcSrc,      int x1,      int y1,      DWORD rop);
-__declspec(dllimport) BOOL  __stdcall CancelDC(      HDC hdc);
-__declspec(dllimport) BOOL  __stdcall Chord(      HDC hdc,      int x1,      int y1,      int x2,      int y2,      int x3,      int y3,      int x4,      int y4);
-__declspec(dllimport) int   __stdcall ChoosePixelFormat(      HDC hdc,      const PIXELFORMATDESCRIPTOR *ppfd);
-__declspec(dllimport) HMETAFILE  __stdcall CloseMetaFile(      HDC hdc);
-__declspec(dllimport) int     __stdcall CombineRgn(        HRGN hrgnDst,        HRGN hrgnSrc1,        HRGN hrgnSrc2,      int iMode);
-__declspec(dllimport) HMETAFILE __stdcall CopyMetaFileA(      HMETAFILE,        LPCSTR);
-__declspec(dllimport) HMETAFILE __stdcall CopyMetaFileW(      HMETAFILE,        LPCWSTR);
-
-
-
-
-
-__declspec(dllimport) HBITMAP __stdcall CreateBitmap(      int nWidth,      int nHeight,      UINT nPlanes,      UINT nBitCount,        const void *lpBits);
-__declspec(dllimport) HBITMAP __stdcall CreateBitmapIndirect(      const BITMAP *pbm);
-__declspec(dllimport) HBRUSH  __stdcall CreateBrushIndirect(      const LOGBRUSH *plbrush);
-__declspec(dllimport) HBITMAP __stdcall CreateCompatibleBitmap(      HDC hdc,      int cx,      int cy);
-__declspec(dllimport) HBITMAP __stdcall CreateDiscardableBitmap(      HDC hdc,      int cx,      int cy);
-__declspec(dllimport) HDC     __stdcall CreateCompatibleDC(        HDC hdc);
-__declspec(dllimport) HDC     __stdcall CreateDCA(        LPCSTR pwszDriver,        LPCSTR pwszDevice,        LPCSTR pszPort,        const DEVMODEA * pdm);
-__declspec(dllimport) HDC     __stdcall CreateDCW(        LPCWSTR pwszDriver,        LPCWSTR pwszDevice,        LPCWSTR pszPort,        const DEVMODEW * pdm);
-
-
-
-
-
-__declspec(dllimport) HBITMAP __stdcall CreateDIBitmap(      HDC hdc,        const BITMAPINFOHEADER *pbmih,      DWORD flInit,        const void *pjBits,        const BITMAPINFO *pbmi,      UINT iUsage);
-__declspec(dllimport) HBRUSH  __stdcall CreateDIBPatternBrush(      HGLOBAL h,      UINT iUsage);
-__declspec(dllimport) HBRUSH  __stdcall CreateDIBPatternBrushPt(      const void *lpPackedDIB,      UINT iUsage);
-__declspec(dllimport) HRGN    __stdcall CreateEllipticRgn(      int x1,      int y1,      int x2,      int y2);
-__declspec(dllimport) HRGN    __stdcall CreateEllipticRgnIndirect(      const RECT *lprect);
-__declspec(dllimport) HFONT   __stdcall CreateFontIndirectA(      const LOGFONTA *lplf);
-__declspec(dllimport) HFONT   __stdcall CreateFontIndirectW(      const LOGFONTW *lplf);
-
-
-
-
-
-__declspec(dllimport) HFONT   __stdcall CreateFontA(      int cHeight,      int cWidth,      int cEscapement,      int cOrientation,      int cWeight,      DWORD bItalic,
-                                  DWORD bUnderline,      DWORD bStrikeOut,      DWORD iCharSet,      DWORD iOutPrecision,      DWORD iClipPrecision,
-                                  DWORD iQuality,      DWORD iPitchAndFamily,        LPCSTR pszFaceName);
-__declspec(dllimport) HFONT   __stdcall CreateFontW(      int cHeight,      int cWidth,      int cEscapement,      int cOrientation,      int cWeight,      DWORD bItalic,
-                                  DWORD bUnderline,      DWORD bStrikeOut,      DWORD iCharSet,      DWORD iOutPrecision,      DWORD iClipPrecision,
-                                  DWORD iQuality,      DWORD iPitchAndFamily,        LPCWSTR pszFaceName);
-
-
-
-
-
-
-__declspec(dllimport) HBRUSH  __stdcall CreateHatchBrush(      int iHatch,      COLORREF color);
-__declspec(dllimport) HDC     __stdcall CreateICA(        LPCSTR pszDriver,        LPCSTR pszDevice,        LPCSTR pszPort,        const DEVMODEA * pdm);
-__declspec(dllimport) HDC     __stdcall CreateICW(        LPCWSTR pszDriver,        LPCWSTR pszDevice,        LPCWSTR pszPort,        const DEVMODEW * pdm);
-
-
-
-
-
-__declspec(dllimport) HDC     __stdcall CreateMetaFileA(        LPCSTR pszFile);
-__declspec(dllimport) HDC     __stdcall CreateMetaFileW(        LPCWSTR pszFile);
-
-
-
-
-
-__declspec(dllimport) HPALETTE __stdcall CreatePalette(      const LOGPALETTE * plpal);
-__declspec(dllimport) HPEN    __stdcall CreatePen(      int iStyle,      int cWidth,      COLORREF color);
-__declspec(dllimport) HPEN    __stdcall CreatePenIndirect(      const LOGPEN *plpen);
-__declspec(dllimport) HRGN    __stdcall CreatePolyPolygonRgn(       const POINT *pptl,
-                                                     const INT  *pc,
-                                                     int cPoly,
-                                                     int iMode);
-__declspec(dllimport) HBRUSH  __stdcall CreatePatternBrush(      HBITMAP hbm);
-__declspec(dllimport) HRGN    __stdcall CreateRectRgn(      int x1,      int y1,      int x2,      int y2);
-__declspec(dllimport) HRGN    __stdcall CreateRectRgnIndirect(      const RECT *lprect);
-__declspec(dllimport) HRGN    __stdcall CreateRoundRectRgn(      int x1,      int y1,      int x2,      int y2,      int w,      int h);
-__declspec(dllimport) BOOL    __stdcall CreateScalableFontResourceA(      DWORD fdwHidden,      LPCSTR lpszFont,      LPCSTR lpszFile,        LPCSTR lpszPath);
-__declspec(dllimport) BOOL    __stdcall CreateScalableFontResourceW(      DWORD fdwHidden,      LPCWSTR lpszFont,      LPCWSTR lpszFile,        LPCWSTR lpszPath);
-
-
-
-
-
-__declspec(dllimport) HBRUSH  __stdcall CreateSolidBrush(      COLORREF color);
-
-__declspec(dllimport) BOOL __stdcall DeleteDC(      HDC hdc);
-__declspec(dllimport) BOOL __stdcall DeleteMetaFile(      HMETAFILE hmf);
-__declspec(dllimport) BOOL __stdcall DeleteObject(      HGDIOBJ ho);
-__declspec(dllimport) int  __stdcall DescribePixelFormat(       HDC hdc, 
-                                                 int iPixelFormat, 
-                                                 UINT nBytes,
-                                                   LPPIXELFORMATDESCRIPTOR ppfd);
-
-
-
-
-
-typedef UINT   (__stdcall* LPFNDEVMODE)(HWND, HMODULE, LPDEVMODE, LPSTR, LPSTR, LPDEVMODE, LPSTR, UINT);
-
-typedef DWORD  (__stdcall* LPFNDEVCAPS)(LPSTR, LPSTR, UINT, LPSTR, LPDEVMODE);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-DeviceCapabilitiesA(
-         LPCSTR pDevice,
-           LPCSTR pPort,
-         WORD fwCapability,
-           LPSTR pOutput,
-           const DEVMODEA * pDevMode
-    );
-__declspec(dllimport)
-int
-__stdcall
-DeviceCapabilitiesW(
-         LPCWSTR pDevice,
-           LPCWSTR pPort,
-         WORD fwCapability,
-           LPWSTR pOutput,
-           const DEVMODEW * pDevMode
-    );
-
-
-
-
-
-
-__declspec(dllimport) int  __stdcall DrawEscape(        HDC    hdc,         
-                                         int    iEscape,     
-                                         int    cjIn,        
-                                             LPCSTR lpIn);
-__declspec(dllimport) BOOL __stdcall Ellipse(      HDC hdc,      int left,      int top,       int right,      int bottom);
-
-
-__declspec(dllimport) int  __stdcall EnumFontFamiliesExA(      HDC hdc,      LPLOGFONTA lpLogfont,      FONTENUMPROCA lpProc,      LPARAM lParam,      DWORD dwFlags);
-__declspec(dllimport) int  __stdcall EnumFontFamiliesExW(      HDC hdc,      LPLOGFONTW lpLogfont,      FONTENUMPROCW lpProc,      LPARAM lParam,      DWORD dwFlags);
-
-
-
-
-
-
-
-__declspec(dllimport) int  __stdcall EnumFontFamiliesA(      HDC hdc,        LPCSTR lpLogfont,      FONTENUMPROCA lpProc,      LPARAM lParam);
-__declspec(dllimport) int  __stdcall EnumFontFamiliesW(      HDC hdc,        LPCWSTR lpLogfont,      FONTENUMPROCW lpProc,      LPARAM lParam);
-
-
-
-
-
-__declspec(dllimport) int  __stdcall EnumFontsA(      HDC hdc,        LPCSTR lpLogfont,       FONTENUMPROCA lpProc,      LPARAM lParam);
-__declspec(dllimport) int  __stdcall EnumFontsW(      HDC hdc,        LPCWSTR lpLogfont,       FONTENUMPROCW lpProc,      LPARAM lParam);
-
-
-
-
-
-
-
-__declspec(dllimport) int  __stdcall EnumObjects(      HDC hdc,      int nType,      GOBJENUMPROC lpFunc,      LPARAM lParam);
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall EqualRgn(      HRGN hrgn1,      HRGN hrgn2);
-__declspec(dllimport) int  __stdcall Escape(        HDC hdc,           
-                                     int iEscape,       
-                                     int cjIn,          
-                                         LPCSTR pvIn,
-                                       LPVOID pvOut);
-__declspec(dllimport) int  __stdcall ExtEscape(         HDC hdc,         
-                                         int iEscape,     
-                                         int cjInput,     
-                                             LPCSTR lpInData,  
-                                         int cjOutput,   
-                                           LPSTR lpOutData);
-__declspec(dllimport) int  __stdcall ExcludeClipRect(      HDC hdc,      int left,      int top,      int right,      int bottom);
-__declspec(dllimport) HRGN __stdcall ExtCreateRegion(        const XFORM * lpx,      DWORD nCount,        const RGNDATA * lpData);
-__declspec(dllimport) BOOL __stdcall ExtFloodFill(      HDC hdc,      int x,      int y,      COLORREF color,      UINT type);
-__declspec(dllimport) BOOL __stdcall FillRgn(      HDC hdc,      HRGN hrgn,      HBRUSH hbr);
-__declspec(dllimport) BOOL __stdcall FloodFill(      HDC hdc,      int x,      int y,      COLORREF color);
-__declspec(dllimport) BOOL __stdcall FrameRgn(      HDC hdc,      HRGN hrgn,      HBRUSH hbr,      int w,      int h);
-__declspec(dllimport) int  __stdcall GetROP2(      HDC hdc);
-__declspec(dllimport) BOOL __stdcall GetAspectRatioFilterEx(      HDC hdc,      LPSIZE lpsize);
-__declspec(dllimport) COLORREF __stdcall GetBkColor(      HDC hdc);
-
-
-__declspec(dllimport) COLORREF __stdcall GetDCBrushColor(      HDC hdc);
-__declspec(dllimport) COLORREF __stdcall GetDCPenColor(      HDC hdc);
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetBkMode(
-         HDC hdc
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-GetBitmapBits(
-         HBITMAP hbit,
-         LONG cb,
-         LPVOID lpvBits
-    );
-
-__declspec(dllimport) BOOL  __stdcall GetBitmapDimensionEx(      HBITMAP hbit,      LPSIZE lpsize);
-__declspec(dllimport) UINT  __stdcall GetBoundsRect(      HDC hdc,      LPRECT lprect,      UINT flags);
-
-__declspec(dllimport) BOOL  __stdcall GetBrushOrgEx(      HDC hdc,      LPPOINT lppt);
-
-__declspec(dllimport) BOOL  __stdcall GetCharWidthA(      HDC hdc,      UINT iFirst,      UINT iLast,      LPINT lpBuffer);
-__declspec(dllimport) BOOL  __stdcall GetCharWidthW(      HDC hdc,      UINT iFirst,      UINT iLast,      LPINT lpBuffer);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetCharWidth32A(      HDC hdc,      UINT iFirst,      UINT iLast,       LPINT lpBuffer);
-__declspec(dllimport) BOOL  __stdcall GetCharWidth32W(      HDC hdc,      UINT iFirst,      UINT iLast,       LPINT lpBuffer);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetCharWidthFloatA(      HDC hdc,      UINT iFirst,      UINT iLast,      PFLOAT lpBuffer);
-__declspec(dllimport) BOOL  __stdcall GetCharWidthFloatW(      HDC hdc,      UINT iFirst,      UINT iLast,      PFLOAT lpBuffer);
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsA(      HDC hdc, 
-                                                 UINT wFirst, 
-                                                 UINT wLast, 
-                                                 LPABC lpABC);
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsW(      HDC hdc, 
-                                                 UINT wFirst, 
-                                                 UINT wLast, 
-                                                 LPABC lpABC);
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsFloatA(      HDC hdc,      UINT iFirst,      UINT iLast,      LPABCFLOAT lpABC);
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsFloatW(      HDC hdc,      UINT iFirst,      UINT iLast,      LPABCFLOAT lpABC);
-
-
-
-
-
-__declspec(dllimport) int   __stdcall GetClipBox(      HDC hdc,       LPRECT lprect);
-__declspec(dllimport) int	__stdcall GetClipRgn(      HDC hdc,      HRGN hrgn);
-__declspec(dllimport) int	__stdcall GetMetaRgn(      HDC hdc,      HRGN hrgn);
-__declspec(dllimport) HGDIOBJ __stdcall GetCurrentObject(      HDC hdc,      UINT type);
-__declspec(dllimport) BOOL  __stdcall GetCurrentPositionEx(      HDC hdc,       LPPOINT lppt);
-__declspec(dllimport) int   __stdcall GetDeviceCaps(        HDC hdc,      int index);
-__declspec(dllimport) int   __stdcall GetDIBits(      HDC hdc,      HBITMAP hbm,      UINT start,      UINT cLines,         LPVOID lpvBits,      LPBITMAPINFO lpbmi,      UINT usage);
-
-__declspec(dllimport) DWORD __stdcall GetFontData (         HDC     hdc,
-                                             DWORD   dwTable,
-                                             DWORD   dwOffset,
-                                                 PVOID pvBuffer,
-                                             DWORD   cjBuffer
-                                        );
-
-__declspec(dllimport) DWORD __stdcall GetGlyphOutlineA(         HDC hdc,
-                                                 UINT uChar,
-                                                 UINT fuFormat,
-                                                 LPGLYPHMETRICS lpgm,
-                                                 DWORD cjBuffer,
-                                                   LPVOID pvBuffer,
-                                                 const MAT2 *lpmat2
-                                        );
-__declspec(dllimport) DWORD __stdcall GetGlyphOutlineW(         HDC hdc,
-                                                 UINT uChar,
-                                                 UINT fuFormat,
-                                                 LPGLYPHMETRICS lpgm,
-                                                 DWORD cjBuffer,
-                                                   LPVOID pvBuffer,
-                                                 const MAT2 *lpmat2
-                                        );
-
-
-
-
-
-
-__declspec(dllimport) int   __stdcall GetGraphicsMode(      HDC hdc);
-__declspec(dllimport) int   __stdcall GetMapMode(      HDC hdc);
-__declspec(dllimport) UINT  __stdcall GetMetaFileBitsEx(     HMETAFILE hMF,      UINT cbBuffer,        LPVOID lpData);
-__declspec(dllimport) HMETAFILE   __stdcall GetMetaFileA(      LPCSTR lpName);
-__declspec(dllimport) HMETAFILE   __stdcall GetMetaFileW(      LPCWSTR lpName);
-
-
-
-
-
-__declspec(dllimport) COLORREF __stdcall GetNearestColor(      HDC hdc,      COLORREF color);
-__declspec(dllimport) UINT  __stdcall GetNearestPaletteIndex(      HPALETTE h,      COLORREF color);
-__declspec(dllimport) DWORD __stdcall GetObjectType(      HGDIOBJ h);
-
-
-
-__declspec(dllimport) UINT __stdcall GetOutlineTextMetricsA(      HDC hdc, 
-                                                     UINT cjCopy, 
-                                                       LPOUTLINETEXTMETRICA potm);
-__declspec(dllimport) UINT __stdcall GetOutlineTextMetricsW(      HDC hdc, 
-                                                     UINT cjCopy, 
-                                                       LPOUTLINETEXTMETRICW potm);
-
-
-
-
-
-
-
-
-__declspec(dllimport) UINT	__stdcall GetPaletteEntries(        HPALETTE hpal,
-                                                 UINT iStart,
-                                                 UINT cEntries,
-                                                 LPPALETTEENTRY pPalEntries);
-__declspec(dllimport) COLORREF __stdcall GetPixel(      HDC hdc,      int x,      int y);
-__declspec(dllimport) int   __stdcall GetPixelFormat(      HDC hdc);
-__declspec(dllimport) int   __stdcall GetPolyFillMode(      HDC hdc);
-__declspec(dllimport) BOOL  __stdcall GetRasterizerCaps(        LPRASTERIZER_STATUS lpraststat, 
-                                                 UINT cjBytes);
-
-__declspec(dllimport) int   __stdcall GetRandomRgn (     HDC hdc,      HRGN hrgn,      INT i);
-__declspec(dllimport) DWORD __stdcall GetRegionData(        HRGN hrgn,
-                                             DWORD nCount,
-                                                 LPRGNDATA lpRgnData);
-__declspec(dllimport) int   __stdcall GetRgnBox(      HRGN hrgn,       LPRECT lprc);
-__declspec(dllimport) HGDIOBJ __stdcall GetStockObject(      int i);
-__declspec(dllimport) int   __stdcall GetStretchBltMode(     HDC hdc);
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemPaletteEntries(
-         HDC  hdc,
-         UINT iStart,
-         UINT cEntries,
-           LPPALETTEENTRY pPalEntries
-    );
-
-__declspec(dllimport) UINT  __stdcall GetSystemPaletteUse(     HDC hdc);
-__declspec(dllimport) int   __stdcall GetTextCharacterExtra(     HDC hdc);
-__declspec(dllimport) UINT  __stdcall GetTextAlign(     HDC hdc);
-__declspec(dllimport) COLORREF __stdcall GetTextColor(     HDC hdc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentPointA(
-         HDC hdc,
-           LPCSTR lpString,
-         int c,
-         LPSIZE lpsz
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentPointW(
-         HDC hdc,
-           LPCWSTR lpString,
-         int c,
-         LPSIZE lpsz
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentPoint32A(
-         HDC hdc,
-           LPCSTR lpString,
-         int c,
-         LPSIZE psizl
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentPoint32W(
-         HDC hdc,
-           LPCWSTR lpString,
-         int c,
-         LPSIZE psizl
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentExPointA(
-         HDC hdc,
-           LPCSTR lpszString,
-         int cchString,
-         int nMaxExtent,
-           LPINT lpnFit,
-             LPINT lpnDx,
-         LPSIZE lpSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentExPointW(
-         HDC hdc,
-           LPCWSTR lpszString,
-         int cchString,
-         int nMaxExtent,
-           LPINT lpnFit,
-             LPINT lpnDx,
-         LPSIZE lpSize
-    );
-
-
-
-
-
-
-
-__declspec(dllimport) int __stdcall GetTextCharset(      HDC hdc);
-__declspec(dllimport) int __stdcall GetTextCharsetInfo(      HDC hdc,        LPFONTSIGNATURE lpSig,      DWORD dwFlags);
-__declspec(dllimport) BOOL __stdcall TranslateCharsetInfo(      DWORD  *lpSrc,       LPCHARSETINFO lpCs,      DWORD dwFlags);
-__declspec(dllimport) DWORD __stdcall GetFontLanguageInfo(      HDC hdc);
-__declspec(dllimport) DWORD __stdcall GetCharacterPlacementA(       HDC hdc,        LPCSTR lpString,      int nCount,      int nMexExtent,      LPGCP_RESULTSA lpResults,      DWORD dwFlags);
-__declspec(dllimport) DWORD __stdcall GetCharacterPlacementW(       HDC hdc,        LPCWSTR lpString,      int nCount,      int nMexExtent,      LPGCP_RESULTSW lpResults,      DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-typedef struct tagWCRANGE
-{
-    WCHAR  wcLow;
-    USHORT cGlyphs;
-} WCRANGE, *PWCRANGE, *LPWCRANGE;
-
-
-typedef struct tagGLYPHSET
-{
-    DWORD    cbThis;
-    DWORD    flAccel;
-    DWORD    cGlyphsSupported;
-    DWORD    cRanges;
-    WCRANGE  ranges[1];
-} GLYPHSET, *PGLYPHSET,  *LPGLYPHSET;
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) DWORD __stdcall GetFontUnicodeRanges(      HDC hdc,        LPGLYPHSET lpgs);
-__declspec(dllimport) DWORD __stdcall GetGlyphIndicesA(      HDC hdc,        LPCSTR lpstr,      int c,      LPWORD pgi,      DWORD fl);
-__declspec(dllimport) DWORD __stdcall GetGlyphIndicesW(      HDC hdc,        LPCWSTR lpstr,      int c,      LPWORD pgi,      DWORD fl);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetTextExtentPointI(     HDC hdc,        LPWORD pgiIn,      int cgi,      LPSIZE psize);
-__declspec(dllimport) BOOL	__stdcall GetTextExtentExPointI (       HDC hdc,
-                                                       LPWORD lpwszString,
-                                                     int cwchString,
-                                                     int nMaxExtent,
-                                                       LPINT lpnFit,
-                                                         LPINT lpnDx,
-                                                     LPSIZE lpSize
-                                                );
-
-__declspec(dllimport) BOOL  __stdcall GetCharWidthI(        HDC hdc,
-                                             UINT giFirst,
-                                             UINT cgi,
-                                                 LPWORD pgi,
-                                             LPINT piWidths
-                                        );
-
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsI(        HDC    hdc,
-                                                 UINT   giFirst,
-                                                 UINT   cgi,
-                                                     LPWORD pgi,
-                                                 LPABC  pabc
-                                        );
-
-
-
-
-
-
-
-
-typedef struct tagDESIGNVECTOR
-{
-    DWORD  dvReserved;
-    DWORD  dvNumAxes;
-    LONG   dvValues[16];
-} DESIGNVECTOR, *PDESIGNVECTOR,  *LPDESIGNVECTOR;
-
-__declspec(dllimport) int  __stdcall AddFontResourceExA(      LPCSTR name,      DWORD fl,   PVOID res);
-__declspec(dllimport) int  __stdcall AddFontResourceExW(      LPCWSTR name,      DWORD fl,   PVOID res);
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall RemoveFontResourceExA(      LPCSTR name,      DWORD fl,   PVOID pdv);
-__declspec(dllimport) BOOL __stdcall RemoveFontResourceExW(      LPCWSTR name,      DWORD fl,   PVOID pdv);
-
-
-
-
-
-__declspec(dllimport) HANDLE __stdcall AddFontMemResourceEx(          PVOID pFileView,
-                                                     DWORD cjSize,
-                                                  PVOID pvResrved,
-                                                     DWORD* pNumFonts);
-
-__declspec(dllimport) BOOL __stdcall RemoveFontMemResourceEx(      HANDLE h);
-
-
-
-
-
-
-
-
-
-typedef struct tagAXISINFOA
-{
-    LONG   axMinValue;
-    LONG   axMaxValue;
-    BYTE   axAxisName[16];
-} AXISINFOA, *PAXISINFOA,  *LPAXISINFOA;
-typedef struct tagAXISINFOW
-{
-    LONG   axMinValue;
-    LONG   axMaxValue;
-    WCHAR  axAxisName[16];
-} AXISINFOW, *PAXISINFOW,  *LPAXISINFOW;
-
-typedef AXISINFOW AXISINFO;
-typedef PAXISINFOW PAXISINFO;
-typedef LPAXISINFOW LPAXISINFO;
-
-
-
-
-
-
-typedef struct tagAXESLISTA
-{
-    DWORD     axlReserved;
-    DWORD     axlNumAxes;
-    AXISINFOA axlAxisInfo[16];
-} AXESLISTA, *PAXESLISTA,  *LPAXESLISTA;
-typedef struct tagAXESLISTW
-{
-    DWORD     axlReserved;
-    DWORD     axlNumAxes;
-    AXISINFOW axlAxisInfo[16];
-} AXESLISTW, *PAXESLISTW,  *LPAXESLISTW;
-
-typedef AXESLISTW AXESLIST;
-typedef PAXESLISTW PAXESLIST;
-typedef LPAXESLISTW LPAXESLIST;
-
-
-
-
-
-
-
-
-
-
-typedef struct tagENUMLOGFONTEXDVA
-{
-    ENUMLOGFONTEXA elfEnumLogfontEx;
-    DESIGNVECTOR   elfDesignVector;
-} ENUMLOGFONTEXDVA, *PENUMLOGFONTEXDVA,  *LPENUMLOGFONTEXDVA;
-typedef struct tagENUMLOGFONTEXDVW
-{
-    ENUMLOGFONTEXW elfEnumLogfontEx;
-    DESIGNVECTOR   elfDesignVector;
-} ENUMLOGFONTEXDVW, *PENUMLOGFONTEXDVW,  *LPENUMLOGFONTEXDVW;
-
-typedef ENUMLOGFONTEXDVW ENUMLOGFONTEXDV;
-typedef PENUMLOGFONTEXDVW PENUMLOGFONTEXDV;
-typedef LPENUMLOGFONTEXDVW LPENUMLOGFONTEXDV;
-
-
-
-
-
-
-__declspec(dllimport) HFONT  __stdcall CreateFontIndirectExA(      const ENUMLOGFONTEXDVA *);
-__declspec(dllimport) HFONT  __stdcall CreateFontIndirectExW(      const ENUMLOGFONTEXDVW *);
-
-
-
-
-
-
-
-typedef struct tagENUMTEXTMETRICA
-{
-    NEWTEXTMETRICEXA etmNewTextMetricEx;
-    AXESLISTA        etmAxesList;
-} ENUMTEXTMETRICA, *PENUMTEXTMETRICA,  *LPENUMTEXTMETRICA;
-typedef struct tagENUMTEXTMETRICW
-{
-    NEWTEXTMETRICEXW etmNewTextMetricEx;
-    AXESLISTW        etmAxesList;
-} ENUMTEXTMETRICW, *PENUMTEXTMETRICW,  *LPENUMTEXTMETRICW;
-
-typedef ENUMTEXTMETRICW ENUMTEXTMETRIC;
-typedef PENUMTEXTMETRICW PENUMTEXTMETRIC;
-typedef LPENUMTEXTMETRICW LPENUMTEXTMETRIC;
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetViewportExtEx(      HDC hdc,      LPSIZE lpsize);
-__declspec(dllimport) BOOL  __stdcall GetViewportOrgEx(      HDC hdc,      LPPOINT lppoint);
-__declspec(dllimport) BOOL  __stdcall GetWindowExtEx(      HDC hdc,      LPSIZE lpsize);
-__declspec(dllimport) BOOL  __stdcall GetWindowOrgEx(      HDC hdc,      LPPOINT lppoint);
-
-__declspec(dllimport) int  __stdcall IntersectClipRect(      HDC hdc,      int left,      int top,      int right,      int bottom);
-__declspec(dllimport) BOOL __stdcall InvertRgn(      HDC hdc,      HRGN hrgn);
-__declspec(dllimport) BOOL __stdcall LineDDA(      int xStart,      int yStart,      int xEnd,      int yEnd,      LINEDDAPROC lpProc,        LPARAM data);
-__declspec(dllimport) BOOL __stdcall LineTo(      HDC hdc,      int x,      int y);
-__declspec(dllimport) BOOL __stdcall MaskBlt(      HDC hdcDest,      int xDest,      int yDest,      int width,      int height,
-                   HDC hdcSrc,      int xSrc,      int ySrc,      HBITMAP hbmMask,      int xMask,      int yMask,      DWORD rop);
-__declspec(dllimport) BOOL __stdcall PlgBlt(      HDC hdcDest,        const POINT * lpPoint,      HDC hdcSrc,      int xSrc,      int ySrc,      int width,
-                          int height,        HBITMAP hbmMask,      int xMask,      int yMask);
-
-__declspec(dllimport) int  __stdcall OffsetClipRgn(     HDC hdc,      int x,      int y);
-__declspec(dllimport) int  __stdcall OffsetRgn(     HRGN hrgn,      int x,      int y);
-__declspec(dllimport) BOOL __stdcall PatBlt(     HDC hdc,      int x,      int y,      int w,      int h,      DWORD rop);
-__declspec(dllimport) BOOL __stdcall Pie(     HDC hdc,      int left,      int top,      int right,      int bottom,      int xr1,      int yr1,      int xr2,      int yr2);
-__declspec(dllimport) BOOL __stdcall PlayMetaFile(     HDC hdc,      HMETAFILE hmf);
-__declspec(dllimport) BOOL __stdcall PaintRgn(     HDC hdc,      HRGN hrgn);
-__declspec(dllimport) BOOL __stdcall PolyPolygon(     HDC hdc,       const POINT *apt,         const INT *asz,       int csz);
-__declspec(dllimport) BOOL __stdcall PtInRegion(     HRGN hrgn,      int x,      int y);
-__declspec(dllimport) BOOL __stdcall PtVisible(     HDC hdc,      int x,      int y);
-__declspec(dllimport) BOOL __stdcall RectInRegion(     HRGN hrgn,      const RECT * lprect);
-__declspec(dllimport) BOOL __stdcall RectVisible(     HDC hdc,      const RECT * lprect);
-__declspec(dllimport) BOOL __stdcall Rectangle(     HDC hdc,      int left,      int top,      int right,      int bottom);
-__declspec(dllimport) BOOL __stdcall RestoreDC(     HDC hdc,      int nSavedDC);
-__declspec(dllimport) HDC  __stdcall ResetDCA(     HDC hdc,      const DEVMODEA * lpdm);
-__declspec(dllimport) HDC  __stdcall ResetDCW(     HDC hdc,      const DEVMODEW * lpdm);
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall RealizePalette(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall RemoveFontResourceA(     LPCSTR lpFileName);
-__declspec(dllimport) BOOL __stdcall RemoveFontResourceW(     LPCWSTR lpFileName);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall RoundRect(     HDC hdc,      int left,      int top,      int right,      int bottom,      int width,      int height);
-__declspec(dllimport) BOOL __stdcall ResizePalette(     HPALETTE hpal,      UINT n);
-
-__declspec(dllimport) int  __stdcall SaveDC(     HDC hdc);
-__declspec(dllimport) int  __stdcall SelectClipRgn(     HDC hdc,        HRGN hrgn);
-__declspec(dllimport) int  __stdcall ExtSelectClipRgn(     HDC hdc,        HRGN hrgn,      int mode);
-__declspec(dllimport) int  __stdcall SetMetaRgn(     HDC hdc);
-__declspec(dllimport) HGDIOBJ __stdcall SelectObject(     HDC hdc,      HGDIOBJ h);
-__declspec(dllimport) HPALETTE __stdcall SelectPalette(     HDC hdc,      HPALETTE hPal,      BOOL bForceBkgd);
-__declspec(dllimport) COLORREF __stdcall SetBkColor(     HDC hdc,      COLORREF color);
-
-
-__declspec(dllimport) COLORREF __stdcall SetDCBrushColor(     HDC hdc,      COLORREF color);
-__declspec(dllimport) COLORREF __stdcall SetDCPenColor(     HDC hdc,      COLORREF color);
-
-
-__declspec(dllimport) int   __stdcall SetBkMode(     HDC hdc,      int mode);
-
-__declspec(dllimport)
-LONG __stdcall
-SetBitmapBits(
-         HBITMAP hbm,
-         DWORD cb,
-           const void *pvBits);
-
-__declspec(dllimport) UINT  __stdcall SetBoundsRect(     HDC hdc,        const RECT * lprect,      UINT flags);
-__declspec(dllimport) int	__stdcall SetDIBits(     HDC hdc,      HBITMAP hbm,      UINT start,      UINT cLines,      const void *lpBits,      const BITMAPINFO * lpbmi,      UINT ColorUse);
-__declspec(dllimport) int   __stdcall SetDIBitsToDevice(     HDC hdc,      int xDest,      int yDest,      DWORD w,      DWORD h,      int xSrc,
-             int ySrc,      UINT StartScan,      UINT cLines,      const void * lpvBits,      const BITMAPINFO * lpbmi,      UINT ColorUse);
-__declspec(dllimport) DWORD __stdcall SetMapperFlags(     HDC hdc,      DWORD flags);
-__declspec(dllimport) int   __stdcall SetGraphicsMode(     HDC hdc,      int iMode);
-__declspec(dllimport) int   __stdcall SetMapMode(     HDC hdc,      int iMode);
-
-
-__declspec(dllimport) DWORD __stdcall SetLayout(     HDC hdc,      DWORD l);
-__declspec(dllimport) DWORD __stdcall GetLayout(     HDC hdc);
-
-
-__declspec(dllimport) HMETAFILE   __stdcall SetMetaFileBitsEx(     UINT cbBuffer,        const BYTE *lpData);
-__declspec(dllimport) UINT  __stdcall SetPaletteEntries(        HPALETTE hpal,
-                                                 UINT iStart,
-                                                 UINT cEntries,
-                                                   const PALETTEENTRY *pPalEntries);
-__declspec(dllimport) COLORREF __stdcall SetPixel(     HDC hdc,      int x,      int y,      COLORREF color);
-__declspec(dllimport) BOOL   __stdcall SetPixelV(     HDC hdc,      int x,      int y,      COLORREF color);
-__declspec(dllimport) BOOL  __stdcall SetPixelFormat(     HDC hdc,      int format,      const PIXELFORMATDESCRIPTOR * ppfd);
-__declspec(dllimport) int   __stdcall SetPolyFillMode(     HDC hdc,      int mode);
-__declspec(dllimport) BOOL	 __stdcall StretchBlt(     HDC hdcDest,      int xDest,      int yDest,      int wDest,      int hDest,      HDC hdcSrc,      int xSrc,      int ySrc,      int wSrc,      int hSrc,      DWORD rop);
-__declspec(dllimport) BOOL   __stdcall SetRectRgn(     HRGN hrgn,      int left,      int top,      int right,      int bottom);
-__declspec(dllimport) int   __stdcall StretchDIBits(     HDC hdc,      int xDest,      int yDest,      int DestWidth,      int DestHeight,      int xSrc,      int ySrc,      int SrcWidth,      int SrcHeight,
-             const void * lpBits,      const BITMAPINFO * lpbmi,      UINT iUsage,      DWORD rop);
-__declspec(dllimport) int   __stdcall SetROP2(     HDC hdc,      int rop2);
-__declspec(dllimport) int   __stdcall SetStretchBltMode(     HDC hdc,      int mode);
-__declspec(dllimport) UINT  __stdcall SetSystemPaletteUse(     HDC hdc,      UINT use);
-__declspec(dllimport) int   __stdcall SetTextCharacterExtra(     HDC hdc,      int extra);
-__declspec(dllimport) COLORREF __stdcall SetTextColor(     HDC hdc,      COLORREF color);
-__declspec(dllimport) UINT  __stdcall SetTextAlign(     HDC hdc,      UINT align);
-__declspec(dllimport) BOOL  __stdcall SetTextJustification(     HDC hdc,      int extra,      int count);
-__declspec(dllimport) BOOL  __stdcall UpdateColors(     HDC hdc);
-
-
-
-
-
-
-
-typedef USHORT COLOR16;
-
-typedef struct _TRIVERTEX
-{
-    LONG    x;
-    LONG    y;
-    COLOR16 Red;
-    COLOR16 Green;
-    COLOR16 Blue;
-    COLOR16 Alpha;
-}TRIVERTEX,*PTRIVERTEX,*LPTRIVERTEX;
-
-typedef struct _GRADIENT_TRIANGLE
-{
-    ULONG Vertex1;
-    ULONG Vertex2;
-    ULONG Vertex3;
-} GRADIENT_TRIANGLE,*PGRADIENT_TRIANGLE,*LPGRADIENT_TRIANGLE;
-
-typedef struct _GRADIENT_RECT
-{
-    ULONG UpperLeft;
-    ULONG LowerRight;
-}GRADIENT_RECT,*PGRADIENT_RECT,*LPGRADIENT_RECT;
-
-typedef struct _BLENDFUNCTION
-{
-    BYTE   BlendOp;
-    BYTE   BlendFlags;
-    BYTE   SourceConstantAlpha;
-    BYTE   AlphaFormat;
-}BLENDFUNCTION,*PBLENDFUNCTION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall AlphaBlend(      HDC hdcDest,      int xoriginDest,      int yoriginDest,      int wDest,      int hDest,      HDC hdcSrc,      int xoriginSrc,      int yoriginSrc,      int wSrc,      int hSrc,      BLENDFUNCTION ftn);
-
-__declspec(dllimport) BOOL __stdcall TransparentBlt(     HDC hdcDest,     int xoriginDest,      int yoriginDest,      int wDest,      int hDest,      HDC hdcSrc,
-                                                int xoriginSrc,      int yoriginSrc,      int wSrc,      int hSrc,      UINT crTransparent);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GradientFill(
-         HDC hdc,
-           PTRIVERTEX pVertex,
-         ULONG nVertex,
-         PVOID pMesh,
-         ULONG nMesh,
-         ULONG ulMode
-    );
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall PlayMetaFileRecord(       HDC hdc,
-                                                   LPHANDLETABLE lpHandleTable,
-                                                 LPMETARECORD lpMR,
-                                                 UINT noObjs);
-
-typedef int (__stdcall* MFENUMPROC)(      HDC hdc,        HANDLETABLE * lpht,      METARECORD * lpMR,      int nObj,        LPARAM param);
-__declspec(dllimport) BOOL	__stdcall EnumMetaFile(      HDC hdc,      HMETAFILE hmf,      MFENUMPROC proc,        LPARAM param);
-
-typedef int (__stdcall* ENHMFENUMPROC)(     HDC hdc,        HANDLETABLE * lpht,      const ENHMETARECORD * lpmr,      int hHandles,        LPARAM data);
-
-
-
-__declspec(dllimport) HENHMETAFILE __stdcall CloseEnhMetaFile(      HDC hdc);
-__declspec(dllimport) HENHMETAFILE __stdcall CopyEnhMetaFileA(      HENHMETAFILE hEnh,        LPCSTR lpFileName);
-__declspec(dllimport) HENHMETAFILE __stdcall CopyEnhMetaFileW(      HENHMETAFILE hEnh,        LPCWSTR lpFileName);
-
-
-
-
-
-__declspec(dllimport) HDC   __stdcall CreateEnhMetaFileA(        HDC hdc,        LPCSTR lpFilename,        const RECT *lprc,        LPCSTR lpDesc);
-__declspec(dllimport) HDC   __stdcall CreateEnhMetaFileW(        HDC hdc,        LPCWSTR lpFilename,        const RECT *lprc,        LPCWSTR lpDesc);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall DeleteEnhMetaFile(      HENHMETAFILE hmf);
-__declspec(dllimport) BOOL  __stdcall EnumEnhMetaFile(        HDC hdc,      HENHMETAFILE hmf,      ENHMFENUMPROC proc,
-                                               LPVOID param,        const RECT * lpRect);
-__declspec(dllimport) HENHMETAFILE  __stdcall GetEnhMetaFileA(      LPCSTR lpName);
-__declspec(dllimport) HENHMETAFILE  __stdcall GetEnhMetaFileW(      LPCWSTR lpName);
-
-
-
-
-
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFileBits(       HENHMETAFILE hEMF,
-                                                 UINT nSize,
-                                                   LPBYTE lpData);
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFileDescriptionA(       HENHMETAFILE hemf,
-                                                         UINT cchBuffer,
-                                                           LPSTR lpDescription);
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFileDescriptionW(       HENHMETAFILE hemf,
-                                                         UINT cchBuffer,
-                                                           LPWSTR lpDescription);
-
-
-
-
-
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFileHeader(         HENHMETAFILE hemf,
-                                                     UINT nSize,
-                                                       LPENHMETAHEADER lpEnhMetaHeader);
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFilePaletteEntries(     HENHMETAFILE hemf,
-                                                         UINT nNumEntries,
-                                                           LPPALETTEENTRY lpPaletteEntries);
-
-__declspec(dllimport) UINT  __stdcall GetEnhMetaFilePixelFormat(        HENHMETAFILE hemf,
-                                                         UINT cbBuffer,
-                                                           PIXELFORMATDESCRIPTOR *ppfd);
-__declspec(dllimport) UINT	__stdcall GetWinMetaFileBits(       HENHMETAFILE hemf,
-                                                 UINT cbData16,
-                                                   LPBYTE pData16,
-                                                 INT iMapMode,
-                                                 HDC hdcRef);
-__declspec(dllimport) BOOL  __stdcall PlayEnhMetaFile(      HDC hdc,      HENHMETAFILE hmf,      const RECT * lprect);
-__declspec(dllimport) BOOL  __stdcall PlayEnhMetaFileRecord(        HDC hdc,
-                                                       LPHANDLETABLE pht,
-                                                     const ENHMETARECORD *pmr,
-                                                     UINT cht);
-
-__declspec(dllimport) HENHMETAFILE  __stdcall SetEnhMetaFileBits(       UINT nSize,
-                                                           const BYTE * pb);
-
-__declspec(dllimport) HENHMETAFILE  __stdcall SetWinMetaFileBits(       UINT nSize,
-                                                           const BYTE *lpMeta16Data,
-                                                           HDC hdcRef,
-                                                           const METAFILEPICT *lpMFP);
-__declspec(dllimport) BOOL  __stdcall GdiComment(     HDC hdc,      UINT nSize,        const BYTE *lpData);
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall GetTextMetricsA(      HDC hdc,      LPTEXTMETRICA lptm);
-__declspec(dllimport) BOOL __stdcall GetTextMetricsW(      HDC hdc,      LPTEXTMETRICW lptm);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDIBSECTION {
-    BITMAP		 dsBm;
-    BITMAPINFOHEADER    dsBmih;
-    DWORD               dsBitfields[3];
-    HANDLE              dshSection;
-    DWORD               dsOffset;
-} DIBSECTION,  *LPDIBSECTION, *PDIBSECTION;
-
-
-__declspec(dllimport) BOOL __stdcall AngleArc(      HDC hdc,      int x,      int y,      DWORD r,      FLOAT StartAngle,      FLOAT SweepAngle);
-__declspec(dllimport) BOOL __stdcall PolyPolyline(     HDC hdc,      const POINT *apt,        const DWORD *asz,      DWORD csz);
-__declspec(dllimport) BOOL __stdcall GetWorldTransform(      HDC hdc,      LPXFORM lpxf);
-__declspec(dllimport) BOOL __stdcall SetWorldTransform(      HDC hdc,      const XFORM * lpxf);
-__declspec(dllimport) BOOL __stdcall ModifyWorldTransform(      HDC hdc,        const XFORM * lpxf,      DWORD mode);
-__declspec(dllimport) BOOL __stdcall CombineTransform(      LPXFORM lpxfOut,      const XFORM *lpxf1,      const XFORM *lpxf2);
-__declspec(dllimport) HBITMAP __stdcall CreateDIBSection(       HDC hdc,      const BITMAPINFO *lpbmi,      UINT usage,                 void **ppvBits,        HANDLE hSection,      DWORD offset);
-__declspec(dllimport) UINT __stdcall GetDIBColorTable(      HDC  hdc,
-                                             UINT iStart,
-                                             UINT cEntries,
-                                             RGBQUAD *prgbq);
-__declspec(dllimport) UINT __stdcall SetDIBColorTable(      HDC  hdc,
-                                             UINT iStart,
-                                             UINT cEntries,
-                                               const RGBQUAD *prgbq);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  tagCOLORADJUSTMENT {
-    WORD   caSize;
-    WORD   caFlags;
-    WORD   caIlluminantIndex;
-    WORD   caRedGamma;
-    WORD   caGreenGamma;
-    WORD   caBlueGamma;
-    WORD   caReferenceBlack;
-    WORD   caReferenceWhite;
-    SHORT  caContrast;
-    SHORT  caBrightness;
-    SHORT  caColorfulness;
-    SHORT  caRedGreenTint;
-} COLORADJUSTMENT, *PCOLORADJUSTMENT,  *LPCOLORADJUSTMENT;
-
-__declspec(dllimport) BOOL __stdcall SetColorAdjustment(      HDC hdc,      const COLORADJUSTMENT *lpca);
-__declspec(dllimport) BOOL __stdcall GetColorAdjustment(      HDC hdc,      LPCOLORADJUSTMENT lpca);
-__declspec(dllimport) HPALETTE __stdcall CreateHalftonePalette(        HDC hdc);
-
-
-typedef BOOL (__stdcall* ABORTPROC)(      HDC,      int);
-
-
-
-
-typedef struct _DOCINFOA {
-    int     cbSize;
-    LPCSTR   lpszDocName;
-    LPCSTR   lpszOutput;
-
-    LPCSTR   lpszDatatype;
-    DWORD    fwType;
-
-} DOCINFOA, *LPDOCINFOA;
-typedef struct _DOCINFOW {
-    int     cbSize;
-    LPCWSTR  lpszDocName;
-    LPCWSTR  lpszOutput;
-
-    LPCWSTR  lpszDatatype;
-    DWORD    fwType;
-
-} DOCINFOW, *LPDOCINFOW;
-
-typedef DOCINFOW DOCINFO;
-typedef LPDOCINFOW LPDOCINFO;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __stdcall StartDocA(     HDC hdc,      const DOCINFOA *lpdi);
-__declspec(dllimport) int __stdcall StartDocW(     HDC hdc,      const DOCINFOW *lpdi);
-
-
-
-
-
-__declspec(dllimport) int __stdcall EndDoc(     HDC hdc);
-__declspec(dllimport) int __stdcall StartPage(     HDC hdc);
-__declspec(dllimport) int __stdcall EndPage(     HDC hdc);
-__declspec(dllimport) int __stdcall AbortDoc(     HDC hdc);
-__declspec(dllimport) int __stdcall SetAbortProc(     HDC hdc,      ABORTPROC proc);
-
-__declspec(dllimport) BOOL __stdcall AbortPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall ArcTo(     HDC hdc,      int left,      int top,      int right,      int bottom,      int xr1,      int yr1,      int xr2,      int yr2);
-__declspec(dllimport) BOOL __stdcall BeginPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall CloseFigure(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall EndPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall FillPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall FlattenPath(     HDC hdc);
-__declspec(dllimport) int  __stdcall GetPath(     HDC hdc,      LPPOINT apt,      LPBYTE aj, int cpt);
-__declspec(dllimport) HRGN __stdcall PathToRegion(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall PolyDraw(     HDC hdc,        const POINT * apt,        const BYTE * aj,      int cpt);
-__declspec(dllimport) BOOL __stdcall SelectClipPath(     HDC hdc,      int mode);
-__declspec(dllimport) int  __stdcall SetArcDirection(     HDC hdc,      int dir);
-__declspec(dllimport) BOOL __stdcall SetMiterLimit(     HDC hdc,      FLOAT limit,        PFLOAT old);
-__declspec(dllimport) BOOL __stdcall StrokeAndFillPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall StrokePath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall WidenPath(     HDC hdc);
-__declspec(dllimport) HPEN __stdcall ExtCreatePen(      DWORD iPenStyle,
-                                         DWORD cWidth,
-                                         const LOGBRUSH *plbrush,
-                                         DWORD cStyle,
-                                             const DWORD *pstyle);
-__declspec(dllimport) BOOL __stdcall GetMiterLimit(     HDC hdc,      PFLOAT plimit);
-__declspec(dllimport) int  __stdcall GetArcDirection(     HDC hdc);
-
-__declspec(dllimport) int   __stdcall GetObjectA(     HANDLE h,      int c,        LPVOID pv);
-__declspec(dllimport) int   __stdcall GetObjectW(     HANDLE h,      int c,        LPVOID pv);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall MoveToEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall TextOutA(      HDC hdc,      int x,      int y,        LPCSTR lpString,      int c);
-__declspec(dllimport) BOOL  __stdcall TextOutW(      HDC hdc,      int x,      int y,        LPCWSTR lpString,      int c);
-
-
-
-
-
-__declspec(dllimport) BOOL	__stdcall ExtTextOutA(      HDC hdc,      int x,      int y,      UINT options,        const RECT * lprect,        LPCSTR lpString,      UINT c,          const INT * lpDx);
-__declspec(dllimport) BOOL	__stdcall ExtTextOutW(      HDC hdc,      int x,      int y,      UINT options,        const RECT * lprect,        LPCWSTR lpString,      UINT c,          const INT * lpDx);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall PolyTextOutA(     HDC hdc,        const POLYTEXTA * ppt,      int nstrings);
-__declspec(dllimport) BOOL  __stdcall PolyTextOutW(     HDC hdc,        const POLYTEXTW * ppt,      int nstrings);
-
-
-
-
-
-
-__declspec(dllimport) HRGN  __stdcall CreatePolygonRgn(           const POINT *pptl,
-                                                 int cPoint,
-                                                 int iMode);
-__declspec(dllimport) BOOL  __stdcall DPtoLP(      HDC hdc,        LPPOINT lppt,      int c);
-__declspec(dllimport) BOOL  __stdcall LPtoDP(      HDC hdc,        LPPOINT lppt,      int c);
-__declspec(dllimport) BOOL  __stdcall Polygon(     HDC hdc,        const POINT *apt,      int cpt);
-__declspec(dllimport) BOOL  __stdcall Polyline(     HDC hdc,        const POINT *apt,      int cpt);
-
-__declspec(dllimport) BOOL  __stdcall PolyBezier(     HDC hdc,        const POINT * apt,      DWORD cpt);
-__declspec(dllimport) BOOL  __stdcall PolyBezierTo(     HDC hdc,        const POINT * apt,      DWORD cpt);
-__declspec(dllimport) BOOL  __stdcall PolylineTo(     HDC hdc,        const POINT * apt,      DWORD cpt);
-
-__declspec(dllimport) BOOL  __stdcall SetViewportExtEx(      HDC hdc,      int x,      int y,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall SetViewportOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall SetWindowExtEx(      HDC hdc,      int x,      int y,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall SetWindowOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-
-__declspec(dllimport) BOOL  __stdcall OffsetViewportOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall OffsetWindowOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall ScaleViewportExtEx(      HDC hdc,      int xn,      int dx,      int yn,      int yd,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall ScaleWindowExtEx(      HDC hdc,      int xn,      int xd,      int yn,      int yd,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall SetBitmapDimensionEx(      HBITMAP hbm,      int w,      int h,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall SetBrushOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-
-__declspec(dllimport) int   __stdcall GetTextFaceA(      HDC hdc,      int c,           LPSTR lpName);
-__declspec(dllimport) int   __stdcall GetTextFaceW(      HDC hdc,      int c,           LPWSTR lpName);
-
-
-
-
-
-
-
-
-typedef struct tagKERNINGPAIR {
-   WORD wFirst;
-   WORD wSecond;
-   int  iKernAmount;
-} KERNINGPAIR, *LPKERNINGPAIR;
-
-__declspec(dllimport) DWORD __stdcall GetKerningPairsA(         HDC hdc, 
-                                                 DWORD nPairs, 
-                                                     LPKERNINGPAIR   lpKernPair);
-__declspec(dllimport) DWORD __stdcall GetKerningPairsW(         HDC hdc, 
-                                                 DWORD nPairs, 
-                                                     LPKERNINGPAIR   lpKernPair);
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetDCOrgEx(      HDC hdc,      LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall FixBrushOrgEx(      HDC hdc,      int x,      int y,         LPPOINT ptl);
-__declspec(dllimport) BOOL  __stdcall UnrealizeObject(      HGDIOBJ h);
-
-__declspec(dllimport) BOOL  __stdcall GdiFlush();
-__declspec(dllimport) DWORD __stdcall GdiSetBatchLimit(      DWORD dw);
-__declspec(dllimport) DWORD __stdcall GdiGetBatchLimit();
-
-
-
-
-
-
-
-
-typedef int (__stdcall* ICMENUMPROCA)(LPSTR, LPARAM);
-typedef int (__stdcall* ICMENUMPROCW)(LPWSTR, LPARAM);
-
-
-
-
-
-
-__declspec(dllimport) int         __stdcall SetICMMode(      HDC hdc,      int mode);
-__declspec(dllimport) BOOL        __stdcall CheckColorsInGamut(         HDC hdc,
-                                                            LPVOID lpRGBTriple,
-                                                         LPVOID dlpBuffer,
-                                                         DWORD nCount);
-
-__declspec(dllimport) HCOLORSPACE __stdcall GetColorSpace(      HDC hdc);
-__declspec(dllimport) BOOL        __stdcall GetLogColorSpaceA(      HCOLORSPACE hColorSpace, 
-                                                     LPLOGCOLORSPACEA lpBuffer, 
-                                                     DWORD nSize);
-__declspec(dllimport) BOOL        __stdcall GetLogColorSpaceW(      HCOLORSPACE hColorSpace, 
-                                                     LPLOGCOLORSPACEW lpBuffer, 
-                                                     DWORD nSize);
-
-
-
-
-
-
-__declspec(dllimport) HCOLORSPACE __stdcall CreateColorSpaceA(      LPLOGCOLORSPACEA lplcs);
-__declspec(dllimport) HCOLORSPACE __stdcall CreateColorSpaceW(      LPLOGCOLORSPACEW lplcs);
-
-
-
-
-
-__declspec(dllimport) HCOLORSPACE __stdcall SetColorSpace(      HDC hdc,      HCOLORSPACE hcs);
-__declspec(dllimport) BOOL        __stdcall DeleteColorSpace(      HCOLORSPACE hcs);
-__declspec(dllimport) BOOL	      __stdcall GetICMProfileA(         HDC hdc, 
-                                                     LPDWORD pBufSize,
-                                                       LPSTR pszFilename);
-__declspec(dllimport) BOOL	      __stdcall GetICMProfileW(         HDC hdc, 
-                                                     LPDWORD pBufSize,
-                                                       LPWSTR pszFilename);
-
-
-
-
-
-
-__declspec(dllimport) BOOL        __stdcall SetICMProfileA(      HDC hdc,      LPSTR lpFileName);
-__declspec(dllimport) BOOL        __stdcall SetICMProfileW(      HDC hdc,      LPWSTR lpFileName);
-
-
-
-
-
-__declspec(dllimport) BOOL        __stdcall GetDeviceGammaRamp(      HDC hdc,      LPVOID lpRamp);
-__declspec(dllimport) BOOL        __stdcall SetDeviceGammaRamp(      HDC hdc,         LPVOID lpRamp);
-__declspec(dllimport) BOOL        __stdcall ColorMatchToTarget(      HDC hdc,      HDC hdcTarget,      DWORD action);
-__declspec(dllimport) int         __stdcall EnumICMProfilesA(      HDC hdc,      ICMENUMPROCA proc,        LPARAM param);
-__declspec(dllimport) int         __stdcall EnumICMProfilesW(      HDC hdc,      ICMENUMPROCW proc,        LPARAM param);
-
-
-
-
-
-__declspec(dllimport) BOOL	      __stdcall UpdateICMRegKeyA(   DWORD reserved,      LPSTR lpszCMID,      LPSTR lpszFileName,      UINT command);
-__declspec(dllimport) BOOL	      __stdcall UpdateICMRegKeyW(   DWORD reserved,      LPWSTR lpszCMID,      LPWSTR lpszFileName,      UINT command);
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL        __stdcall ColorCorrectPalette(      HDC hdc,      HPALETTE hPal,      DWORD deFirst,      DWORD num);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagEMR
-{
-    DWORD   iType;              
-    DWORD   nSize;              
-                                
-} EMR, *PEMR;
-
-
-
-typedef struct tagEMRTEXT
-{
-    POINTL  ptlReference;
-    DWORD   nChars;
-    DWORD   offString;          
-    DWORD   fOptions;
-    RECTL   rcl;
-    DWORD   offDx;              
-                                
-} EMRTEXT, *PEMRTEXT;
-
-
-
-typedef struct tagABORTPATH
-{
-    EMR     emr;
-} EMRABORTPATH,      *PEMRABORTPATH,
-  EMRBEGINPATH,      *PEMRBEGINPATH,
-  EMRENDPATH,        *PEMRENDPATH,
-  EMRCLOSEFIGURE,    *PEMRCLOSEFIGURE,
-  EMRFLATTENPATH,    *PEMRFLATTENPATH,
-  EMRWIDENPATH,      *PEMRWIDENPATH,
-  EMRSETMETARGN,     *PEMRSETMETARGN,
-  EMRSAVEDC,         *PEMRSAVEDC,
-  EMRREALIZEPALETTE, *PEMRREALIZEPALETTE;
-
-typedef struct tagEMRSELECTCLIPPATH
-{
-    EMR     emr;
-    DWORD   iMode;
-} EMRSELECTCLIPPATH,    *PEMRSELECTCLIPPATH,
-  EMRSETBKMODE,         *PEMRSETBKMODE,
-  EMRSETMAPMODE,        *PEMRSETMAPMODE,
-
-  EMRSETLAYOUT,         *PEMRSETLAYOUT,
-
-  EMRSETPOLYFILLMODE,   *PEMRSETPOLYFILLMODE,
-  EMRSETROP2,           *PEMRSETROP2,
-  EMRSETSTRETCHBLTMODE, *PEMRSETSTRETCHBLTMODE,
-  EMRSETICMMODE,        *PEMRSETICMMODE,
-  EMRSETTEXTALIGN,      *PEMRSETTEXTALIGN;
-
-typedef struct tagEMRSETMITERLIMIT
-{
-    EMR     emr;
-    FLOAT   eMiterLimit;
-} EMRSETMITERLIMIT, *PEMRSETMITERLIMIT;
-
-typedef struct tagEMRRESTOREDC
-{
-    EMR     emr;
-    LONG    iRelative;          
-} EMRRESTOREDC, *PEMRRESTOREDC;
-
-typedef struct tagEMRSETARCDIRECTION
-{
-    EMR     emr;
-    DWORD   iArcDirection;      
-                                
-} EMRSETARCDIRECTION, *PEMRSETARCDIRECTION;
-
-typedef struct tagEMRSETMAPPERFLAGS
-{
-    EMR     emr;
-    DWORD   dwFlags;
-} EMRSETMAPPERFLAGS, *PEMRSETMAPPERFLAGS;
-
-typedef struct tagEMRSETTEXTCOLOR
-{
-    EMR     emr;
-    COLORREF crColor;
-} EMRSETBKCOLOR,   *PEMRSETBKCOLOR,
-  EMRSETTEXTCOLOR, *PEMRSETTEXTCOLOR;
-
-typedef struct tagEMRSELECTOBJECT
-{
-    EMR     emr;
-    DWORD   ihObject;           
-} EMRSELECTOBJECT, *PEMRSELECTOBJECT,
-  EMRDELETEOBJECT, *PEMRDELETEOBJECT;
-
-typedef struct tagEMRSELECTPALETTE
-{
-    EMR     emr;
-    DWORD   ihPal;              
-} EMRSELECTPALETTE, *PEMRSELECTPALETTE;
-
-typedef struct tagEMRRESIZEPALETTE
-{
-    EMR     emr;
-    DWORD   ihPal;              
-    DWORD   cEntries;
-} EMRRESIZEPALETTE, *PEMRRESIZEPALETTE;
-
-typedef struct tagEMRSETPALETTEENTRIES
-{
-    EMR     emr;
-    DWORD   ihPal;              
-    DWORD   iStart;
-    DWORD   cEntries;
-    PALETTEENTRY aPalEntries[1];
-} EMRSETPALETTEENTRIES, *PEMRSETPALETTEENTRIES;
-
-typedef struct tagEMRSETCOLORADJUSTMENT
-{
-    EMR     emr;
-    COLORADJUSTMENT ColorAdjustment;
-} EMRSETCOLORADJUSTMENT, *PEMRSETCOLORADJUSTMENT;
-
-typedef struct tagEMRGDICOMMENT
-{
-    EMR     emr;
-    DWORD   cbData;             
-    BYTE    Data[1];
-} EMRGDICOMMENT, *PEMRGDICOMMENT;
-
-typedef struct tagEMREOF
-{
-    EMR     emr;
-    DWORD   nPalEntries;        
-    DWORD   offPalEntries;      
-    DWORD   nSizeLast;          
-                                
-                                
-} EMREOF, *PEMREOF;
-
-typedef struct tagEMRLINETO
-{
-    EMR     emr;
-    POINTL  ptl;
-} EMRLINETO,   *PEMRLINETO,
-  EMRMOVETOEX, *PEMRMOVETOEX;
-
-typedef struct tagEMROFFSETCLIPRGN
-{
-    EMR     emr;
-    POINTL  ptlOffset;
-} EMROFFSETCLIPRGN, *PEMROFFSETCLIPRGN;
-
-typedef struct tagEMRFILLPATH
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-} EMRFILLPATH,          *PEMRFILLPATH,
-  EMRSTROKEANDFILLPATH, *PEMRSTROKEANDFILLPATH,
-  EMRSTROKEPATH,        *PEMRSTROKEPATH;
-
-typedef struct tagEMREXCLUDECLIPRECT
-{
-    EMR     emr;
-    RECTL   rclClip;
-} EMREXCLUDECLIPRECT,   *PEMREXCLUDECLIPRECT,
-  EMRINTERSECTCLIPRECT, *PEMRINTERSECTCLIPRECT;
-
-typedef struct tagEMRSETVIEWPORTORGEX
-{
-    EMR     emr;
-    POINTL  ptlOrigin;
-} EMRSETVIEWPORTORGEX, *PEMRSETVIEWPORTORGEX,
-  EMRSETWINDOWORGEX,   *PEMRSETWINDOWORGEX,
-  EMRSETBRUSHORGEX,    *PEMRSETBRUSHORGEX;
-
-typedef struct tagEMRSETVIEWPORTEXTEX
-{
-    EMR     emr;
-    SIZEL   szlExtent;
-} EMRSETVIEWPORTEXTEX, *PEMRSETVIEWPORTEXTEX,
-  EMRSETWINDOWEXTEX,   *PEMRSETWINDOWEXTEX;
-
-typedef struct tagEMRSCALEVIEWPORTEXTEX
-{
-    EMR     emr;
-    LONG    xNum;
-    LONG    xDenom;
-    LONG    yNum;
-    LONG    yDenom;
-} EMRSCALEVIEWPORTEXTEX, *PEMRSCALEVIEWPORTEXTEX,
-  EMRSCALEWINDOWEXTEX,   *PEMRSCALEWINDOWEXTEX;
-
-typedef struct tagEMRSETWORLDTRANSFORM
-{
-    EMR     emr;
-    XFORM   xform;
-} EMRSETWORLDTRANSFORM, *PEMRSETWORLDTRANSFORM;
-
-typedef struct tagEMRMODIFYWORLDTRANSFORM
-{
-    EMR     emr;
-    XFORM   xform;
-    DWORD   iMode;
-} EMRMODIFYWORLDTRANSFORM, *PEMRMODIFYWORLDTRANSFORM;
-
-typedef struct tagEMRSETPIXELV
-{
-    EMR     emr;
-    POINTL  ptlPixel;
-    COLORREF crColor;
-} EMRSETPIXELV, *PEMRSETPIXELV;
-
-typedef struct tagEMREXTFLOODFILL
-{
-    EMR     emr;
-    POINTL  ptlStart;
-    COLORREF crColor;
-    DWORD   iMode;
-} EMREXTFLOODFILL, *PEMREXTFLOODFILL;
-
-typedef struct tagEMRELLIPSE
-{
-    EMR     emr;
-    RECTL   rclBox;             
-} EMRELLIPSE,  *PEMRELLIPSE,
-  EMRRECTANGLE, *PEMRRECTANGLE;
-
-
-typedef struct tagEMRROUNDRECT
-{
-    EMR     emr;
-    RECTL   rclBox;             
-    SIZEL   szlCorner;
-} EMRROUNDRECT, *PEMRROUNDRECT;
-
-typedef struct tagEMRARC
-{
-    EMR     emr;
-    RECTL   rclBox;             
-    POINTL  ptlStart;
-    POINTL  ptlEnd;
-} EMRARC,   *PEMRARC,
-  EMRARCTO, *PEMRARCTO,
-  EMRCHORD, *PEMRCHORD,
-  EMRPIE,   *PEMRPIE;
-
-typedef struct tagEMRANGLEARC
-{
-    EMR     emr;
-    POINTL  ptlCenter;
-    DWORD   nRadius;
-    FLOAT   eStartAngle;
-    FLOAT   eSweepAngle;
-} EMRANGLEARC, *PEMRANGLEARC;
-
-typedef struct tagEMRPOLYLINE
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cptl;
-    POINTL  aptl[1];
-} EMRPOLYLINE,     *PEMRPOLYLINE,
-  EMRPOLYBEZIER,   *PEMRPOLYBEZIER,
-  EMRPOLYGON,      *PEMRPOLYGON,
-  EMRPOLYBEZIERTO, *PEMRPOLYBEZIERTO,
-  EMRPOLYLINETO,   *PEMRPOLYLINETO;
-
-typedef struct tagEMRPOLYLINE16
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cpts;
-    POINTS  apts[1];
-} EMRPOLYLINE16,     *PEMRPOLYLINE16,
-  EMRPOLYBEZIER16,   *PEMRPOLYBEZIER16,
-  EMRPOLYGON16,      *PEMRPOLYGON16,
-  EMRPOLYBEZIERTO16, *PEMRPOLYBEZIERTO16,
-  EMRPOLYLINETO16,   *PEMRPOLYLINETO16;
-
-typedef struct tagEMRPOLYDRAW
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cptl;               
-    POINTL  aptl[1];            
-    BYTE    abTypes[1];         
-} EMRPOLYDRAW, *PEMRPOLYDRAW;
-
-typedef struct tagEMRPOLYDRAW16
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cpts;               
-    POINTS  apts[1];            
-    BYTE    abTypes[1];         
-} EMRPOLYDRAW16, *PEMRPOLYDRAW16;
-
-typedef struct tagEMRPOLYPOLYLINE
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   nPolys;             
-    DWORD   cptl;               
-    DWORD   aPolyCounts[1];     
-    POINTL  aptl[1];            
-} EMRPOLYPOLYLINE, *PEMRPOLYPOLYLINE,
-  EMRPOLYPOLYGON,  *PEMRPOLYPOLYGON;
-
-typedef struct tagEMRPOLYPOLYLINE16
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   nPolys;             
-    DWORD   cpts;               
-    DWORD   aPolyCounts[1];     
-    POINTS  apts[1];            
-} EMRPOLYPOLYLINE16, *PEMRPOLYPOLYLINE16,
-  EMRPOLYPOLYGON16,  *PEMRPOLYPOLYGON16;
-
-typedef struct tagEMRINVERTRGN
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cbRgnData;          
-    BYTE    RgnData[1];
-} EMRINVERTRGN, *PEMRINVERTRGN,
-  EMRPAINTRGN,  *PEMRPAINTRGN;
-
-typedef struct tagEMRFILLRGN
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cbRgnData;          
-    DWORD   ihBrush;            
-    BYTE    RgnData[1];
-} EMRFILLRGN, *PEMRFILLRGN;
-
-typedef struct tagEMRFRAMERGN
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cbRgnData;          
-    DWORD   ihBrush;            
-    SIZEL   szlStroke;
-    BYTE    RgnData[1];
-} EMRFRAMERGN, *PEMRFRAMERGN;
-
-typedef struct tagEMREXTSELECTCLIPRGN
-{
-    EMR     emr;
-    DWORD   cbRgnData;          
-    DWORD   iMode;
-    BYTE    RgnData[1];
-} EMREXTSELECTCLIPRGN, *PEMREXTSELECTCLIPRGN;
-
-typedef struct tagEMREXTTEXTOUTA
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   iGraphicsMode;      
-    FLOAT   exScale;            
-    FLOAT   eyScale;            
-    EMRTEXT emrtext;            
-                                
-} EMREXTTEXTOUTA, *PEMREXTTEXTOUTA,
-  EMREXTTEXTOUTW, *PEMREXTTEXTOUTW;
-
-typedef struct tagEMRPOLYTEXTOUTA
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   iGraphicsMode;      
-    FLOAT   exScale;            
-    FLOAT   eyScale;            
-    LONG    cStrings;
-    EMRTEXT aemrtext[1];        
-                                
-} EMRPOLYTEXTOUTA, *PEMRPOLYTEXTOUTA,
-  EMRPOLYTEXTOUTW, *PEMRPOLYTEXTOUTW;
-
-typedef struct tagEMRBITBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-} EMRBITBLT, *PEMRBITBLT;
-
-typedef struct tagEMRSTRETCHBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    cxSrc;
-    LONG    cySrc;
-} EMRSTRETCHBLT, *PEMRSTRETCHBLT;
-
-typedef struct tagEMRMASKBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    xMask;
-    LONG    yMask;
-    DWORD   iUsageMask;         
-    DWORD   offBmiMask;         
-    DWORD   cbBmiMask;          
-    DWORD   offBitsMask;        
-    DWORD   cbBitsMask;         
-} EMRMASKBLT, *PEMRMASKBLT;
-
-typedef struct tagEMRPLGBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    POINTL  aptlDest[3];
-    LONG    xSrc;
-    LONG    ySrc;
-    LONG    cxSrc;
-    LONG    cySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    xMask;
-    LONG    yMask;
-    DWORD   iUsageMask;         
-    DWORD   offBmiMask;         
-    DWORD   cbBmiMask;          
-    DWORD   offBitsMask;        
-    DWORD   cbBitsMask;         
-} EMRPLGBLT, *PEMRPLGBLT;
-
-typedef struct tagEMRSETDIBITSTODEVICE
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    xSrc;
-    LONG    ySrc;
-    LONG    cxSrc;
-    LONG    cySrc;
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    DWORD   iUsageSrc;          
-    DWORD   iStartScan;
-    DWORD   cScans;
-} EMRSETDIBITSTODEVICE, *PEMRSETDIBITSTODEVICE;
-
-typedef struct tagEMRSTRETCHDIBITS
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    xSrc;
-    LONG    ySrc;
-    LONG    cxSrc;
-    LONG    cySrc;
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    DWORD   iUsageSrc;          
-    DWORD   dwRop;
-    LONG    cxDest;
-    LONG    cyDest;
-} EMRSTRETCHDIBITS, *PEMRSTRETCHDIBITS;
-
-typedef struct tagEMREXTCREATEFONTINDIRECTW
-{
-    EMR     emr;
-    DWORD   ihFont;             
-    EXTLOGFONTW elfw;
-} EMREXTCREATEFONTINDIRECTW, *PEMREXTCREATEFONTINDIRECTW;
-
-typedef struct tagEMRCREATEPALETTE
-{
-    EMR     emr;
-    DWORD   ihPal;              
-    LOGPALETTE lgpl;            
-                                
-} EMRCREATEPALETTE, *PEMRCREATEPALETTE;
-
-typedef struct tagEMRCREATEPEN
-{
-    EMR     emr;
-    DWORD   ihPen;              
-    LOGPEN  lopn;
-} EMRCREATEPEN, *PEMRCREATEPEN;
-
-typedef struct tagEMREXTCREATEPEN
-{
-    EMR     emr;
-    DWORD   ihPen;              
-    DWORD   offBmi;             
-    DWORD   cbBmi;              
-                                
-                                
-    DWORD   offBits;            
-    DWORD   cbBits;             
-    EXTLOGPEN elp;              
-} EMREXTCREATEPEN, *PEMREXTCREATEPEN;
-
-typedef struct tagEMRCREATEBRUSHINDIRECT
-{
-    EMR        emr;
-    DWORD      ihBrush;          
-    LOGBRUSH32 lb;               
-                                 
-} EMRCREATEBRUSHINDIRECT, *PEMRCREATEBRUSHINDIRECT;
-
-typedef struct tagEMRCREATEMONOBRUSH
-{
-    EMR     emr;
-    DWORD   ihBrush;            
-    DWORD   iUsage;             
-    DWORD   offBmi;             
-    DWORD   cbBmi;              
-    DWORD   offBits;            
-    DWORD   cbBits;             
-} EMRCREATEMONOBRUSH, *PEMRCREATEMONOBRUSH;
-
-typedef struct tagEMRCREATEDIBPATTERNBRUSHPT
-{
-    EMR     emr;
-    DWORD   ihBrush;            
-    DWORD   iUsage;             
-    DWORD   offBmi;             
-    DWORD   cbBmi;              
-                                
-                                
-    DWORD   offBits;            
-    DWORD   cbBits;             
-} EMRCREATEDIBPATTERNBRUSHPT, *PEMRCREATEDIBPATTERNBRUSHPT;
-
-typedef struct tagEMRFORMAT
-{
-    DWORD   dSignature;         
-    DWORD   nVersion;           
-    DWORD   cbData;             
-    DWORD   offData;            
-                                
-} EMRFORMAT, *PEMRFORMAT;
-
-
-
-typedef struct tagEMRGLSRECORD
-{
-    EMR     emr;
-    DWORD   cbData;             
-    BYTE    Data[1];
-} EMRGLSRECORD, *PEMRGLSRECORD;
-
-typedef struct tagEMRGLSBOUNDEDRECORD
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cbData;             
-    BYTE    Data[1];
-} EMRGLSBOUNDEDRECORD, *PEMRGLSBOUNDEDRECORD;
-
-typedef struct tagEMRPIXELFORMAT
-{
-    EMR     emr;
-    PIXELFORMATDESCRIPTOR pfd;
-} EMRPIXELFORMAT, *PEMRPIXELFORMAT;
-
-typedef struct tagEMRCREATECOLORSPACE
-{
-    EMR             emr;
-    DWORD           ihCS;       
-    LOGCOLORSPACEA  lcs;        
-} EMRCREATECOLORSPACE, *PEMRCREATECOLORSPACE;
-
-typedef struct tagEMRSETCOLORSPACE
-{
-    EMR     emr;
-    DWORD   ihCS;               
-} EMRSETCOLORSPACE,    *PEMRSETCOLORSPACE,
-  EMRSELECTCOLORSPACE, *PEMRSELECTCOLORSPACE,
-  EMRDELETECOLORSPACE, *PEMRDELETECOLORSPACE;
-
-
-
-
-
-typedef struct tagEMREXTESCAPE
-{
-    EMR     emr;
-    INT     iEscape;            
-    INT     cbEscData;          
-    BYTE    EscData[1];         
-} EMREXTESCAPE,  *PEMREXTESCAPE,
-  EMRDRAWESCAPE, *PEMRDRAWESCAPE;
-
-typedef struct tagEMRNAMEDESCAPE
-{
-    EMR     emr;
-    INT     iEscape;            
-    INT     cbDriver;           
-    INT     cbEscData;          
-    BYTE    EscData[1];         
-} EMRNAMEDESCAPE, *PEMRNAMEDESCAPE;
-
-
-
-typedef struct tagEMRSETICMPROFILE
-{
-    EMR     emr;
-    DWORD   dwFlags;            
-    DWORD   cbName;             
-    DWORD   cbData;             
-    BYTE    Data[1];            
-} EMRSETICMPROFILE,  *PEMRSETICMPROFILE,
-  EMRSETICMPROFILEA, *PEMRSETICMPROFILEA,
-  EMRSETICMPROFILEW, *PEMRSETICMPROFILEW;
-
-
-
-typedef struct tagEMRCREATECOLORSPACEW
-{
-    EMR             emr;
-    DWORD           ihCS;       
-    LOGCOLORSPACEW  lcs;        
-    DWORD           dwFlags;    
-    DWORD           cbData;     
-    BYTE            Data[1];    
-} EMRCREATECOLORSPACEW, *PEMRCREATECOLORSPACEW;
-
-
-
-typedef struct tagCOLORMATCHTOTARGET
-{
-    EMR     emr;
-    DWORD   dwAction;           
-    DWORD   dwFlags;            
-    DWORD   cbName;             
-    DWORD   cbData;             
-    BYTE    Data[1];            
-} EMRCOLORMATCHTOTARGET, *PEMRCOLORMATCHTOTARGET;
-
-typedef struct tagCOLORCORRECTPALETTE
-{
-    EMR     emr;
-    DWORD   ihPalette;          
-    DWORD   nFirstEntry;        
-    DWORD   nPalEntries;        
-    DWORD   nReserved;          
-} EMRCOLORCORRECTPALETTE, *PEMRCOLORCORRECTPALETTE;
-
-typedef struct tagEMRALPHABLEND
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    cxSrc;
-    LONG    cySrc;
-} EMRALPHABLEND, *PEMRALPHABLEND;
-
-typedef struct tagEMRGRADIENTFILL
-{
-    EMR       emr;
-    RECTL     rclBounds;          
-    DWORD     nVer;
-    DWORD     nTri;
-    ULONG     ulMode;
-    TRIVERTEX Ver[1];
-}EMRGRADIENTFILL,*PEMRGRADIENTFILL;
-
-typedef struct tagEMRTRANSPARENTBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    cxSrc;
-    LONG    cySrc;
-} EMRTRANSPARENTBLT, *PEMRTRANSPARENTBLT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall wglCopyContext(HGLRC, HGLRC, UINT);
-__declspec(dllimport) HGLRC __stdcall wglCreateContext(HDC);
-__declspec(dllimport) HGLRC __stdcall wglCreateLayerContext(HDC, int);
-__declspec(dllimport) BOOL  __stdcall wglDeleteContext(HGLRC);
-__declspec(dllimport) HGLRC __stdcall wglGetCurrentContext(void);
-__declspec(dllimport) HDC   __stdcall wglGetCurrentDC(void);
-__declspec(dllimport) PROC  __stdcall wglGetProcAddress(LPCSTR);
-__declspec(dllimport) BOOL  __stdcall wglMakeCurrent(HDC, HGLRC);
-__declspec(dllimport) BOOL  __stdcall wglShareLists(HGLRC, HGLRC);
-__declspec(dllimport) BOOL  __stdcall wglUseFontBitmapsA(HDC, DWORD, DWORD, DWORD);
-__declspec(dllimport) BOOL  __stdcall wglUseFontBitmapsW(HDC, DWORD, DWORD, DWORD);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall SwapBuffers(HDC);
-
-typedef struct _POINTFLOAT {
-    FLOAT   x;
-    FLOAT   y;
-} POINTFLOAT, *PPOINTFLOAT;
-
-typedef struct _GLYPHMETRICSFLOAT {
-    FLOAT       gmfBlackBoxX;
-    FLOAT       gmfBlackBoxY;
-    POINTFLOAT  gmfptGlyphOrigin;
-    FLOAT       gmfCellIncX;
-    FLOAT       gmfCellIncY;
-} GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT,  *LPGLYPHMETRICSFLOAT;
-
-
-
-__declspec(dllimport) BOOL  __stdcall wglUseFontOutlinesA(HDC, DWORD, DWORD, DWORD, FLOAT,
-                                           FLOAT, int, LPGLYPHMETRICSFLOAT);
-__declspec(dllimport) BOOL  __stdcall wglUseFontOutlinesW(HDC, DWORD, DWORD, DWORD, FLOAT,
-                                           FLOAT, int, LPGLYPHMETRICSFLOAT);
-
-
-
-
-
-
-
-typedef struct tagLAYERPLANEDESCRIPTOR { 
-    WORD  nSize;
-    WORD  nVersion;
-    DWORD dwFlags;
-    BYTE  iPixelType;
-    BYTE  cColorBits;
-    BYTE  cRedBits;
-    BYTE  cRedShift;
-    BYTE  cGreenBits;
-    BYTE  cGreenShift;
-    BYTE  cBlueBits;
-    BYTE  cBlueShift;
-    BYTE  cAlphaBits;
-    BYTE  cAlphaShift;
-    BYTE  cAccumBits;
-    BYTE  cAccumRedBits;
-    BYTE  cAccumGreenBits;
-    BYTE  cAccumBlueBits;
-    BYTE  cAccumAlphaBits;
-    BYTE  cDepthBits;
-    BYTE  cStencilBits;
-    BYTE  cAuxBuffers;
-    BYTE  iLayerPlane;
-    BYTE  bReserved;
-    COLORREF crTransparent;
-} LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR,  *LPLAYERPLANEDESCRIPTOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall wglDescribeLayerPlane(HDC, int, int, UINT,
-                                             LPLAYERPLANEDESCRIPTOR);
-__declspec(dllimport) int   __stdcall wglSetLayerPaletteEntries(HDC, int, int, int,
-                                                 const COLORREF *);
-__declspec(dllimport) int   __stdcall wglGetLayerPaletteEntries(HDC, int, int, int,
-                                                 COLORREF *);
-__declspec(dllimport) BOOL  __stdcall wglRealizeLayerPalette(HDC, int, BOOL);
-__declspec(dllimport) BOOL  __stdcall wglSwapLayerBuffers(HDC, UINT);
-
-
-
-typedef struct _WGLSWAP
-{
-    HDC hdc;
-    UINT uiFlags;
-} WGLSWAP, *PWGLSWAP,  *LPWGLSWAP;
-
-
-
-__declspec(dllimport) DWORD __stdcall wglSwapMultipleBuffers(UINT, const WGLSWAP *);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-typedef HANDLE HDWP;
-typedef void MENUTEMPLATEA;
-typedef void MENUTEMPLATEW;
-
-typedef MENUTEMPLATEW MENUTEMPLATE;
-
-
-
-typedef PVOID LPMENUTEMPLATEA;
-typedef PVOID LPMENUTEMPLATEW;
-
-typedef LPMENUTEMPLATEW LPMENUTEMPLATE;
-
-
-
-
-typedef LRESULT (__stdcall* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
-
-
-
-typedef INT_PTR (__stdcall* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
-typedef void (__stdcall* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
-typedef BOOL (__stdcall* GRAYSTRINGPROC)(HDC, LPARAM, int);
-typedef BOOL (__stdcall* WNDENUMPROC)(HWND, LPARAM);
-typedef LRESULT (__stdcall* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
-typedef void (__stdcall* SENDASYNCPROC)(HWND, UINT, ULONG_PTR, LRESULT);
-
-typedef BOOL (__stdcall* PROPENUMPROCA)(HWND, LPCSTR, HANDLE);
-typedef BOOL (__stdcall* PROPENUMPROCW)(HWND, LPCWSTR, HANDLE);
-
-typedef BOOL (__stdcall* PROPENUMPROCEXA)(HWND, LPSTR, HANDLE, ULONG_PTR);
-typedef BOOL (__stdcall* PROPENUMPROCEXW)(HWND, LPWSTR, HANDLE, ULONG_PTR);
-
-typedef int (__stdcall* EDITWORDBREAKPROCA)(LPSTR lpch, int ichCurrent, int cch, int code);
-typedef int (__stdcall* EDITWORDBREAKPROCW)(LPWSTR lpch, int ichCurrent, int cch, int code);
-
-
-typedef BOOL (__stdcall* DRAWSTATEPROC)(HDC hdc, LPARAM lData, WPARAM wData, int cx, int cy);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef PROPENUMPROCW        PROPENUMPROC;
-typedef PROPENUMPROCEXW      PROPENUMPROCEX;
-typedef EDITWORDBREAKPROCW   EDITWORDBREAKPROC;
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall* NAMEENUMPROCA)(LPSTR, LPARAM);
-typedef BOOL (__stdcall* NAMEENUMPROCW)(LPWSTR, LPARAM);
-
-typedef NAMEENUMPROCA   WINSTAENUMPROCA;
-typedef NAMEENUMPROCA   DESKTOPENUMPROCA;
-typedef NAMEENUMPROCW   WINSTAENUMPROCW;
-typedef NAMEENUMPROCW   DESKTOPENUMPROCW;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef WINSTAENUMPROCW     WINSTAENUMPROC;
-typedef DESKTOPENUMPROCW    DESKTOPENUMPROC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-wvsprintfA(
-         LPSTR,
-          LPCSTR,
-         va_list arglist);
-__declspec(dllimport)
-int
-__stdcall
-wvsprintfW(
-         LPWSTR,
-          LPCWSTR,
-         va_list arglist);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__cdecl
-wsprintfA(
-         LPSTR,
-          LPCSTR,
-    ...);
-__declspec(dllimport)
-int
-__cdecl
-wsprintfW(
-         LPWSTR,
-          LPCWSTR,
-    ...);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCBT_CREATEWNDA
-{
-    struct tagCREATESTRUCTA *lpcs;
-    HWND           hwndInsertAfter;
-} CBT_CREATEWNDA, *LPCBT_CREATEWNDA;
-
-
-
-typedef struct tagCBT_CREATEWNDW
-{
-    struct tagCREATESTRUCTW *lpcs;
-    HWND           hwndInsertAfter;
-} CBT_CREATEWNDW, *LPCBT_CREATEWNDW;
-
-typedef CBT_CREATEWNDW CBT_CREATEWND;
-typedef LPCBT_CREATEWNDW LPCBT_CREATEWND;
-
-
-
-
-
-
-
-
-typedef struct tagCBTACTIVATESTRUCT
-{
-    BOOL    fMouse;
-    HWND    hWndActive;
-} CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;
-
-
-
-
-
-typedef struct tagWTSSESSION_NOTIFICATION
-{
-    DWORD cbSize;
-    DWORD dwSessionId;
-
-} WTSSESSION_NOTIFICATION, *PWTSSESSION_NOTIFICATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct
-{
-    HWND    hwnd;
-    RECT    rc;
-} SHELLHOOKINFO, *LPSHELLHOOKINFO;
-
-
-
-
-typedef struct tagEVENTMSG {
-    UINT    message;
-    UINT    paramL;
-    UINT    paramH;
-    DWORD    time;
-    HWND     hwnd;
-} EVENTMSG, *PEVENTMSGMSG,  *NPEVENTMSGMSG,  *LPEVENTMSGMSG;
-
-typedef struct tagEVENTMSG *PEVENTMSG,  *NPEVENTMSG,  *LPEVENTMSG;
-
-
-
-
-typedef struct tagCWPSTRUCT {
-    LPARAM  lParam;
-    WPARAM  wParam;
-    UINT    message;
-    HWND    hwnd;
-} CWPSTRUCT, *PCWPSTRUCT,  *NPCWPSTRUCT,  *LPCWPSTRUCT;
-
-
-
-
-
-typedef struct tagCWPRETSTRUCT {
-    LRESULT lResult;
-    LPARAM  lParam;
-    WPARAM  wParam;
-    UINT    message;
-    HWND    hwnd;
-} CWPRETSTRUCT, *PCWPRETSTRUCT,  *NPCWPRETSTRUCT,  *LPCWPRETSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagKBDLLHOOKSTRUCT {
-    DWORD   vkCode;
-    DWORD   scanCode;
-    DWORD   flags;
-    DWORD   time;
-    ULONG_PTR dwExtraInfo;
-} KBDLLHOOKSTRUCT,  *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
-
-
-
-
-typedef struct tagMSLLHOOKSTRUCT {
-    POINT   pt;
-    DWORD   mouseData;
-    DWORD   flags;
-    DWORD   time;
-    ULONG_PTR dwExtraInfo;
-} MSLLHOOKSTRUCT,  *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;
-
-
-
-
-
-
-typedef struct tagDEBUGHOOKINFO
-{
-    DWORD   idThread;
-    DWORD   idThreadInstaller;
-    LPARAM  lParam;
-    WPARAM  wParam;
-    int     code;
-} DEBUGHOOKINFO, *PDEBUGHOOKINFO,  *NPDEBUGHOOKINFO, * LPDEBUGHOOKINFO;
-
-
-
-
-typedef struct tagMOUSEHOOKSTRUCT {
-    POINT   pt;
-    HWND    hwnd;
-    UINT    wHitTestCode;
-    ULONG_PTR dwExtraInfo;
-} MOUSEHOOKSTRUCT,  *LPMOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
-
-
-
-typedef struct tagMOUSEHOOKSTRUCTEX : public tagMOUSEHOOKSTRUCT
-{
-    DWORD   mouseData;
-} MOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagHARDWAREHOOKSTRUCT {
-    HWND    hwnd;
-    UINT    message;
-    WPARAM  wParam;
-    LPARAM  lParam;
-} HARDWAREHOOKSTRUCT,  *LPHARDWAREHOOKSTRUCT, *PHARDWAREHOOKSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HKL
-__stdcall
-LoadKeyboardLayoutA(
-         LPCSTR pwszKLID,
-         UINT Flags);
-__declspec(dllimport)
-HKL
-__stdcall
-LoadKeyboardLayoutW(
-         LPCWSTR pwszKLID,
-         UINT Flags);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HKL
-__stdcall
-ActivateKeyboardLayout(
-         HKL hkl,
-         UINT Flags);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-ToUnicodeEx(
-         UINT wVirtKey,
-         UINT wScanCode,
-           const BYTE *lpKeyState,
-         LPWSTR pwszBuff,
-         int cchBuff,
-         UINT wFlags,
-           HKL dwhkl);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnloadKeyboardLayout(
-         HKL hkl);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetKeyboardLayoutNameA(
-         LPSTR pwszKLID);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetKeyboardLayoutNameW(
-         LPWSTR pwszKLID);
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetKeyboardLayoutList(
-         int nBuff,
-             HKL  *lpList);
-
-__declspec(dllimport)
-HKL
-__stdcall
-GetKeyboardLayout(
-         DWORD idThread);
-
-
-
-
-
-typedef struct tagMOUSEMOVEPOINT {
-    int   x;
-    int   y;
-    DWORD time;
-    ULONG_PTR dwExtraInfo;
-} MOUSEMOVEPOINT, *PMOUSEMOVEPOINT, * LPMOUSEMOVEPOINT;
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetMouseMovePointsEx(
-         UINT cbSize,
-         LPMOUSEMOVEPOINT lppt,
-         LPMOUSEMOVEPOINT lpptBuf,
-         int nBufPoints,
-         DWORD resolution);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HDESK
-__stdcall
-CreateDesktopA(
-         LPCSTR lpszDesktop,
-      LPCSTR lpszDevice,
-      LPDEVMODEA pDevmode,
-         DWORD dwFlags,
-         ACCESS_MASK dwDesiredAccess,
-           LPSECURITY_ATTRIBUTES lpsa);
-__declspec(dllimport)
-HDESK
-__stdcall
-CreateDesktopW(
-         LPCWSTR lpszDesktop,
-      LPCWSTR lpszDevice,
-      LPDEVMODEW pDevmode,
-         DWORD dwFlags,
-         ACCESS_MASK dwDesiredAccess,
-           LPSECURITY_ATTRIBUTES lpsa);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HDESK
-__stdcall
-OpenDesktopA(
-         LPCSTR lpszDesktop,
-         DWORD dwFlags,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-__declspec(dllimport)
-HDESK
-__stdcall
-OpenDesktopW(
-         LPCWSTR lpszDesktop,
-         DWORD dwFlags,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-
-
-
-
-
-
-__declspec(dllimport)
-HDESK
-__stdcall
-OpenInputDesktop(
-         DWORD dwFlags,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDesktopsA(
-           HWINSTA hwinsta,
-         DESKTOPENUMPROCA lpEnumFunc,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDesktopsW(
-           HWINSTA hwinsta,
-         DESKTOPENUMPROCW lpEnumFunc,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDesktopWindows(
-           HDESK hDesktop,
-         WNDENUMPROC lpfn,
-         LPARAM lParam);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SwitchDesktop(
-         HDESK hDesktop);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadDesktop(
-          HDESK hDesktop);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseDesktop(
-         HDESK hDesktop);
-
-__declspec(dllimport)
-HDESK
-__stdcall
-GetThreadDesktop(
-         DWORD dwThreadId);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWINSTA
-__stdcall
-CreateWindowStationA(
-           LPCSTR lpwinsta,
-         DWORD dwFlags,
-         ACCESS_MASK dwDesiredAccess,
-           LPSECURITY_ATTRIBUTES lpsa);
-__declspec(dllimport)
-HWINSTA
-__stdcall
-CreateWindowStationW(
-           LPCWSTR lpwinsta,
-         DWORD dwFlags,
-         ACCESS_MASK dwDesiredAccess,
-           LPSECURITY_ATTRIBUTES lpsa);
-
-
-
-
-
-
-__declspec(dllimport)
-HWINSTA
-__stdcall
-OpenWindowStationA(
-         LPCSTR lpszWinSta,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-__declspec(dllimport)
-HWINSTA
-__stdcall
-OpenWindowStationW(
-         LPCWSTR lpszWinSta,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumWindowStationsA(
-         WINSTAENUMPROCA lpEnumFunc,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumWindowStationsW(
-         WINSTAENUMPROCW lpEnumFunc,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseWindowStation(
-         HWINSTA hWinSta);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessWindowStation(
-         HWINSTA hWinSta);
-
-__declspec(dllimport)
-HWINSTA
-__stdcall
-GetProcessWindowStation(
-    void);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetUserObjectSecurity(
-         HANDLE hObj,
-         PSECURITY_INFORMATION pSIRequested,
-         PSECURITY_DESCRIPTOR pSID);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserObjectSecurity(
-         HANDLE hObj,
-         PSECURITY_INFORMATION pSIRequested,
-           PSECURITY_DESCRIPTOR pSID,
-         DWORD nLength,
-         LPDWORD lpnLengthNeeded);
-
-
-
-
-
-
-typedef struct tagUSEROBJECTFLAGS {
-    BOOL fInherit;
-    BOOL fReserved;
-    DWORD dwFlags;
-} USEROBJECTFLAGS, *PUSEROBJECTFLAGS;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserObjectInformationA(
-         HANDLE hObj,
-         int nIndex,
-           PVOID pvInfo,
-         DWORD nLength,
-           LPDWORD lpnLengthNeeded);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserObjectInformationW(
-         HANDLE hObj,
-         int nIndex,
-           PVOID pvInfo,
-         DWORD nLength,
-           LPDWORD lpnLengthNeeded);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetUserObjectInformationA(
-         HANDLE hObj,
-         int nIndex,
-           PVOID pvInfo,
-         DWORD nLength);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetUserObjectInformationW(
-         HANDLE hObj,
-         int nIndex,
-           PVOID pvInfo,
-         DWORD nLength);
-
-
-
-
-
-
-
-
-
-typedef struct tagWNDCLASSEXA {
-    UINT        cbSize;
-    
-    UINT        style;
-    WNDPROC     lpfnWndProc;
-    int         cbClsExtra;
-    int         cbWndExtra;
-    HINSTANCE   hInstance;
-    HICON       hIcon;
-    HCURSOR     hCursor;
-    HBRUSH      hbrBackground;
-    LPCSTR      lpszMenuName;
-    LPCSTR      lpszClassName;
-    
-    HICON       hIconSm;
-} WNDCLASSEXA, *PWNDCLASSEXA,  *NPWNDCLASSEXA,  *LPWNDCLASSEXA;
-typedef struct tagWNDCLASSEXW {
-    UINT        cbSize;
-    
-    UINT        style;
-    WNDPROC     lpfnWndProc;
-    int         cbClsExtra;
-    int         cbWndExtra;
-    HINSTANCE   hInstance;
-    HICON       hIcon;
-    HCURSOR     hCursor;
-    HBRUSH      hbrBackground;
-    LPCWSTR     lpszMenuName;
-    LPCWSTR     lpszClassName;
-    
-    HICON       hIconSm;
-} WNDCLASSEXW, *PWNDCLASSEXW,  *NPWNDCLASSEXW,  *LPWNDCLASSEXW;
-
-typedef WNDCLASSEXW WNDCLASSEX;
-typedef PWNDCLASSEXW PWNDCLASSEX;
-typedef NPWNDCLASSEXW NPWNDCLASSEX;
-typedef LPWNDCLASSEXW LPWNDCLASSEX;
-
-
-
-
-
-
-
-
-typedef struct tagWNDCLASSA {
-    UINT        style;
-    WNDPROC     lpfnWndProc;
-    int         cbClsExtra;
-    int         cbWndExtra;
-    HINSTANCE   hInstance;
-    HICON       hIcon;
-    HCURSOR     hCursor;
-    HBRUSH      hbrBackground;
-    LPCSTR      lpszMenuName;
-    LPCSTR      lpszClassName;
-} WNDCLASSA, *PWNDCLASSA,  *NPWNDCLASSA,  *LPWNDCLASSA;
-typedef struct tagWNDCLASSW {
-    UINT        style;
-    WNDPROC     lpfnWndProc;
-    int         cbClsExtra;
-    int         cbWndExtra;
-    HINSTANCE   hInstance;
-    HICON       hIcon;
-    HCURSOR     hCursor;
-    HBRUSH      hbrBackground;
-    LPCWSTR     lpszMenuName;
-    LPCWSTR     lpszClassName;
-} WNDCLASSW, *PWNDCLASSW,  *NPWNDCLASSW,  *LPWNDCLASSW;
-
-typedef WNDCLASSW WNDCLASS;
-typedef PWNDCLASSW PWNDCLASS;
-typedef NPWNDCLASSW NPWNDCLASS;
-typedef LPWNDCLASSW LPWNDCLASS;
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsHungAppWindow(
-         HWND hwnd);
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-DisableProcessWindowsGhosting(
-    void);
-
-
-
-
-
-
-
-
-typedef struct tagMSG {
-    HWND        hwnd;
-    UINT        message;
-    WPARAM      wParam;
-    LPARAM      lParam;
-    DWORD       time;
-    POINT       pt;
-
-
-
-} MSG, *PMSG,  *NPMSG,  *LPMSG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMINMAXINFO {
-    POINT ptReserved;
-    POINT ptMaxSize;
-    POINT ptMaxPosition;
-    POINT ptMinTrackSize;
-    POINT ptMaxTrackSize;
-} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCOPYDATASTRUCT {
-    ULONG_PTR dwData;
-    DWORD cbData;
-    PVOID lpData;
-} COPYDATASTRUCT, *PCOPYDATASTRUCT;
-
-
-typedef struct tagMDINEXTMENU
-{
-    HMENU   hmenuIn;
-    HMENU   hmenuNext;
-    HWND    hwndNext;
-} MDINEXTMENU, * PMDINEXTMENU,  * LPMDINEXTMENU;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-RegisterWindowMessageA(
-         LPCSTR lpString);
-__declspec(dllimport)
-UINT
-__stdcall
-RegisterWindowMessageW(
-         LPCWSTR lpString);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagWINDOWPOS {
-    HWND    hwnd;
-    HWND    hwndInsertAfter;
-    int     x;
-    int     y;
-    int     cx;
-    int     cy;
-    UINT    flags;
-} WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS;
-
-
-
-
-typedef struct tagNCCALCSIZE_PARAMS {
-    RECT       rgrc[3];
-    PWINDOWPOS lppos;
-} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagTRACKMOUSEEVENT {
-    DWORD cbSize;
-    DWORD dwFlags;
-    HWND  hwndTrack;
-    DWORD dwHoverTime;
-} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TrackMouseEvent(
-         LPTRACKMOUSEEVENT lpEventTrack);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawEdge(
-         HDC hdc,
-         LPRECT qrc,
-         UINT edge,
-         UINT grfFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawFrameControl(
-         HDC,
-         LPRECT,
-         UINT,
-         UINT);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawCaption(
-         HWND hwnd,
-         HDC hdc,
-         const RECT * lprect,
-         UINT flags);
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawAnimatedRects(
-           HWND hwnd,
-         int idAni,
-         const RECT *lprcFrom,
-         const RECT *lprcTo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagACCEL {
-
-    BYTE   fVirt;               
-    WORD   key;
-    WORD   cmd;
-
-
-
-
-
-} ACCEL, *LPACCEL;
-
-typedef struct tagPAINTSTRUCT {
-    HDC         hdc;
-    BOOL        fErase;
-    RECT        rcPaint;
-    BOOL        fRestore;
-    BOOL        fIncUpdate;
-    BYTE        rgbReserved[32];
-} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;
-
-typedef struct tagCREATESTRUCTA {
-    LPVOID      lpCreateParams;
-    HINSTANCE   hInstance;
-    HMENU       hMenu;
-    HWND        hwndParent;
-    int         cy;
-    int         cx;
-    int         y;
-    int         x;
-    LONG        style;
-    LPCSTR      lpszName;
-    LPCSTR      lpszClass;
-    DWORD       dwExStyle;
-} CREATESTRUCTA, *LPCREATESTRUCTA;
-typedef struct tagCREATESTRUCTW {
-    LPVOID      lpCreateParams;
-    HINSTANCE   hInstance;
-    HMENU       hMenu;
-    HWND        hwndParent;
-    int         cy;
-    int         cx;
-    int         y;
-    int         x;
-    LONG        style;
-    LPCWSTR     lpszName;
-    LPCWSTR     lpszClass;
-    DWORD       dwExStyle;
-} CREATESTRUCTW, *LPCREATESTRUCTW;
-
-typedef CREATESTRUCTW CREATESTRUCT;
-typedef LPCREATESTRUCTW LPCREATESTRUCT;
-
-
-
-
-
-typedef struct tagWINDOWPLACEMENT {
-    UINT  length;
-    UINT  flags;
-    UINT  showCmd;
-    POINT ptMinPosition;
-    POINT ptMaxPosition;
-    RECT  rcNormalPosition;
-
-
-
-} WINDOWPLACEMENT;
-typedef WINDOWPLACEMENT *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;
-
-
-
-
-
-
-
-
-typedef struct tagNMHDR
-{
-    HWND      hwndFrom;
-    UINT_PTR  idFrom;
-    UINT      code;         
-}   NMHDR;
-typedef NMHDR  * LPNMHDR;
-
-typedef struct tagSTYLESTRUCT
-{
-    DWORD   styleOld;
-    DWORD   styleNew;
-} STYLESTRUCT, * LPSTYLESTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMEASUREITEMSTRUCT {
-    UINT       CtlType;
-    UINT       CtlID;
-    UINT       itemID;
-    UINT       itemWidth;
-    UINT       itemHeight;
-    ULONG_PTR  itemData;
-} MEASUREITEMSTRUCT,  *PMEASUREITEMSTRUCT,  *LPMEASUREITEMSTRUCT;
-
-
-
-
-
-typedef struct tagDRAWITEMSTRUCT {
-    UINT        CtlType;
-    UINT        CtlID;
-    UINT        itemID;
-    UINT        itemAction;
-    UINT        itemState;
-    HWND        hwndItem;
-    HDC         hDC;
-    RECT        rcItem;
-    ULONG_PTR   itemData;
-} DRAWITEMSTRUCT,  *PDRAWITEMSTRUCT,  *LPDRAWITEMSTRUCT;
-
-
-
-
-typedef struct tagDELETEITEMSTRUCT {
-    UINT       CtlType;
-    UINT       CtlID;
-    UINT       itemID;
-    HWND       hwndItem;
-    ULONG_PTR  itemData;
-} DELETEITEMSTRUCT,  *PDELETEITEMSTRUCT,  *LPDELETEITEMSTRUCT;
-
-
-
-
-typedef struct tagCOMPAREITEMSTRUCT {
-    UINT        CtlType;
-    UINT        CtlID;
-    HWND        hwndItem;
-    UINT        itemID1;
-    ULONG_PTR   itemData1;
-    UINT        itemID2;
-    ULONG_PTR   itemData2;
-    DWORD       dwLocaleId;
-} COMPAREITEMSTRUCT,  *PCOMPAREITEMSTRUCT,  *LPCOMPAREITEMSTRUCT;
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMessageA(
-         LPMSG lpMsg,
-           HWND hWnd,
-         UINT wMsgFilterMin,
-         UINT wMsgFilterMax);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMessageW(
-         LPMSG lpMsg,
-           HWND hWnd,
-         UINT wMsgFilterMin,
-         UINT wMsgFilterMax);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TranslateMessage(
-         const MSG *lpMsg);
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-DispatchMessageA(
-         const MSG *lpMsg);
-__declspec(dllimport)
-LRESULT
-__stdcall
-DispatchMessageW(
-         const MSG *lpMsg);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMessageQueue(
-         int cMessagesMax);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekMessageA(
-         LPMSG lpMsg,
-           HWND hWnd,
-         UINT wMsgFilterMin,
-         UINT wMsgFilterMax,
-         UINT wRemoveMsg);
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekMessageW(
-         LPMSG lpMsg,
-           HWND hWnd,
-         UINT wMsgFilterMin,
-         UINT wMsgFilterMax,
-         UINT wRemoveMsg);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RegisterHotKey(
-           HWND hWnd,
-         int id,
-         UINT fsModifiers,
-         UINT vk);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnregisterHotKey(
-           HWND hWnd,
-         int id);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ExitWindowsEx(
-         UINT uFlags,
-         DWORD dwReason);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SwapMouseButton(
-         BOOL fSwap);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetMessagePos(
-    void);
-
-__declspec(dllimport)
-LONG
-__stdcall
-GetMessageTime(
-    void);
-
-__declspec(dllimport)
-LPARAM
-__stdcall
-GetMessageExtraInfo(
-    void);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWow64Message(
-    void);
-
-
-
-__declspec(dllimport)
-LPARAM
-__stdcall
-SetMessageExtraInfo(
-         LPARAM lParam);
-
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendMessageA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendMessageW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendMessageTimeoutA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-         UINT fuFlags,
-         UINT uTimeout,
-           PDWORD_PTR lpdwResult);
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendMessageTimeoutW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-         UINT fuFlags,
-         UINT uTimeout,
-           PDWORD_PTR lpdwResult);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SendNotifyMessageA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-SendNotifyMessageW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SendMessageCallbackA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-         SENDASYNCPROC lpResultCallBack,
-         ULONG_PTR dwData);
-__declspec(dllimport)
-BOOL
-__stdcall
-SendMessageCallbackW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-         SENDASYNCPROC lpResultCallBack,
-         ULONG_PTR dwData);
-
-
-
-
-
-
-
-typedef struct {
-    UINT  cbSize;
-    HDESK hdesk;
-    HWND  hwnd;
-    LUID  luid;
-} BSMINFO, *PBSMINFO;
-
-__declspec(dllimport)
-long
-__stdcall
-BroadcastSystemMessageExA(
-         DWORD flags,
-           LPDWORD lpInfo,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-           PBSMINFO pbsmInfo);
-__declspec(dllimport)
-long
-__stdcall
-BroadcastSystemMessageExW(
-         DWORD flags,
-           LPDWORD lpInfo,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-           PBSMINFO pbsmInfo);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-long
-__stdcall
-BroadcastSystemMessageA(
-         DWORD flags,
-           LPDWORD lpInfo,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-long
-__stdcall
-BroadcastSystemMessageW(
-         DWORD flags,
-           LPDWORD lpInfo,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  PVOID           HDEVNOTIFY;
-typedef  HDEVNOTIFY     *PHDEVNOTIFY;
-
-
-
-
-
-
-
-__declspec(dllimport)
-HDEVNOTIFY
-__stdcall
-RegisterDeviceNotificationA(
-         HANDLE hRecipient,
-         LPVOID NotificationFilter,
-         DWORD Flags);
-__declspec(dllimport)
-HDEVNOTIFY
-__stdcall
-RegisterDeviceNotificationW(
-         HANDLE hRecipient,
-         LPVOID NotificationFilter,
-         DWORD Flags);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnregisterDeviceNotification(
-         HDEVNOTIFY Handle);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PostMessageA(
-           HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-PostMessageW(
-           HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PostThreadMessageA(
-         DWORD idThread,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-PostThreadMessageW(
-         DWORD idThread,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AttachThreadInput(
-         DWORD idAttach,
-         DWORD idAttachTo,
-         BOOL fAttach);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReplyMessage(
-         LRESULT lResult);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitMessage(
-    void);
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForInputIdle(
-         HANDLE hProcess,
-         DWORD dwMilliseconds);
-
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefWindowProcA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefWindowProcW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-PostQuitMessage(
-         int nExitCode);
-
-
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-CallWindowProcA(
-         WNDPROC lpPrevWndFunc,
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-LRESULT
-__stdcall
-CallWindowProcW(
-         WNDPROC lpPrevWndFunc,
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InSendMessage(
-    void);
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-InSendMessageEx(
-      LPVOID lpReserved);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetDoubleClickTime(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDoubleClickTime(
-         UINT);
-
-__declspec(dllimport)
-ATOM
-__stdcall
-RegisterClassA(
-         const WNDCLASSA *lpWndClass);
-__declspec(dllimport)
-ATOM
-__stdcall
-RegisterClassW(
-         const WNDCLASSW *lpWndClass);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnregisterClassA(
-         LPCSTR lpClassName,
-         HINSTANCE hInstance);
-__declspec(dllimport)
-BOOL
-__stdcall
-UnregisterClassW(
-         LPCWSTR lpClassName,
-         HINSTANCE hInstance);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClassInfoA(
-           HINSTANCE hInstance,
-         LPCSTR lpClassName,
-         LPWNDCLASSA lpWndClass);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClassInfoW(
-           HINSTANCE hInstance,
-         LPCWSTR lpClassName,
-         LPWNDCLASSW lpWndClass);
-
-
-
-
-
-
-
-__declspec(dllimport)
-ATOM
-__stdcall
-RegisterClassExA(
-         const WNDCLASSEXA *);
-__declspec(dllimport)
-ATOM
-__stdcall
-RegisterClassExW(
-         const WNDCLASSEXW *);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClassInfoExA(
-           HINSTANCE hInstance,
-         LPCSTR lpszClass,
-         LPWNDCLASSEXA lpwcx);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClassInfoExW(
-           HINSTANCE hInstance,
-         LPCWSTR lpszClass,
-         LPWNDCLASSEXW lpwcx);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOLEAN (__stdcall * PREGISTERCLASSNAMEW)(LPCWSTR);
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-CreateWindowExA(
-         DWORD dwExStyle,
-           LPCSTR lpClassName,
-           LPCSTR lpWindowName,
-         DWORD dwStyle,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-           HWND hWndParent,
-           HMENU hMenu,
-           HINSTANCE hInstance,
-           LPVOID lpParam);
-__declspec(dllimport)
-HWND
-__stdcall
-CreateWindowExW(
-         DWORD dwExStyle,
-           LPCWSTR lpClassName,
-           LPCWSTR lpWindowName,
-         DWORD dwStyle,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-           HWND hWndParent,
-           HMENU hMenu,
-           HINSTANCE hInstance,
-           LPVOID lpParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWindow(
-           HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsMenu(
-         HMENU hMenu);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsChild(
-         HWND hWndParent,
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyWindow(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowWindow(
-         HWND hWnd,
-         int nCmdShow);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AnimateWindow(
-         HWND hWnd,
-         DWORD dwTime,
-         DWORD dwFlags);
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateLayeredWindow(
-         HWND hWnd,
-           HDC hdcDst,
-           POINT *pptDst,
-           SIZE *psize,
-           HDC hdcSrc,
-           POINT *pptSrc,
-         COLORREF crKey,
-           BLENDFUNCTION *pblend,
-         DWORD dwFlags);
-
-
-
-
-
-
-typedef struct tagUPDATELAYEREDWINDOWINFO
-{
-                        DWORD               cbSize;
-                      HDC                 hdcDst;
-              POINT const         *pptDst;
-              SIZE const          *psize;
-                      HDC                 hdcSrc;
-              POINT const         *pptSrc;
-                      COLORREF            crKey;
-              BLENDFUNCTION const *pblend;
-                        DWORD               dwFlags;
-              RECT const          *prcDirty;
-} UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;
-
-
-
-typedef
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateLayeredWindowIndirect(
-         HWND hWnd,
-           UPDATELAYEREDWINDOWINFO const *pULWInfo);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetLayeredWindowAttributes(
-         HWND hwnd,
-           COLORREF *pcrKey,
-           BYTE *pbAlpha,
-           DWORD *pdwFlags);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PrintWindow(
-          HWND hwnd,
-          HDC hdcBlt,
-          UINT nFlags);
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetLayeredWindowAttributes(
-         HWND hwnd,
-         COLORREF crKey,
-         BYTE bAlpha,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowWindowAsync(
-          HWND hWnd,
-          int nCmdShow);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlashWindow(
-          HWND hWnd,
-          BOOL bInvert);
-
-
-typedef struct {
-    UINT  cbSize;
-    HWND  hwnd;
-    DWORD dwFlags;
-    UINT  uCount;
-    DWORD dwTimeout;
-} FLASHWINFO, *PFLASHWINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlashWindowEx(
-         PFLASHWINFO pfwi);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowOwnedPopups(
-          HWND hWnd,
-          BOOL fShow);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OpenIcon(
-          HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseWindow(
-          HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveWindow(
-         HWND hWnd,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-         BOOL bRepaint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowPos(
-         HWND hWnd,
-           HWND hWndInsertAfter,
-         int X,
-         int Y,
-         int cx,
-         int cy,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetWindowPlacement(
-         HWND hWnd,
-         WINDOWPLACEMENT *lpwndpl);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowPlacement(
-         HWND hWnd,
-         const WINDOWPLACEMENT *lpwndpl);
-
-
-
-
-__declspec(dllimport)
-HDWP
-__stdcall
-BeginDeferWindowPos(
-         int nNumWindows);
-
-__declspec(dllimport)
-HDWP
-__stdcall
-DeferWindowPos(
-         HDWP hWinPosInfo,
-         HWND hWnd,
-           HWND hWndInsertAfter,
-         int x,
-         int y,
-         int cx,
-         int cy,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndDeferWindowPos(
-         HDWP hWinPosInfo);
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWindowVisible(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsIconic(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AnyPopup(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BringWindowToTop(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsZoomed(
-         HWND hWnd);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD style;
-    DWORD dwExtendedStyle;
-    WORD cdit;
-    short x;
-    short y;
-    short cx;
-    short cy;
-} DLGTEMPLATE;
-typedef DLGTEMPLATE *LPDLGTEMPLATEA;
-typedef DLGTEMPLATE *LPDLGTEMPLATEW;
-
-typedef LPDLGTEMPLATEW LPDLGTEMPLATE;
-
-
-
-typedef const DLGTEMPLATE *LPCDLGTEMPLATEA;
-typedef const DLGTEMPLATE *LPCDLGTEMPLATEW;
-
-typedef LPCDLGTEMPLATEW LPCDLGTEMPLATE;
-
-
-
-
-
-
-
-typedef struct {
-    DWORD style;
-    DWORD dwExtendedStyle;
-    short x;
-    short y;
-    short cx;
-    short cy;
-    WORD id;
-} DLGITEMTEMPLATE;
-typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEA;
-typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEW;
-
-typedef PDLGITEMTEMPLATEW PDLGITEMTEMPLATE;
-
-
-
-typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEA;
-typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEW;
-
-typedef LPDLGITEMTEMPLATEW LPDLGITEMTEMPLATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-CreateDialogParamA(
-           HINSTANCE hInstance,
-         LPCSTR lpTemplateName,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-__declspec(dllimport)
-HWND
-__stdcall
-CreateDialogParamW(
-           HINSTANCE hInstance,
-         LPCWSTR lpTemplateName,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-CreateDialogIndirectParamA(
-           HINSTANCE hInstance,
-         LPCDLGTEMPLATEA lpTemplate,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-__declspec(dllimport)
-HWND
-__stdcall
-CreateDialogIndirectParamW(
-           HINSTANCE hInstance,
-         LPCDLGTEMPLATEW lpTemplate,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT_PTR
-__stdcall
-DialogBoxParamA(
-           HINSTANCE hInstance,
-         LPCSTR lpTemplateName,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-__declspec(dllimport)
-INT_PTR
-__stdcall
-DialogBoxParamW(
-           HINSTANCE hInstance,
-         LPCWSTR lpTemplateName,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-
-
-
-
-
-
-__declspec(dllimport)
-INT_PTR
-__stdcall
-DialogBoxIndirectParamA(
-           HINSTANCE hInstance,
-         LPCDLGTEMPLATEA hDialogTemplate,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-__declspec(dllimport)
-INT_PTR
-__stdcall
-DialogBoxIndirectParamW(
-           HINSTANCE hInstance,
-         LPCDLGTEMPLATEW hDialogTemplate,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndDialog(
-         HWND hDlg,
-         INT_PTR nResult);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetDlgItem(
-           HWND hDlg,
-         int nIDDlgItem);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDlgItemInt(
-         HWND hDlg,
-         int nIDDlgItem,
-         UINT uValue,
-         BOOL bSigned);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetDlgItemInt(
-         HWND hDlg,
-         int nIDDlgItem,
-           BOOL *lpTranslated,
-         BOOL bSigned);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDlgItemTextA(
-         HWND hDlg,
-         int nIDDlgItem,
-         LPCSTR lpString);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDlgItemTextW(
-         HWND hDlg,
-         int nIDDlgItem,
-         LPCWSTR lpString);
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetDlgItemTextA(
-         HWND hDlg,
-         int nIDDlgItem,
-         LPSTR lpString,
-         int cchMax);
-__declspec(dllimport)
-UINT
-__stdcall
-GetDlgItemTextW(
-         HWND hDlg,
-         int nIDDlgItem,
-         LPWSTR lpString,
-         int cchMax);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckDlgButton(
-         HWND hDlg,
-         int nIDButton,
-         UINT uCheck);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckRadioButton(
-         HWND hDlg,
-         int nIDFirstButton,
-         int nIDLastButton,
-         int nIDCheckButton);
-
-__declspec(dllimport)
-UINT
-__stdcall
-IsDlgButtonChecked(
-         HWND hDlg,
-         int nIDButton);
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendDlgItemMessageA(
-         HWND hDlg,
-         int nIDDlgItem,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendDlgItemMessageW(
-         HWND hDlg,
-         int nIDDlgItem,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetNextDlgGroupItem(
-         HWND hDlg,
-           HWND hCtl,
-         BOOL bPrevious);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetNextDlgTabItem(
-         HWND hDlg,
-           HWND hCtl,
-         BOOL bPrevious);
-
-__declspec(dllimport)
-int
-__stdcall
-GetDlgCtrlID(
-         HWND hWnd);
-
-__declspec(dllimport)
-long
-__stdcall
-GetDialogBaseUnits(void);
-
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefDlgProcA(
-         HWND hDlg,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefDlgProcW(
-         HWND hDlg,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CallMsgFilterA(
-         LPMSG lpMsg,
-         int nCode);
-__declspec(dllimport)
-BOOL
-__stdcall
-CallMsgFilterW(
-         LPMSG lpMsg,
-         int nCode);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OpenClipboard(
-           HWND hWndNewOwner);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseClipboard(
-    void);
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetClipboardSequenceNumber(
-    void);
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetClipboardOwner(
-    void);
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetClipboardViewer(
-         HWND hWndNewViewer);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetClipboardViewer(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeClipboardChain(
-         HWND hWndRemove,
-         HWND hWndNewNext);
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-SetClipboardData(
-         UINT uFormat,
-           HANDLE hMem);
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-GetClipboardData(
-         UINT uFormat);
-
-__declspec(dllimport)
-UINT
-__stdcall
-RegisterClipboardFormatA(
-         LPCSTR lpszFormat);
-__declspec(dllimport)
-UINT
-__stdcall
-RegisterClipboardFormatW(
-         LPCWSTR lpszFormat);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-CountClipboardFormats(
-    void);
-
-__declspec(dllimport)
-UINT
-__stdcall
-EnumClipboardFormats(
-         UINT format);
-
-__declspec(dllimport)
-int
-__stdcall
-GetClipboardFormatNameA(
-         UINT format,
-         LPSTR lpszFormatName,
-         int cchMaxCount);
-__declspec(dllimport)
-int
-__stdcall
-GetClipboardFormatNameW(
-         UINT format,
-         LPWSTR lpszFormatName,
-         int cchMaxCount);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EmptyClipboard(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsClipboardFormatAvailable(
-         UINT format);
-
-__declspec(dllimport)
-int
-__stdcall
-GetPriorityClipboardFormat(
-           UINT *paFormatPriorityList,
-         int cFormats);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetOpenClipboardWindow(
-    void);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CharToOemA(
-         LPCSTR lpszSrc,
-         LPSTR lpszDst);
-__declspec(dllimport)
-BOOL
-__stdcall
-CharToOemW(
-         LPCWSTR lpszSrc,
-         LPSTR lpszDst);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OemToCharA(
-         LPCSTR lpszSrc,
-         LPSTR lpszDst);
-__declspec(dllimport)
-BOOL
-__stdcall
-OemToCharW(
-         LPCSTR lpszSrc,
-         LPWSTR lpszDst);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CharToOemBuffA(
-         LPCSTR lpszSrc,
-         LPSTR lpszDst,
-         DWORD cchDstLength);
-__declspec(dllimport)
-BOOL
-__stdcall
-CharToOemBuffW(
-         LPCWSTR lpszSrc,
-         LPSTR lpszDst,
-         DWORD cchDstLength);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OemToCharBuffA(
-         LPCSTR lpszSrc,
-         LPSTR lpszDst,
-         DWORD cchDstLength);
-__declspec(dllimport)
-BOOL
-__stdcall
-OemToCharBuffW(
-         LPCSTR lpszSrc,
-         LPWSTR lpszDst,
-         DWORD cchDstLength);
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharUpperA(
-         LPSTR lpsz);
-__declspec(dllimport)
-LPWSTR
-__stdcall
-CharUpperW(
-         LPWSTR lpsz);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CharUpperBuffA(
-           LPSTR lpsz,
-         DWORD cchLength);
-__declspec(dllimport)
-DWORD
-__stdcall
-CharUpperBuffW(
-           LPWSTR lpsz,
-         DWORD cchLength);
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharLowerA(
-         LPSTR lpsz);
-__declspec(dllimport)
-LPWSTR
-__stdcall
-CharLowerW(
-         LPWSTR lpsz);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CharLowerBuffA(
-           LPSTR lpsz,
-         DWORD cchLength);
-__declspec(dllimport)
-DWORD
-__stdcall
-CharLowerBuffW(
-           LPWSTR lpsz,
-         DWORD cchLength);
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharNextA(
-         LPCSTR lpsz);
-__declspec(dllimport)
-LPWSTR
-__stdcall
-CharNextW(
-         LPCWSTR lpsz);
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharPrevA(
-         LPCSTR lpszStart,
-         LPCSTR lpszCurrent);
-__declspec(dllimport)
-LPWSTR
-__stdcall
-CharPrevW(
-         LPCWSTR lpszStart,
-         LPCWSTR lpszCurrent);
-
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharNextExA(
-          WORD CodePage,
-          LPCSTR lpCurrentChar,
-          DWORD dwFlags);
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharPrevExA(
-          WORD CodePage,
-          LPCSTR lpStart,
-          LPCSTR lpCurrentChar,
-          DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharAlphaA(
-         CHAR ch);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharAlphaW(
-         WCHAR ch);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharAlphaNumericA(
-         CHAR ch);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharAlphaNumericW(
-         WCHAR ch);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharUpperA(
-         CHAR ch);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharUpperW(
-         WCHAR ch);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharLowerA(
-         CHAR ch);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharLowerW(
-         WCHAR ch);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetFocus(
-           HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetActiveWindow(
-    void);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetFocus(
-    void);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetKBCodePage(
-    void);
-
-__declspec(dllimport)
-SHORT
-__stdcall
-GetKeyState(
-         int nVirtKey);
-
-__declspec(dllimport)
-SHORT
-__stdcall
-GetAsyncKeyState(
-         int vKey);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetKeyboardState(
-         PBYTE lpKeyState);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetKeyboardState(
-           LPBYTE lpKeyState);
-
-__declspec(dllimport)
-int
-__stdcall
-GetKeyNameTextA(
-         LONG lParam,
-         LPSTR lpString,
-         int cchSize);
-__declspec(dllimport)
-int
-__stdcall
-GetKeyNameTextW(
-         LONG lParam,
-         LPWSTR lpString,
-         int cchSize);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetKeyboardType(
-         int nTypeFlag);
-
-__declspec(dllimport)
-int
-__stdcall
-ToAscii(
-         UINT uVirtKey,
-         UINT uScanCode,
-             const BYTE *lpKeyState,
-         LPWORD lpChar,
-         UINT uFlags);
-
-
-__declspec(dllimport)
-int
-__stdcall
-ToAsciiEx(
-         UINT uVirtKey,
-         UINT uScanCode,
-             const BYTE *lpKeyState,
-         LPWORD lpChar,
-         UINT uFlags,
-           HKL dwhkl);
-
-
-__declspec(dllimport)
-int
-__stdcall
-ToUnicode(
-         UINT wVirtKey,
-         UINT wScanCode,
-             const BYTE *lpKeyState,
-         LPWSTR pwszBuff,
-         int cchBuff,
-         UINT wFlags);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-OemKeyScan(
-         WORD wOemChar);
-
-__declspec(dllimport)
-SHORT
-__stdcall
-VkKeyScanA(
-         CHAR ch);
-__declspec(dllimport)
-SHORT
-__stdcall
-VkKeyScanW(
-         WCHAR ch);
-
-
-
-
-
-
-
-__declspec(dllimport)
-SHORT
-__stdcall
-VkKeyScanExA(
-         CHAR ch,
-         HKL dwhkl);
-__declspec(dllimport)
-SHORT
-__stdcall
-VkKeyScanExW(
-         WCHAR ch,
-         HKL dwhkl);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-keybd_event(
-         BYTE bVk,
-         BYTE bScan,
-         DWORD dwFlags,
-         ULONG_PTR dwExtraInfo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-mouse_event(
-         DWORD dwFlags,
-         DWORD dx,
-         DWORD dy,
-         DWORD dwData,
-         ULONG_PTR dwExtraInfo);
-
-
-
-typedef struct tagMOUSEINPUT {
-    LONG    dx;
-    LONG    dy;
-    DWORD   mouseData;
-    DWORD   dwFlags;
-    DWORD   time;
-    ULONG_PTR dwExtraInfo;
-} MOUSEINPUT, *PMOUSEINPUT, * LPMOUSEINPUT;
-
-typedef struct tagKEYBDINPUT {
-    WORD    wVk;
-    WORD    wScan;
-    DWORD   dwFlags;
-    DWORD   time;
-    ULONG_PTR dwExtraInfo;
-} KEYBDINPUT, *PKEYBDINPUT, * LPKEYBDINPUT;
-
-typedef struct tagHARDWAREINPUT {
-    DWORD   uMsg;
-    WORD    wParamL;
-    WORD    wParamH;
-} HARDWAREINPUT, *PHARDWAREINPUT, * LPHARDWAREINPUT;
-
-
-
-
-
-typedef struct tagINPUT {
-    DWORD   type;
-
-    union
-    {
-        MOUSEINPUT      mi;
-        KEYBDINPUT      ki;
-        HARDWAREINPUT   hi;
-    };
-} INPUT, *PINPUT, * LPINPUT;
-
-__declspec(dllimport)
-UINT
-__stdcall
-SendInput(
-         UINT cInputs,                     
-           LPINPUT pInputs,  
-         int cbSize);                      
-
-
-
-
-typedef struct tagLASTINPUTINFO {
-    UINT cbSize;
-    DWORD dwTime;
-} LASTINPUTINFO, * PLASTINPUTINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetLastInputInfo(
-         PLASTINPUTINFO plii);
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-MapVirtualKeyA(
-         UINT uCode,
-         UINT uMapType);
-__declspec(dllimport)
-UINT
-__stdcall
-MapVirtualKeyW(
-         UINT uCode,
-         UINT uMapType);
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-MapVirtualKeyExA(
-         UINT uCode,
-         UINT uMapType,
-           HKL dwhkl);
-__declspec(dllimport)
-UINT
-__stdcall
-MapVirtualKeyExW(
-         UINT uCode,
-         UINT uMapType,
-           HKL dwhkl);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetInputState(
-    void);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetQueueStatus(
-         UINT flags);
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetCapture(
-    void);
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetCapture(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReleaseCapture(
-    void);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-MsgWaitForMultipleObjects(
-         DWORD nCount,
-             const HANDLE *pHandles,
-         BOOL fWaitAll,
-         DWORD dwMilliseconds,
-         DWORD dwWakeMask);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-MsgWaitForMultipleObjectsEx(
-         DWORD nCount,
-             const HANDLE *pHandles,
-         DWORD dwMilliseconds,
-         DWORD dwWakeMask,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT_PTR
-__stdcall
-SetTimer(
-           HWND hWnd,
-         UINT_PTR nIDEvent,
-         UINT uElapse,
-           TIMERPROC lpTimerFunc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-KillTimer(
-           HWND hWnd,
-         UINT_PTR uIDEvent);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWindowUnicode(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnableWindow(
-         HWND hWnd,
-         BOOL bEnable);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWindowEnabled(
-         HWND hWnd);
-
-__declspec(dllimport)
-HACCEL
-__stdcall
-LoadAcceleratorsA(
-           HINSTANCE hInstance,
-         LPCSTR lpTableName);
-__declspec(dllimport)
-HACCEL
-__stdcall
-LoadAcceleratorsW(
-           HINSTANCE hInstance,
-         LPCWSTR lpTableName);
-
-
-
-
-
-
-__declspec(dllimport)
-HACCEL
-__stdcall
-CreateAcceleratorTableA(
-           LPACCEL paccel, 
-         int cAccel);
-__declspec(dllimport)
-HACCEL
-__stdcall
-CreateAcceleratorTableW(
-           LPACCEL paccel, 
-         int cAccel);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyAcceleratorTable(
-         HACCEL hAccel);
-
-__declspec(dllimport)
-int
-__stdcall
-CopyAcceleratorTableA(
-         HACCEL hAccelSrc,
-             LPACCEL lpAccelDst,
-         int cAccelEntries);
-__declspec(dllimport)
-int
-__stdcall
-CopyAcceleratorTableW(
-         HACCEL hAccelSrc,
-             LPACCEL lpAccelDst,
-         int cAccelEntries);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-TranslateAcceleratorA(
-         HWND hWnd,
-         HACCEL hAccTable,
-         LPMSG lpMsg);
-__declspec(dllimport)
-int
-__stdcall
-TranslateAcceleratorW(
-         HWND hWnd,
-         HACCEL hAccTable,
-         LPMSG lpMsg);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetSystemMetrics(
-         int nIndex);
-
-
-
-
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-LoadMenuA(
-           HINSTANCE hInstance,
-         LPCSTR lpMenuName);
-__declspec(dllimport)
-HMENU
-__stdcall
-LoadMenuW(
-           HINSTANCE hInstance,
-         LPCWSTR lpMenuName);
-
-
-
-
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-LoadMenuIndirectA(
-         const MENUTEMPLATEA *lpMenuTemplate);
-__declspec(dllimport)
-HMENU
-__stdcall
-LoadMenuIndirectW(
-         const MENUTEMPLATEW *lpMenuTemplate);
-
-
-
-
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-GetMenu(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenu(
-         HWND hWnd,
-           HMENU hMenu);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeMenuA(
-         HMENU hMenu,
-         UINT cmd,
-           LPCSTR lpszNewItem,
-         UINT cmdInsert,
-         UINT flags);
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeMenuW(
-         HMENU hMenu,
-         UINT cmd,
-           LPCWSTR lpszNewItem,
-         UINT cmdInsert,
-         UINT flags);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HiliteMenuItem(
-         HWND hWnd,
-         HMENU hMenu,
-         UINT uIDHiliteItem,
-         UINT uHilite);
-
-__declspec(dllimport)
-int
-__stdcall
-GetMenuStringA(
-         HMENU hMenu,
-         UINT uIDItem,
-           LPSTR lpString,
-         int cchMax,
-         UINT flags);
-__declspec(dllimport)
-int
-__stdcall
-GetMenuStringW(
-         HMENU hMenu,
-         UINT uIDItem,
-           LPWSTR lpString,
-         int cchMax,
-         UINT flags);
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetMenuState(
-         HMENU hMenu,
-         UINT uId,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawMenuBar(
-         HWND hWnd);
-
-
-
-
-
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-GetSystemMenu(
-         HWND hWnd,
-         BOOL bRevert);
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-CreateMenu(
-    void);
-
-__declspec(dllimport)
-HMENU
-__stdcall
-CreatePopupMenu(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyMenu(
-         HMENU hMenu);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CheckMenuItem(
-         HMENU hMenu,
-         UINT uIDCheckItem,
-         UINT uCheck);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnableMenuItem(
-         HMENU hMenu,
-         UINT uIDEnableItem,
-         UINT uEnable);
-
-__declspec(dllimport)
-HMENU
-__stdcall
-GetSubMenu(
-         HMENU hMenu,
-         int nPos);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetMenuItemID(
-         HMENU hMenu,
-         int nPos);
-
-__declspec(dllimport)
-int
-__stdcall
-GetMenuItemCount(
-           HMENU hMenu);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InsertMenuA(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCSTR lpNewItem);
-__declspec(dllimport)
-BOOL
-__stdcall
-InsertMenuW(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCWSTR lpNewItem);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AppendMenuA(
-         HMENU hMenu,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCSTR lpNewItem);
-__declspec(dllimport)
-BOOL
-__stdcall
-AppendMenuW(
-         HMENU hMenu,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCWSTR lpNewItem);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ModifyMenuA(
-         HMENU hMnu,
-         UINT uPosition,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCSTR lpNewItem);
-__declspec(dllimport)
-BOOL
-__stdcall
-ModifyMenuW(
-         HMENU hMnu,
-         UINT uPosition,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCWSTR lpNewItem);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall RemoveMenu(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteMenu(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuItemBitmaps(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags,
-           HBITMAP hBitmapUnchecked,
-           HBITMAP hBitmapChecked);
-
-__declspec(dllimport)
-LONG
-__stdcall
-GetMenuCheckMarkDimensions(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TrackPopupMenu(
-         HMENU hMenu,
-         UINT uFlags,
-         int x,
-         int y,
-         int nReserved,
-         HWND hWnd,
-           const RECT *prcRect);
-
-
-
-
-
-
-
-
-typedef struct tagTPMPARAMS
-{
-    UINT    cbSize;     
-    RECT    rcExclude;  
-}   TPMPARAMS;
-typedef TPMPARAMS  *LPTPMPARAMS;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TrackPopupMenuEx(
-         HMENU,
-         UINT,
-         int,
-         int,
-         HWND,
-           LPTPMPARAMS);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMENUINFO
-{
-    DWORD   cbSize;
-    DWORD   fMask;
-    DWORD   dwStyle;
-    UINT    cyMax;
-    HBRUSH  hbrBack;
-    DWORD   dwContextHelpID;
-    ULONG_PTR dwMenuData;
-}   MENUINFO,  *LPMENUINFO;
-typedef MENUINFO const  *LPCMENUINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuInfo(
-         HMENU,
-         LPMENUINFO);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuInfo(
-         HMENU,
-         LPCMENUINFO);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndMenu(
-        void);
-
-
-
-
-
-
-
-typedef struct tagMENUGETOBJECTINFO
-{
-    DWORD dwFlags;
-    UINT uPos;
-    HMENU hmenu;
-    PVOID riid;
-    PVOID pvObj;
-} MENUGETOBJECTINFO, * PMENUGETOBJECTINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMENUITEMINFOA
-{
-    UINT     cbSize;
-    UINT     fMask;
-    UINT     fType;         
-    UINT     fState;        
-    UINT     wID;           
-    HMENU    hSubMenu;      
-    HBITMAP  hbmpChecked;   
-    HBITMAP  hbmpUnchecked; 
-    ULONG_PTR dwItemData;   
-    LPSTR    dwTypeData;    
-    UINT     cch;           
-
-    HBITMAP  hbmpItem;      
-
-}   MENUITEMINFOA,  *LPMENUITEMINFOA;
-typedef struct tagMENUITEMINFOW
-{
-    UINT     cbSize;
-    UINT     fMask;
-    UINT     fType;         
-    UINT     fState;        
-    UINT     wID;           
-    HMENU    hSubMenu;      
-    HBITMAP  hbmpChecked;   
-    HBITMAP  hbmpUnchecked; 
-    ULONG_PTR dwItemData;   
-    LPWSTR   dwTypeData;    
-    UINT     cch;           
-
-    HBITMAP  hbmpItem;      
-
-}   MENUITEMINFOW,  *LPMENUITEMINFOW;
-
-typedef MENUITEMINFOW MENUITEMINFO;
-typedef LPMENUITEMINFOW LPMENUITEMINFO;
-
-
-
-
-typedef MENUITEMINFOA const  *LPCMENUITEMINFOA;
-typedef MENUITEMINFOW const  *LPCMENUITEMINFOW;
-
-typedef LPCMENUITEMINFOW LPCMENUITEMINFO;
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InsertMenuItemA(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPosition,
-         LPCMENUITEMINFOA lpmi);
-__declspec(dllimport)
-BOOL
-__stdcall
-InsertMenuItemW(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPosition,
-         LPCMENUITEMINFOW lpmi);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuItemInfoA(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPosition,
-         LPMENUITEMINFOA lpmii);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuItemInfoW(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPosition,
-         LPMENUITEMINFOW lpmii);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuItemInfoA(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPositon,
-         LPCMENUITEMINFOA lpmii);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuItemInfoW(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPositon,
-         LPCMENUITEMINFOW lpmii);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetMenuDefaultItem(
-         HMENU hMenu,
-         UINT fByPos,
-         UINT gmdiFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuDefaultItem(
-         HMENU hMenu,
-         UINT uItem,
-         UINT fByPos);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuItemRect(
-           HWND hWnd,
-         HMENU hMenu,
-         UINT uItem,
-         LPRECT lprcItem);
-
-__declspec(dllimport)
-int
-__stdcall
-MenuItemFromPoint(
-           HWND hWnd,
-         HMENU hMenu,
-         POINT ptScreen);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDROPSTRUCT
-{
-    HWND    hwndSource;
-    HWND    hwndSink;
-    DWORD   wFmt;
-    ULONG_PTR dwData;
-    POINT   ptDrop;
-    DWORD   dwControlData;
-} DROPSTRUCT, *PDROPSTRUCT, *LPDROPSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-DragObject(
-         HWND hwndParent,
-         HWND hwndFrom,
-         UINT fmt,
-         ULONG_PTR data,
-           HCURSOR hcur);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DragDetect(
-         HWND hwnd,
-         POINT pt);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawIcon(
-         HDC hDC,
-         int X,
-         int Y,
-         HICON hIcon);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDRAWTEXTPARAMS
-{
-    UINT    cbSize;
-    int     iTabLength;
-    int     iLeftMargin;
-    int     iRightMargin;
-    UINT    uiLengthDrawn;
-} DRAWTEXTPARAMS,  *LPDRAWTEXTPARAMS;
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-DrawTextA(
-         HDC hdc,
-           LPCSTR lpchText,
-         int cchText,
-         LPRECT lprc,
-         UINT format);
-__declspec(dllimport)
-int
-__stdcall
-DrawTextW(
-         HDC hdc,
-           LPCWSTR lpchText,
-         int cchText,
-         LPRECT lprc,
-         UINT format);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-DrawTextExA(
-         HDC hdc,
-           LPSTR lpchText,
-         int cchText,
-         LPRECT lprc,
-         UINT format,
-           LPDRAWTEXTPARAMS lpdtp);
-__declspec(dllimport)
-int
-__stdcall
-DrawTextExW(
-         HDC hdc,
-           LPWSTR lpchText,
-         int cchText,
-         LPRECT lprc,
-         UINT format,
-           LPDRAWTEXTPARAMS lpdtp);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GrayStringA(
-         HDC hDC,
-           HBRUSH hBrush,
-           GRAYSTRINGPROC lpOutputFunc,
-         LPARAM lpData,
-         int nCount,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight);
-__declspec(dllimport)
-BOOL
-__stdcall
-GrayStringW(
-         HDC hDC,
-           HBRUSH hBrush,
-           GRAYSTRINGPROC lpOutputFunc,
-         LPARAM lpData,
-         int nCount,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawStateA(
-         HDC hdc,
-           HBRUSH hbrFore,
-           DRAWSTATEPROC qfnCallBack,
-         LPARAM lData,
-         WPARAM wData,
-         int x,
-         int y,
-         int cx,
-         int cy,
-         UINT uFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawStateW(
-         HDC hdc,
-           HBRUSH hbrFore,
-           DRAWSTATEPROC qfnCallBack,
-         LPARAM lData,
-         WPARAM wData,
-         int x,
-         int y,
-         int cx,
-         int cy,
-         UINT uFlags);
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-TabbedTextOutA(
-         HDC hdc,
-         int x,
-         int y,
-           LPCSTR lpString,
-         int chCount,
-         int nTabPositions,
-             const INT *lpnTabStopPositions,
-         int nTabOrigin);
-__declspec(dllimport)
-LONG
-__stdcall
-TabbedTextOutW(
-         HDC hdc,
-         int x,
-         int y,
-           LPCWSTR lpString,
-         int chCount,
-         int nTabPositions,
-             const INT *lpnTabStopPositions,
-         int nTabOrigin);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTabbedTextExtentA(
-         HDC hdc,
-           LPCSTR lpString,
-         int chCount,
-         int nTabPositions,
-             const INT *lpnTabStopPositions);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTabbedTextExtentW(
-         HDC hdc,
-           LPCWSTR lpString,
-         int chCount,
-         int nTabPositions,
-             const INT *lpnTabStopPositions);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateWindow(
-         HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetActiveWindow(
-         HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetForegroundWindow(
-    void);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PaintDesktop(
-         HDC hdc);
-
-__declspec(dllimport)
-void
-__stdcall
-SwitchToThisWindow(
-         HWND hwnd,
-         BOOL fUnknown);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetForegroundWindow(
-         HWND hWnd);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllowSetForegroundWindow(
-         DWORD dwProcessId);
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockSetForegroundWindow(
-         UINT uLockCode);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-WindowFromDC(
-         HDC hDC);
-
-__declspec(dllimport)
-HDC
-__stdcall
-GetDC(
-           HWND hWnd);
-
-__declspec(dllimport)
-HDC
-__stdcall
-GetDCEx(
-           HWND hWnd,
-           HRGN hrgnClip,
-         DWORD flags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HDC
-__stdcall
-GetWindowDC(
-           HWND hWnd);
-
-__declspec(dllimport)
-int
-__stdcall
-ReleaseDC(
-           HWND hWnd,
-         HDC hDC);
-
-__declspec(dllimport)
-HDC
-__stdcall
-BeginPaint(
-         HWND hWnd,
-         LPPAINTSTRUCT lpPaint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndPaint(
-         HWND hWnd,
-         const PAINTSTRUCT *lpPaint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUpdateRect(
-         HWND hWnd,
-           LPRECT lpRect,
-         BOOL bErase);
-
-__declspec(dllimport)
-int
-__stdcall
-GetUpdateRgn(
-         HWND hWnd,
-         HRGN hRgn,
-         BOOL bErase);
-
-__declspec(dllimport)
-int
-__stdcall
-SetWindowRgn(
-         HWND hWnd,
-           HRGN hRgn,
-         BOOL bRedraw);
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetWindowRgn(
-         HWND hWnd,
-         HRGN hRgn);
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetWindowRgnBox(
-         HWND hWnd,
-         LPRECT lprc);
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-ExcludeUpdateRgn(
-         HDC hDC,
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InvalidateRect(
-           HWND hWnd,
-           const RECT *lpRect,
-         BOOL bErase);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ValidateRect(
-           HWND hWnd,
-           const RECT *lpRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InvalidateRgn(
-         HWND hWnd,
-           HRGN hRgn,
-         BOOL bErase);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ValidateRgn(
-         HWND hWnd,
-           HRGN hRgn);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RedrawWindow(
-           HWND hWnd,
-           const RECT *lprcUpdate,
-           HRGN hrgnUpdate,
-         UINT flags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockWindowUpdate(
-           HWND hWndLock);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ScrollWindow(
-         HWND hWnd,
-         int XAmount,
-         int YAmount,
-           const RECT *lpRect,
-           const RECT *lpClipRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ScrollDC(
-         HDC hDC,
-         int dx,
-         int dy,
-           const RECT *lprcScroll,
-           const RECT *lprcClip,
-           HRGN hrgnUpdate,
-           LPRECT lprcUpdate);
-
-__declspec(dllimport)
-int
-__stdcall
-ScrollWindowEx(
-         HWND hWnd,
-         int dx,
-         int dy,
-           const RECT *prcScroll,
-           const RECT *prcClip,
-           HRGN hrgnUpdate,
-           LPRECT prcUpdate,
-         UINT flags);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-SetScrollPos(
-         HWND hWnd,
-         int nBar,
-         int nPos,
-         BOOL bRedraw);
-
-__declspec(dllimport)
-int
-__stdcall
-GetScrollPos(
-         HWND hWnd,
-         int nBar);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetScrollRange(
-         HWND hWnd,
-         int nBar,
-         int nMinPos,
-         int nMaxPos,
-         BOOL bRedraw);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetScrollRange(
-         HWND hWnd,
-         int nBar,
-         LPINT lpMinPos,
-         LPINT lpMaxPos);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowScrollBar(
-         HWND hWnd,
-         int wBar,
-         BOOL bShow);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnableScrollBar(
-         HWND hWnd,
-         UINT wSBflags,
-         UINT wArrows);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPropA(
-         HWND hWnd,
-         LPCSTR lpString,
-           HANDLE hData);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPropW(
-         HWND hWnd,
-         LPCWSTR lpString,
-           HANDLE hData);
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-GetPropA(
-         HWND hWnd,
-         LPCSTR lpString);
-__declspec(dllimport)
-HANDLE
-__stdcall
-GetPropW(
-         HWND hWnd,
-         LPCWSTR lpString);
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-RemovePropA(
-         HWND hWnd,
-         LPCSTR lpString);
-__declspec(dllimport)
-HANDLE
-__stdcall
-RemovePropW(
-         HWND hWnd,
-         LPCWSTR lpString);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-EnumPropsExA(
-         HWND hWnd,
-         PROPENUMPROCEXA lpEnumFunc,
-         LPARAM lParam);
-__declspec(dllimport)
-int
-__stdcall
-EnumPropsExW(
-         HWND hWnd,
-         PROPENUMPROCEXW lpEnumFunc,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-EnumPropsA(
-         HWND hWnd,
-         PROPENUMPROCA lpEnumFunc);
-__declspec(dllimport)
-int
-__stdcall
-EnumPropsW(
-         HWND hWnd,
-         PROPENUMPROCW lpEnumFunc);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowTextA(
-         HWND hWnd,
-           LPCSTR lpString);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowTextW(
-         HWND hWnd,
-           LPCWSTR lpString);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetWindowTextA(
-         HWND hWnd,
-         LPSTR lpString,
-         int nMaxCount);
-__declspec(dllimport)
-int
-__stdcall
-GetWindowTextW(
-         HWND hWnd,
-         LPWSTR lpString,
-         int nMaxCount);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetWindowTextLengthA(
-         HWND hWnd);
-__declspec(dllimport)
-int
-__stdcall
-GetWindowTextLengthW(
-         HWND hWnd);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClientRect(
-         HWND hWnd,
-         LPRECT lpRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetWindowRect(
-         HWND hWnd,
-         LPRECT lpRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AdjustWindowRect(
-         LPRECT lpRect,
-         DWORD dwStyle,
-         BOOL bMenu);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AdjustWindowRectEx(
-         LPRECT lpRect,
-         DWORD dwStyle,
-         BOOL bMenu,
-         DWORD dwExStyle);
-
-
-
-
-
-typedef struct tagHELPINFO      
-{
-    UINT    cbSize;             
-    int     iContextType;       
-    int     iCtrlId;            
-    HANDLE  hItemHandle;        
-    DWORD_PTR dwContextId;      
-    POINT   MousePos;           
-}  HELPINFO,  *LPHELPINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowContextHelpId(
-         HWND,
-         DWORD);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetWindowContextHelpId(
-         HWND);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuContextHelpId(
-         HMENU,
-         DWORD);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetMenuContextHelpId(
-         HMENU);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxA(
-           HWND hWnd,
-           LPCSTR lpText,
-           LPCSTR lpCaption,
-         UINT uType);
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxW(
-           HWND hWnd,
-           LPCWSTR lpText,
-           LPCWSTR lpCaption,
-         UINT uType);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxExA(
-           HWND hWnd,
-           LPCSTR lpText,
-           LPCSTR lpCaption,
-         UINT uType,
-         WORD wLanguageId);
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxExW(
-           HWND hWnd,
-           LPCWSTR lpText,
-           LPCWSTR lpCaption,
-         UINT uType,
-         WORD wLanguageId);
-
-
-
-
-
-
-
-
-typedef void (__stdcall *MSGBOXCALLBACK)(LPHELPINFO lpHelpInfo);
-
-typedef struct tagMSGBOXPARAMSA
-{
-    UINT        cbSize;
-    HWND        hwndOwner;
-    HINSTANCE   hInstance;
-    LPCSTR      lpszText;
-    LPCSTR      lpszCaption;
-    DWORD       dwStyle;
-    LPCSTR      lpszIcon;
-    DWORD_PTR   dwContextHelpId;
-    MSGBOXCALLBACK      lpfnMsgBoxCallback;
-    DWORD       dwLanguageId;
-} MSGBOXPARAMSA, *PMSGBOXPARAMSA, *LPMSGBOXPARAMSA;
-typedef struct tagMSGBOXPARAMSW
-{
-    UINT        cbSize;
-    HWND        hwndOwner;
-    HINSTANCE   hInstance;
-    LPCWSTR     lpszText;
-    LPCWSTR     lpszCaption;
-    DWORD       dwStyle;
-    LPCWSTR     lpszIcon;
-    DWORD_PTR   dwContextHelpId;
-    MSGBOXCALLBACK      lpfnMsgBoxCallback;
-    DWORD       dwLanguageId;
-} MSGBOXPARAMSW, *PMSGBOXPARAMSW, *LPMSGBOXPARAMSW;
-
-typedef MSGBOXPARAMSW MSGBOXPARAMS;
-typedef PMSGBOXPARAMSW PMSGBOXPARAMS;
-typedef LPMSGBOXPARAMSW LPMSGBOXPARAMS;
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxIndirectA(
-         const MSGBOXPARAMSA * lpmbp);
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxIndirectW(
-         const MSGBOXPARAMSW * lpmbp);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MessageBeep(
-         UINT uType);
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-ShowCursor(
-         BOOL bShow);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCursorPos(
-         int X,
-         int Y);
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-SetCursor(
-           HCURSOR hCursor);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCursorPos(
-         LPPOINT lpPoint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClipCursor(
-           const RECT *lpRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClipCursor(
-         LPRECT lpRect);
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-GetCursor(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateCaret(
-         HWND hWnd,
-           HBITMAP hBitmap,
-         int nWidth,
-         int nHeight);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetCaretBlinkTime(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCaretBlinkTime(
-         UINT uMSeconds);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyCaret(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HideCaret(
-           HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowCaret(
-           HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCaretPos(
-         int X,
-         int Y);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCaretPos(
-         LPPOINT lpPoint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClientToScreen(
-         HWND hWnd,
-         LPPOINT lpPoint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ScreenToClient(
-         HWND hWnd,
-         LPPOINT lpPoint);
-
-__declspec(dllimport)
-int
-__stdcall
-MapWindowPoints(
-           HWND hWndFrom,
-           HWND hWndTo,
-           LPPOINT lpPoints,
-         UINT cPoints);
-
-__declspec(dllimport)
-HWND
-__stdcall
-WindowFromPoint(
-         POINT Point);
-
-__declspec(dllimport)
-HWND
-__stdcall
-ChildWindowFromPoint(
-         HWND hWndParent,
-         POINT Point);
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-ChildWindowFromPointEx(
-         HWND hwnd,
-         POINT pt,
-         UINT flags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetSysColor(
-         int nIndex);
-
-
-__declspec(dllimport)
-HBRUSH
-__stdcall
-GetSysColorBrush(
-         int nIndex);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSysColors(
-         int cElements,
-           const INT * lpaElements,
-           const COLORREF * lpaRgbValues);
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawFocusRect(
-         HDC hDC,
-         const RECT * lprc);
-
-__declspec(dllimport)
-int
-__stdcall
-FillRect(
-         HDC hDC,
-         const RECT *lprc,
-         HBRUSH hbr);
-
-__declspec(dllimport)
-int
-__stdcall
-FrameRect(
-         HDC hDC,
-         const RECT *lprc,
-         HBRUSH hbr);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InvertRect(
-         HDC hDC,
-         const RECT *lprc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetRect(
-         LPRECT lprc,
-         int xLeft,
-         int yTop,
-         int xRight,
-         int yBottom);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetRectEmpty(
-         LPRECT lprc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyRect(
-         LPRECT lprcDst,
-         const RECT *lprcSrc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InflateRect(
-         LPRECT lprc,
-         int dx,
-         int dy);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IntersectRect(
-         LPRECT lprcDst,
-         const RECT *lprcSrc1,
-         const RECT *lprcSrc2);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnionRect(
-         LPRECT lprcDst,
-         const RECT *lprcSrc1,
-         const RECT *lprcSrc2);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SubtractRect(
-         LPRECT lprcDst,
-         const RECT *lprcSrc1,
-         const RECT *lprcSrc2);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OffsetRect(
-         LPRECT lprc,
-         int dx,
-         int dy);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsRectEmpty(
-         const RECT *lprc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EqualRect(
-         const RECT *lprc1,
-         const RECT *lprc2);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PtInRect(
-         const RECT *lprc,
-         POINT pt);
-
-
-
-__declspec(dllimport)
-WORD
-__stdcall
-GetWindowWord(
-         HWND hWnd,
-         int nIndex);
-
-__declspec(dllimport)
-WORD
-__stdcall
-SetWindowWord(
-         HWND hWnd,
-         int nIndex,
-         WORD wNewWord);
-
-__declspec(dllimport)
-LONG
-__stdcall
-GetWindowLongA(
-         HWND hWnd,
-         int nIndex);
-__declspec(dllimport)
-LONG
-__stdcall
-GetWindowLongW(
-         HWND hWnd,
-         int nIndex);
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-SetWindowLongA(
-         HWND hWnd,
-         int nIndex,
-         LONG dwNewLong);
-__declspec(dllimport)
-LONG
-__stdcall
-SetWindowLongW(
-         HWND hWnd,
-         int nIndex,
-         LONG dwNewLong);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-WORD
-__stdcall
-GetClassWord(
-         HWND hWnd,
-         int nIndex);
-
-__declspec(dllimport)
-WORD
-__stdcall
-SetClassWord(
-         HWND hWnd,
-         int nIndex,
-         WORD wNewWord);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetClassLongA(
-         HWND hWnd,
-         int nIndex);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetClassLongW(
-         HWND hWnd,
-         int nIndex);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetClassLongA(
-         HWND hWnd,
-         int nIndex,
-         LONG dwNewLong);
-__declspec(dllimport)
-DWORD
-__stdcall
-SetClassLongW(
-         HWND hWnd,
-         int nIndex,
-         LONG dwNewLong);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessDefaultLayout(
-         DWORD *pdwDefaultLayout);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessDefaultLayout(
-         DWORD dwDefaultLayout);
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetDesktopWindow(
-    void);
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetParent(
-         HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetParent(
-         HWND hWndChild,
-           HWND hWndNewParent);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumChildWindows(
-           HWND hWndParent,
-         WNDENUMPROC lpEnumFunc,
-         LPARAM lParam);
-
-__declspec(dllimport)
-HWND
-__stdcall
-FindWindowA(
-           LPCSTR lpClassName,
-           LPCSTR lpWindowName);
-__declspec(dllimport)
-HWND
-__stdcall
-FindWindowW(
-           LPCWSTR lpClassName,
-           LPCWSTR lpWindowName);
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-FindWindowExA(
-           HWND hWndParent,
-           HWND hWndChildAfter,
-           LPCSTR lpszClass,
-           LPCSTR lpszWindow);
-__declspec(dllimport)
-HWND
-__stdcall
-FindWindowExW(
-           HWND hWndParent,
-           HWND hWndChildAfter,
-           LPCWSTR lpszClass,
-           LPCWSTR lpszWindow);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetShellWindow(
-    void);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RegisterShellHookWindow(
-         HWND hwnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeregisterShellHookWindow(
-         HWND hwnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumWindows(
-         WNDENUMPROC lpEnumFunc,
-         LPARAM lParam);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumThreadWindows(
-         DWORD dwThreadId,
-         WNDENUMPROC lpfn,
-         LPARAM lParam);
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetClassNameA(
-         HWND hWnd,
-           LPSTR lpClassName,
-         int nMaxCount
-    );
-__declspec(dllimport)
-int
-__stdcall
-GetClassNameW(
-         HWND hWnd,
-           LPWSTR lpClassName,
-         int nMaxCount
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetTopWindow(
-           HWND hWnd);
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetWindowThreadProcessId(
-         HWND hWnd,
-           LPDWORD lpdwProcessId);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsGUIThread(
-         BOOL bConvert);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetLastActivePopup(
-         HWND hWnd);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetWindow(
-         HWND hWnd,
-         UINT uCmd);
-
-
-
-
-
-
-__declspec(dllimport)
-HHOOK
-__stdcall
-SetWindowsHookA(
-         int nFilterType,
-         HOOKPROC pfnFilterProc);
-__declspec(dllimport)
-HHOOK
-__stdcall
-SetWindowsHookW(
-         int nFilterType,
-         HOOKPROC pfnFilterProc);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnhookWindowsHook(
-         int nCode,
-         HOOKPROC pfnFilterProc);
-
-__declspec(dllimport)
-HHOOK
-__stdcall
-SetWindowsHookExA(
-         int idHook,
-         HOOKPROC lpfn,
-           HINSTANCE hmod,
-         DWORD dwThreadId);
-__declspec(dllimport)
-HHOOK
-__stdcall
-SetWindowsHookExW(
-         int idHook,
-         HOOKPROC lpfn,
-           HINSTANCE hmod,
-         DWORD dwThreadId);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnhookWindowsHookEx(
-         HHOOK hhk);
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-CallNextHookEx(
-           HHOOK hhk,
-         int nCode,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckMenuRadioItem(
-         HMENU hmenu,
-         UINT first,
-         UINT last,
-         UINT check,
-         UINT flags);
-
-
-
-
-
-typedef struct {
-    WORD versionNumber;
-    WORD offset;
-} MENUITEMTEMPLATEHEADER, *PMENUITEMTEMPLATEHEADER;
-
-typedef struct {        
-    WORD mtOption;
-    WORD mtID;
-    WCHAR mtString[1];
-} MENUITEMTEMPLATE, *PMENUITEMTEMPLATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HBITMAP
-__stdcall
-LoadBitmapA(
-           HINSTANCE hInstance,
-         LPCSTR lpBitmapName);
-__declspec(dllimport)
-HBITMAP
-__stdcall
-LoadBitmapW(
-           HINSTANCE hInstance,
-         LPCWSTR lpBitmapName);
-
-
-
-
-
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-LoadCursorA(
-           HINSTANCE hInstance,
-         LPCSTR lpCursorName);
-__declspec(dllimport)
-HCURSOR
-__stdcall
-LoadCursorW(
-           HINSTANCE hInstance,
-         LPCWSTR lpCursorName);
-
-
-
-
-
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-LoadCursorFromFileA(
-         LPCSTR lpFileName);
-__declspec(dllimport)
-HCURSOR
-__stdcall
-LoadCursorFromFileW(
-         LPCWSTR lpFileName);
-
-
-
-
-
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-CreateCursor(
-           HINSTANCE hInst,
-         int xHotSpot,
-         int yHotSpot,
-         int nWidth,
-         int nHeight,
-         const void *pvANDPlane,
-         const void *pvXORPlane);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyCursor(
-         HCURSOR hCursor);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSystemCursor(
-         HCURSOR hcur,
-         DWORD id);
-
-typedef struct _ICONINFO {
-    BOOL    fIcon;
-    DWORD   xHotspot;
-    DWORD   yHotspot;
-    HBITMAP hbmMask;
-    HBITMAP hbmColor;
-} ICONINFO;
-typedef ICONINFO *PICONINFO;
-
-__declspec(dllimport)
-HICON
-__stdcall
-LoadIconA(
-           HINSTANCE hInstance,
-         LPCSTR lpIconName);
-__declspec(dllimport)
-HICON
-__stdcall
-LoadIconW(
-           HINSTANCE hInstance,
-         LPCWSTR lpIconName);
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-PrivateExtractIconsA(
-         LPCSTR szFileName,
-         int nIconIndex,
-         int cxIcon,
-         int cyIcon,
-             HICON *phicon,
-             UINT *piconid,
-         UINT nIcons,
-         UINT flags);
-__declspec(dllimport)
-UINT
-__stdcall
-PrivateExtractIconsW(
-         LPCWSTR szFileName,
-         int nIconIndex,
-         int cxIcon,
-         int cyIcon,
-             HICON *phicon,
-             UINT *piconid,
-         UINT nIcons,
-         UINT flags);
-
-
-
-
-
-
-__declspec(dllimport)
-HICON
-__stdcall
-CreateIcon(
-           HINSTANCE hInstance,
-         int nWidth,
-         int nHeight,
-         BYTE cPlanes,
-         BYTE cBitsPixel,
-         const BYTE *lpbANDbits,
-         const BYTE *lpbXORbits);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyIcon(
-         HICON hIcon);
-
-__declspec(dllimport)
-int
-__stdcall
-LookupIconIdFromDirectory(
-         PBYTE presbits,
-         BOOL fIcon);
-
-
-__declspec(dllimport)
-int
-__stdcall
-LookupIconIdFromDirectoryEx(
-         PBYTE presbits,
-         BOOL fIcon,
-         int cxDesired,
-         int cyDesired,
-         UINT Flags);
-
-
-__declspec(dllimport)
-HICON
-__stdcall
-CreateIconFromResource(
-         PBYTE presbits,
-         DWORD dwResSize,
-         BOOL fIcon,
-         DWORD dwVer);
-
-
-__declspec(dllimport)
-HICON
-__stdcall
-CreateIconFromResourceEx(
-         PBYTE presbits,
-         DWORD dwResSize,
-         BOOL fIcon,
-         DWORD dwVer,
-         int cxDesired,
-         int cyDesired,
-         UINT Flags);
-
-
-typedef struct tagCURSORSHAPE
-{
-    int     xHotSpot;
-    int     yHotSpot;
-    int     cx;
-    int     cy;
-    int     cbWidth;
-    BYTE    Planes;
-    BYTE    BitsPixel;
-} CURSORSHAPE,  *LPCURSORSHAPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-LoadImageA(
-           HINSTANCE hInst,
-         LPCSTR name,
-         UINT type,
-         int cx,
-         int cy,
-         UINT fuLoad);
-__declspec(dllimport)
-HANDLE
-__stdcall
-LoadImageW(
-           HINSTANCE hInst,
-         LPCWSTR name,
-         UINT type,
-         int cx,
-         int cy,
-         UINT fuLoad);
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-CopyImage(
-         HANDLE h,
-         UINT type,
-         int cx,
-         int cy,
-         UINT flags);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall DrawIconEx(
-         HDC hdc,
-         int xLeft,
-         int yTop,
-         HICON hIcon,
-         int cxWidth,
-         int cyWidth,
-         UINT istepIfAniCur,
-           HBRUSH hbrFlickerFreeDraw,
-         UINT diFlags);
-
-
-
-__declspec(dllimport)
-HICON
-__stdcall
-CreateIconIndirect(
-         PICONINFO piconinfo);
-
-__declspec(dllimport)
-HICON
-__stdcall
-CopyIcon(
-         HICON hIcon);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetIconInfo(
-         HICON hIcon,
-         PICONINFO piconinfo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-LoadStringA(
-           HINSTANCE hInstance,
-         UINT uID,
-         LPSTR lpBuffer,
-         int cchBufferMax);
-__declspec(dllimport)
-int
-__stdcall
-LoadStringW(
-           HINSTANCE hInstance,
-         UINT uID,
-         LPWSTR lpBuffer,
-         int cchBufferMax);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDialogMessageA(
-         HWND hDlg,
-         LPMSG lpMsg);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDialogMessageW(
-         HWND hDlg,
-         LPMSG lpMsg);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MapDialogRect(
-         HWND hDlg,
-         LPRECT lpRect);
-
-__declspec(dllimport)
-int
-__stdcall
-DlgDirListA(
-         HWND hDlg,
-         LPSTR lpPathSpec,
-         int nIDListBox,
-         int nIDStaticPath,
-         UINT uFileType);
-__declspec(dllimport)
-int
-__stdcall
-DlgDirListW(
-         HWND hDlg,
-         LPWSTR lpPathSpec,
-         int nIDListBox,
-         int nIDStaticPath,
-         UINT uFileType);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DlgDirSelectExA(
-         HWND hwndDlg,
-         LPSTR lpString,
-         int chCount,
-         int idListBox);
-__declspec(dllimport)
-BOOL
-__stdcall
-DlgDirSelectExW(
-         HWND hwndDlg,
-         LPWSTR lpString,
-         int chCount,
-         int idListBox);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-DlgDirListComboBoxA(
-         HWND hDlg,
-         LPSTR lpPathSpec,
-         int nIDComboBox,
-         int nIDStaticPath,
-         UINT uFiletype);
-__declspec(dllimport)
-int
-__stdcall
-DlgDirListComboBoxW(
-         HWND hDlg,
-         LPWSTR lpPathSpec,
-         int nIDComboBox,
-         int nIDStaticPath,
-         UINT uFiletype);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DlgDirSelectComboBoxExA(
-         HWND hwndDlg,
-         LPSTR lpString,
-         int cchOut,
-         int idComboBox);
-__declspec(dllimport)
-BOOL
-__stdcall
-DlgDirSelectComboBoxExW(
-         HWND hwndDlg,
-         LPWSTR lpString,
-         int cchOut,
-         int idComboBox);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSCROLLINFO
-{
-    UINT    cbSize;
-    UINT    fMask;
-    int     nMin;
-    int     nMax;
-    UINT    nPage;
-    int     nPos;
-    int     nTrackPos;
-}   SCROLLINFO,  *LPSCROLLINFO;
-typedef SCROLLINFO const  *LPCSCROLLINFO;
-
-__declspec(dllimport)
-int
-__stdcall
-SetScrollInfo(
-         HWND hwnd,
-         int nBar,
-         LPCSCROLLINFO lpsi,
-         BOOL redraw);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetScrollInfo(
-         HWND hwnd,
-         int nBar,
-         LPSCROLLINFO lpsi);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMDICREATESTRUCTA {
-    LPCSTR   szClass;
-    LPCSTR   szTitle;
-    HANDLE hOwner;
-    int x;
-    int y;
-    int cx;
-    int cy;
-    DWORD style;
-    LPARAM lParam;        
-} MDICREATESTRUCTA, *LPMDICREATESTRUCTA;
-typedef struct tagMDICREATESTRUCTW {
-    LPCWSTR  szClass;
-    LPCWSTR  szTitle;
-    HANDLE hOwner;
-    int x;
-    int y;
-    int cx;
-    int cy;
-    DWORD style;
-    LPARAM lParam;        
-} MDICREATESTRUCTW, *LPMDICREATESTRUCTW;
-
-typedef MDICREATESTRUCTW MDICREATESTRUCT;
-typedef LPMDICREATESTRUCTW LPMDICREATESTRUCT;
-
-
-
-
-
-typedef struct tagCLIENTCREATESTRUCT {
-    HANDLE hWindowMenu;
-    UINT idFirstChild;
-} CLIENTCREATESTRUCT, *LPCLIENTCREATESTRUCT;
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-DefFrameProcA(
-         HWND hWnd,
-           HWND hWndMDIClient,
-         UINT uMsg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-LRESULT
-__stdcall
-DefFrameProcW(
-         HWND hWnd,
-           HWND hWndMDIClient,
-         UINT uMsg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefMDIChildProcA(
-         HWND hWnd,
-         UINT uMsg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefMDIChildProcW(
-         HWND hWnd,
-         UINT uMsg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TranslateMDISysAccel(
-         HWND hWndClient,
-         LPMSG lpMsg);
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-ArrangeIconicWindows(
-         HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-CreateMDIWindowA(
-         LPCSTR lpClassName,
-         LPCSTR lpWindowName,
-         DWORD dwStyle,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-           HWND hWndParent,
-           HINSTANCE hInstance,
-         LPARAM lParam);
-__declspec(dllimport)
-HWND
-__stdcall
-CreateMDIWindowW(
-         LPCWSTR lpClassName,
-         LPCWSTR lpWindowName,
-         DWORD dwStyle,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-           HWND hWndParent,
-           HINSTANCE hInstance,
-         LPARAM lParam);
-
-
-
-
-
-
-
-__declspec(dllimport) 
-WORD 
-__stdcall 
-TileWindows(
-           HWND hwndParent,
-         UINT wHow,
-           const RECT * lpRect,
-         UINT cKids,
-             const HWND  * lpKids);
-
-__declspec(dllimport)
-WORD
-__stdcall CascadeWindows(
-           HWND hwndParent,
-         UINT wHow,
-           const RECT * lpRect,
-         UINT cKids,
-             const HWND  * lpKids);
-
-
-
-
-
-
-
-
-
-
-typedef DWORD HELPPOLY;
-typedef struct tagMULTIKEYHELPA {
-
-    DWORD  mkSize;
-
-
-
-    CHAR   mkKeylist;
-    CHAR   szKeyphrase[1];
-} MULTIKEYHELPA, *PMULTIKEYHELPA, *LPMULTIKEYHELPA;
-typedef struct tagMULTIKEYHELPW {
-
-    DWORD  mkSize;
-
-
-
-    WCHAR  mkKeylist;
-    WCHAR  szKeyphrase[1];
-} MULTIKEYHELPW, *PMULTIKEYHELPW, *LPMULTIKEYHELPW;
-
-typedef MULTIKEYHELPW MULTIKEYHELP;
-typedef PMULTIKEYHELPW PMULTIKEYHELP;
-typedef LPMULTIKEYHELPW LPMULTIKEYHELP;
-
-
-
-
-
-
-typedef struct tagHELPWININFOA {
-    int  wStructSize;
-    int  x;
-    int  y;
-    int  dx;
-    int  dy;
-    int  wMax;
-    CHAR   rgchMember[2];
-} HELPWININFOA, *PHELPWININFOA, *LPHELPWININFOA;
-typedef struct tagHELPWININFOW {
-    int  wStructSize;
-    int  x;
-    int  y;
-    int  dx;
-    int  dy;
-    int  wMax;
-    WCHAR  rgchMember[2];
-} HELPWININFOW, *PHELPWININFOW, *LPHELPWININFOW;
-
-typedef HELPWININFOW HELPWININFO;
-typedef PHELPWININFOW PHELPWININFO;
-typedef LPHELPWININFOW LPHELPWININFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WinHelpA(
-           HWND hWndMain,
-           LPCSTR lpszHelp,
-         UINT uCommand,
-         ULONG_PTR dwData);
-__declspec(dllimport)
-BOOL
-__stdcall
-WinHelpW(
-           HWND hWndMain,
-           LPCWSTR lpszHelp,
-         UINT uCommand,
-         ULONG_PTR dwData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetGuiResources(
-         HANDLE hProcess,
-         DWORD uiFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagNONCLIENTMETRICSA
-{
-    UINT    cbSize;
-    int     iBorderWidth;
-    int     iScrollWidth;
-    int     iScrollHeight;
-    int     iCaptionWidth;
-    int     iCaptionHeight;
-    LOGFONTA lfCaptionFont;
-    int     iSmCaptionWidth;
-    int     iSmCaptionHeight;
-    LOGFONTA lfSmCaptionFont;
-    int     iMenuWidth;
-    int     iMenuHeight;
-    LOGFONTA lfMenuFont;
-    LOGFONTA lfStatusFont;
-    LOGFONTA lfMessageFont;
-}   NONCLIENTMETRICSA, *PNONCLIENTMETRICSA, * LPNONCLIENTMETRICSA;
-typedef struct tagNONCLIENTMETRICSW
-{
-    UINT    cbSize;
-    int     iBorderWidth;
-    int     iScrollWidth;
-    int     iScrollHeight;
-    int     iCaptionWidth;
-    int     iCaptionHeight;
-    LOGFONTW lfCaptionFont;
-    int     iSmCaptionWidth;
-    int     iSmCaptionHeight;
-    LOGFONTW lfSmCaptionFont;
-    int     iMenuWidth;
-    int     iMenuHeight;
-    LOGFONTW lfMenuFont;
-    LOGFONTW lfStatusFont;
-    LOGFONTW lfMessageFont;
-}   NONCLIENTMETRICSW, *PNONCLIENTMETRICSW, * LPNONCLIENTMETRICSW;
-
-typedef NONCLIENTMETRICSW NONCLIENTMETRICS;
-typedef PNONCLIENTMETRICSW PNONCLIENTMETRICS;
-typedef LPNONCLIENTMETRICSW LPNONCLIENTMETRICS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMINIMIZEDMETRICS
-{
-    UINT    cbSize;
-    int     iWidth;
-    int     iHorzGap;
-    int     iVertGap;
-    int     iArrange;
-}   MINIMIZEDMETRICS, *PMINIMIZEDMETRICS, *LPMINIMIZEDMETRICS;
-
-
-
-typedef struct tagICONMETRICSA
-{
-    UINT    cbSize;
-    int     iHorzSpacing;
-    int     iVertSpacing;
-    int     iTitleWrap;
-    LOGFONTA lfFont;
-}   ICONMETRICSA, *PICONMETRICSA, *LPICONMETRICSA;
-typedef struct tagICONMETRICSW
-{
-    UINT    cbSize;
-    int     iHorzSpacing;
-    int     iVertSpacing;
-    int     iTitleWrap;
-    LOGFONTW lfFont;
-}   ICONMETRICSW, *PICONMETRICSW, *LPICONMETRICSW;
-
-typedef ICONMETRICSW ICONMETRICS;
-typedef PICONMETRICSW PICONMETRICS;
-typedef LPICONMETRICSW LPICONMETRICS;
-
-
-
-
-
-
-
-
-typedef struct tagANIMATIONINFO
-{
-    UINT    cbSize;
-    int     iMinAnimate;
-}   ANIMATIONINFO, *LPANIMATIONINFO;
-
-typedef struct tagSERIALKEYSA
-{
-    UINT    cbSize;
-    DWORD   dwFlags;
-    LPSTR     lpszActivePort;
-    LPSTR     lpszPort;
-    UINT    iBaudRate;
-    UINT    iPortState;
-    UINT    iActive;
-}   SERIALKEYSA, *LPSERIALKEYSA;
-typedef struct tagSERIALKEYSW
-{
-    UINT    cbSize;
-    DWORD   dwFlags;
-    LPWSTR    lpszActivePort;
-    LPWSTR    lpszPort;
-    UINT    iBaudRate;
-    UINT    iPortState;
-    UINT    iActive;
-}   SERIALKEYSW, *LPSERIALKEYSW;
-
-typedef SERIALKEYSW SERIALKEYS;
-typedef LPSERIALKEYSW LPSERIALKEYS;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagHIGHCONTRASTA
-{
-    UINT    cbSize;
-    DWORD   dwFlags;
-    LPSTR   lpszDefaultScheme;
-}   HIGHCONTRASTA, *LPHIGHCONTRASTA;
-typedef struct tagHIGHCONTRASTW
-{
-    UINT    cbSize;
-    DWORD   dwFlags;
-    LPWSTR  lpszDefaultScheme;
-}   HIGHCONTRASTW, *LPHIGHCONTRASTW;
-
-typedef HIGHCONTRASTW HIGHCONTRAST;
-typedef LPHIGHCONTRASTW LPHIGHCONTRAST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-typedef struct _VIDEOPARAMETERS {
-    GUID  Guid;                         
-    ULONG dwOffset;                     
-    ULONG dwCommand;                    
-    ULONG dwFlags;                      
-    ULONG dwMode;                       
-    ULONG dwTVStandard;                 
-    ULONG dwAvailableModes;             
-    ULONG dwAvailableTVStandard;        
-    ULONG dwFlickerFilter;              
-    ULONG dwOverScanX;                  
-    ULONG dwOverScanY;                  
-    ULONG dwMaxUnscaledX;               
-    ULONG dwMaxUnscaledY;               
-    ULONG dwPositionX;                  
-    ULONG dwPositionY;                  
-    ULONG dwBrightness;                 
-    ULONG dwContrast;                   
-    ULONG dwCPType;                     
-    ULONG dwCPCommand;                  
-    ULONG dwCPStandard;                 
-    ULONG dwCPKey;
-    ULONG bCP_APSTriggerBits;           
-    UCHAR bOEMCopyProtection[256];      
-} VIDEOPARAMETERS, *PVIDEOPARAMETERS, *LPVIDEOPARAMETERS;
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-ChangeDisplaySettingsA(
-           LPDEVMODEA lpDevMode,
-         DWORD dwFlags);
-__declspec(dllimport)
-LONG
-__stdcall
-ChangeDisplaySettingsW(
-           LPDEVMODEW lpDevMode,
-         DWORD dwFlags);
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-ChangeDisplaySettingsExA(
-           LPCSTR lpszDeviceName,
-           LPDEVMODEA lpDevMode,
-      HWND hwnd,
-         DWORD dwflags,
-           LPVOID lParam);
-__declspec(dllimport)
-LONG
-__stdcall
-ChangeDisplaySettingsExW(
-           LPCWSTR lpszDeviceName,
-           LPDEVMODEW lpDevMode,
-      HWND hwnd,
-         DWORD dwflags,
-           LPVOID lParam);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplaySettingsA(
-           LPCSTR lpszDeviceName,
-         DWORD iModeNum,
-         LPDEVMODEA lpDevMode);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplaySettingsW(
-           LPCWSTR lpszDeviceName,
-         DWORD iModeNum,
-         LPDEVMODEW lpDevMode);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplaySettingsExA(
-           LPCSTR lpszDeviceName,
-         DWORD iModeNum,
-         LPDEVMODEA lpDevMode,
-         DWORD dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplaySettingsExW(
-           LPCWSTR lpszDeviceName,
-         DWORD iModeNum,
-         LPDEVMODEW lpDevMode,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplayDevicesA(
-           LPCSTR lpDevice,
-         DWORD iDevNum,
-         PDISPLAY_DEVICEA lpDisplayDevice,
-         DWORD dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplayDevicesW(
-           LPCWSTR lpDevice,
-         DWORD iDevNum,
-         PDISPLAY_DEVICEW lpDisplayDevice,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SystemParametersInfoA(
-         UINT uiAction,
-         UINT uiParam,
-           PVOID pvParam,
-         UINT fWinIni);
-__declspec(dllimport)
-BOOL
-__stdcall
-SystemParametersInfoW(
-         UINT uiAction,
-         UINT uiParam,
-           PVOID pvParam,
-         UINT fWinIni);
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagFILTERKEYS
-{
-    UINT  cbSize;
-    DWORD dwFlags;
-    DWORD iWaitMSec;            
-    DWORD iDelayMSec;           
-    DWORD iRepeatMSec;          
-    DWORD iBounceMSec;          
-} FILTERKEYS, *LPFILTERKEYS;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSTICKYKEYS
-{
-    UINT  cbSize;
-    DWORD dwFlags;
-} STICKYKEYS, *LPSTICKYKEYS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMOUSEKEYS
-{
-    UINT cbSize;
-    DWORD dwFlags;
-    DWORD iMaxSpeed;
-    DWORD iTimeToMaxSpeed;
-    DWORD iCtrlSpeed;
-    DWORD dwReserved1;
-    DWORD dwReserved2;
-} MOUSEKEYS, *LPMOUSEKEYS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagACCESSTIMEOUT
-{
-    UINT  cbSize;
-    DWORD dwFlags;
-    DWORD iTimeOutMSec;
-} ACCESSTIMEOUT, *LPACCESSTIMEOUT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSOUNDSENTRYA
-{
-    UINT cbSize;
-    DWORD dwFlags;
-    DWORD iFSTextEffect;
-    DWORD iFSTextEffectMSec;
-    DWORD iFSTextEffectColorBits;
-    DWORD iFSGrafEffect;
-    DWORD iFSGrafEffectMSec;
-    DWORD iFSGrafEffectColor;
-    DWORD iWindowsEffect;
-    DWORD iWindowsEffectMSec;
-    LPSTR   lpszWindowsEffectDLL;
-    DWORD iWindowsEffectOrdinal;
-} SOUNDSENTRYA, *LPSOUNDSENTRYA;
-typedef struct tagSOUNDSENTRYW
-{
-    UINT cbSize;
-    DWORD dwFlags;
-    DWORD iFSTextEffect;
-    DWORD iFSTextEffectMSec;
-    DWORD iFSTextEffectColorBits;
-    DWORD iFSGrafEffect;
-    DWORD iFSGrafEffectMSec;
-    DWORD iFSGrafEffectColor;
-    DWORD iWindowsEffect;
-    DWORD iWindowsEffectMSec;
-    LPWSTR  lpszWindowsEffectDLL;
-    DWORD iWindowsEffectOrdinal;
-} SOUNDSENTRYW, *LPSOUNDSENTRYW;
-
-typedef SOUNDSENTRYW SOUNDSENTRY;
-typedef LPSOUNDSENTRYW LPSOUNDSENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagTOGGLEKEYS
-{
-    UINT cbSize;
-    DWORD dwFlags;
-} TOGGLEKEYS, *LPTOGGLEKEYS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-SetDebugErrorLevel(
-         DWORD dwLevel);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-SetLastErrorEx(
-         DWORD dwErrCode,
-         DWORD dwType);
-
-__declspec(dllimport)
-int
-__stdcall
-InternalGetWindowText(
-         HWND hWnd,
-           LPWSTR pString,
-         int cchMaxCount);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HMONITOR
-__stdcall
-MonitorFromPoint(
-         POINT pt,
-         DWORD dwFlags);
-
-__declspec(dllimport)
-HMONITOR
-__stdcall
-MonitorFromRect(
-         LPCRECT lprc,
-         DWORD dwFlags);
-
-__declspec(dllimport)
-HMONITOR
-__stdcall
-MonitorFromWindow(
-         HWND hwnd,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-typedef struct tagMONITORINFO
-{
-    DWORD   cbSize;
-    RECT    rcMonitor;
-    RECT    rcWork;
-    DWORD   dwFlags;
-} MONITORINFO, *LPMONITORINFO;
-
-
-typedef struct tagMONITORINFOEXA : public tagMONITORINFO
-{
-    CHAR        szDevice[32];
-} MONITORINFOEXA, *LPMONITORINFOEXA;
-typedef struct tagMONITORINFOEXW : public tagMONITORINFO
-{
-    WCHAR       szDevice[32];
-} MONITORINFOEXW, *LPMONITORINFOEXW;
-
-typedef MONITORINFOEXW MONITORINFOEX;
-typedef LPMONITORINFOEXW LPMONITORINFOEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMonitorInfoA(
-         HMONITOR hMonitor,
-         LPMONITORINFO lpmi);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMonitorInfoW(
-         HMONITOR hMonitor,
-         LPMONITORINFO lpmi);
-
-
-
-
-
-
-typedef BOOL (__stdcall* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplayMonitors(
-           HDC hdc,
-           LPCRECT lprcClip,
-         MONITORENUMPROC lpfnEnum,
-         LPARAM dwData);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NotifyWinEvent(
-         DWORD event,
-         HWND  hwnd,
-         LONG  idObject,
-         LONG  idChild);
-
-typedef void (__stdcall* WINEVENTPROC)(
-    HWINEVENTHOOK hWinEventHook,
-    DWORD         event,
-    HWND          hwnd,
-    LONG          idObject,
-    LONG          idChild,
-    DWORD         idEventThread,
-    DWORD         dwmsEventTime);
-
-__declspec(dllimport)
-HWINEVENTHOOK
-__stdcall
-SetWinEventHook(
-         DWORD eventMin,
-         DWORD eventMax,
-           HMODULE hmodWinEventProc,
-         WINEVENTPROC pfnWinEventProc,
-         DWORD idProcess,
-         DWORD idThread,
-         DWORD dwFlags);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWinEventHookInstalled(
-         DWORD event);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnhookWinEvent(
-         HWINEVENTHOOK hWinEventHook);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagGUITHREADINFO
-{
-    DWORD   cbSize;
-    DWORD   flags;
-    HWND    hwndActive;
-    HWND    hwndFocus;
-    HWND    hwndCapture;
-    HWND    hwndMenuOwner;
-    HWND    hwndMoveSize;
-    HWND    hwndCaret;
-    RECT    rcCaret;
-} GUITHREADINFO, *PGUITHREADINFO,  * LPGUITHREADINFO;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetGUIThreadInfo(
-         DWORD idThread,
-         PGUITHREADINFO pgui);
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetWindowModuleFileNameA(
-         HWND hwnd,
-           LPSTR pszFileName,
-         UINT cchFileNameMax);
-__declspec(dllimport)
-UINT
-__stdcall
-GetWindowModuleFileNameW(
-         HWND hwnd,
-           LPWSTR pszFileName,
-         UINT cchFileNameMax);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCURSORINFO
-{
-    DWORD   cbSize;
-    DWORD   flags;
-    HCURSOR hCursor;
-    POINT   ptScreenPos;
-} CURSORINFO, *PCURSORINFO, *LPCURSORINFO;
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCursorInfo(
-         PCURSORINFO pci);
-
-
-
-
-typedef struct tagWINDOWINFO
-{
-    DWORD cbSize;
-    RECT rcWindow;
-    RECT rcClient;
-    DWORD dwStyle;
-    DWORD dwExStyle;
-    DWORD dwWindowStatus;
-    UINT cxWindowBorders;
-    UINT cyWindowBorders;
-    ATOM atomWindowType;
-    WORD wCreatorVersion;
-} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetWindowInfo(
-         HWND hwnd,
-         PWINDOWINFO pwi);
-
-
-
-
-typedef struct tagTITLEBARINFO
-{
-    DWORD cbSize;
-    RECT rcTitleBar;
-    DWORD rgstate[5 + 1];
-} TITLEBARINFO, *PTITLEBARINFO, *LPTITLEBARINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTitleBarInfo(
-         HWND hwnd,
-         PTITLEBARINFO pti);
-
-
-
-
-typedef struct tagMENUBARINFO
-{
-    DWORD cbSize;
-    RECT rcBar;          
-    HMENU hMenu;         
-    HWND hwndMenu;       
-    BOOL fBarFocused:1;  
-    BOOL fFocused:1;     
-} MENUBARINFO, *PMENUBARINFO, *LPMENUBARINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuBarInfo(
-         HWND hwnd,
-         LONG idObject,
-         LONG idItem,
-         PMENUBARINFO pmbi);
-
-
-
-
-typedef struct tagSCROLLBARINFO
-{
-    DWORD cbSize;
-    RECT rcScrollBar;
-    int dxyLineButton;
-    int xyThumbTop;
-    int xyThumbBottom;
-    int reserved;
-    DWORD rgstate[5 + 1];
-} SCROLLBARINFO, *PSCROLLBARINFO, *LPSCROLLBARINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetScrollBarInfo(
-         HWND hwnd,
-         LONG idObject,
-         PSCROLLBARINFO psbi);
-
-
-
-
-typedef struct tagCOMBOBOXINFO
-{
-    DWORD cbSize;
-    RECT rcItem;
-    RECT rcButton;
-    DWORD stateButton;
-    HWND hwndCombo;
-    HWND hwndItem;
-    HWND hwndList;
-} COMBOBOXINFO, *PCOMBOBOXINFO, *LPCOMBOBOXINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComboBoxInfo(
-         HWND hwndCombo,
-         PCOMBOBOXINFO pcbi);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetAncestor(
-         HWND hwnd,
-         UINT gaFlags);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-RealChildWindowFromPoint(
-         HWND hwndParent,
-         POINT ptParentClientCoords);
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-RealGetWindowClassA(
-         HWND hwnd,
-           LPSTR ptszClassName,
-         UINT cchClassNameMax);
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-RealGetWindowClassW(
-         HWND hwnd,
-           LPWSTR ptszClassName,
-         UINT cchClassNameMax);
-
-
-
-
-
-
-
-
-
-typedef struct tagALTTABINFO
-{
-    DWORD cbSize;
-    int cItems;
-    int cColumns;
-    int cRows;
-    int iColFocus;
-    int iRowFocus;
-    int cxItem;
-    int cyItem;
-    POINT ptStart;
-} ALTTABINFO, *PALTTABINFO, *LPALTTABINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetAltTabInfoA(
-           HWND hwnd,
-         int iItem,
-         PALTTABINFO pati,
-           LPSTR pszItemText,
-         UINT cchItemText);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetAltTabInfoW(
-           HWND hwnd,
-         int iItem,
-         PALTTABINFO pati,
-           LPWSTR pszItemText,
-         UINT cchItemText);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetListBoxInfo(
-         HWND hwnd);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockWorkStation(
-    void);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UserHandleGrantAccess(
-         HANDLE hUserHandle,
-         HANDLE hJob,
-         BOOL   bGrant);
-
-
-
-
-
-
-
-
-
-struct HRAWINPUT__ { int unused; }; typedef struct HRAWINPUT__ *HRAWINPUT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagRAWINPUTHEADER {
-    DWORD dwType;
-    DWORD dwSize;
-    HANDLE hDevice;
-    WPARAM wParam;
-} RAWINPUTHEADER, *PRAWINPUTHEADER, *LPRAWINPUTHEADER;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagRAWMOUSE {
-    
-
-
-    USHORT usFlags;
-
-    
-
-
-    union {
-        ULONG ulButtons;
-        struct  {
-            USHORT  usButtonFlags;
-            USHORT  usButtonData;
-        };
-    };
-
-
-    
-
-
-    ULONG ulRawButtons;
-
-    
-
-
-    LONG lLastX;
-
-    
-
-
-    LONG lLastY;
-
-    
-
-
-    ULONG ulExtraInformation;
-
-} RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagRAWKEYBOARD {
-    
-
-
-    USHORT MakeCode;
-
-    
-
-
-
-    USHORT Flags;
-
-    USHORT Reserved;
-
-    
-
-
-    USHORT VKey;
-    UINT   Message;
-
-    
-
-
-    ULONG ExtraInformation;
-
-
-} RAWKEYBOARD, *PRAWKEYBOARD, *LPRAWKEYBOARD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagRAWHID {
-    DWORD dwSizeHid;    
-    DWORD dwCount;      
-    BYTE bRawData[1];
-} RAWHID, *PRAWHID, *LPRAWHID;
-
-
-
-
-typedef struct tagRAWINPUT {
-    RAWINPUTHEADER header;
-    union {
-        RAWMOUSE    mouse;
-        RAWKEYBOARD keyboard;
-        RAWHID      hid;
-    } data;
-} RAWINPUT, *PRAWINPUT, *LPRAWINPUT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputData(
-         HRAWINPUT hRawInput,
-         UINT uiCommand,
-             LPVOID pData,
-         PUINT pcbSize,
-         UINT cbSizeHeader);
-
-
-
-
-
-
-
-
-typedef struct tagRID_DEVICE_INFO_MOUSE {
-    DWORD dwId;
-    DWORD dwNumberOfButtons;
-    DWORD dwSampleRate;
-} RID_DEVICE_INFO_MOUSE, *PRID_DEVICE_INFO_MOUSE;
-
-typedef struct tagRID_DEVICE_INFO_KEYBOARD {
-    DWORD dwType;
-    DWORD dwSubType;
-    DWORD dwKeyboardMode;
-    DWORD dwNumberOfFunctionKeys;
-    DWORD dwNumberOfIndicators;
-    DWORD dwNumberOfKeysTotal;
-} RID_DEVICE_INFO_KEYBOARD, *PRID_DEVICE_INFO_KEYBOARD;
-
-typedef struct tagRID_DEVICE_INFO_HID {
-    DWORD dwVendorId;
-    DWORD dwProductId;
-    DWORD dwVersionNumber;
-
-    
-
-
-    USHORT usUsagePage;
-    USHORT usUsage;
-} RID_DEVICE_INFO_HID, *PRID_DEVICE_INFO_HID;
-
-typedef struct tagRID_DEVICE_INFO {
-    DWORD cbSize;
-    DWORD dwType;
-    union {
-        RID_DEVICE_INFO_MOUSE mouse;
-        RID_DEVICE_INFO_KEYBOARD keyboard;
-        RID_DEVICE_INFO_HID hid;
-    };
-} RID_DEVICE_INFO, *PRID_DEVICE_INFO, *LPRID_DEVICE_INFO;
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputDeviceInfoA(
-           HANDLE hDevice,
-         UINT uiCommand,
-                 LPVOID pData,
-         PUINT pcbSize);
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputDeviceInfoW(
-           HANDLE hDevice,
-         UINT uiCommand,
-                 LPVOID pData,
-         PUINT pcbSize);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputBuffer(
-           PRAWINPUT pData,
-         PUINT pcbSize,
-         UINT cbSizeHeader);
-
-
-
-
-typedef struct tagRAWINPUTDEVICE {
-    USHORT usUsagePage; 
-    USHORT usUsage;     
-    DWORD dwFlags;
-    HWND hwndTarget;    
-} RAWINPUTDEVICE, *PRAWINPUTDEVICE, *LPRAWINPUTDEVICE;
-
-typedef const RAWINPUTDEVICE* PCRAWINPUTDEVICE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RegisterRawInputDevices(
-           PCRAWINPUTDEVICE pRawInputDevices,
-         UINT uiNumDevices,
-         UINT cbSize);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRegisteredRawInputDevices(
-           PRAWINPUTDEVICE pRawInputDevices,
-         PUINT puiNumDevices,
-         UINT cbSize);
-
-
-typedef struct tagRAWINPUTDEVICELIST {
-    HANDLE hDevice;
-    DWORD dwType;
-} RAWINPUTDEVICELIST, *PRAWINPUTDEVICELIST;
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputDeviceList(
-           PRAWINPUTDEVICELIST pRawInputDeviceList,
-         PUINT puiNumDevices,
-         UINT cbSize);
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-DefRawInputProc(
-           PRAWINPUT* paRawInput,
-         INT nInput,
-         UINT cbSizeHeader);
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD LGRPID;
-
-
-
-
-
-typedef DWORD LCTYPE;
-
-
-
-
-
-typedef DWORD CALTYPE;
-
-
-
-
-
-typedef DWORD CALID;
-
-
-
-
-
-
-typedef struct _cpinfo {
-    UINT    MaxCharSize;                    
-    BYTE    DefaultChar[2];   
-    BYTE    LeadByte[12];        
-} CPINFO, *LPCPINFO;
-
-typedef struct _cpinfoexA {
-    UINT    MaxCharSize;                    
-    BYTE    DefaultChar[2];   
-    BYTE    LeadByte[12];        
-    WCHAR   UnicodeDefaultChar;             
-    UINT    CodePage;                       
-    CHAR    CodePageName[260];         
-} CPINFOEXA, *LPCPINFOEXA;
-typedef struct _cpinfoexW {
-    UINT    MaxCharSize;                    
-    BYTE    DefaultChar[2];   
-    BYTE    LeadByte[12];        
-    WCHAR   UnicodeDefaultChar;             
-    UINT    CodePage;                       
-    WCHAR   CodePageName[260];         
-} CPINFOEXW, *LPCPINFOEXW;
-
-typedef CPINFOEXW CPINFOEX;
-typedef LPCPINFOEXW LPCPINFOEX;
-
-
-
-
-
-
-
-
-
-
-typedef struct _numberfmtA {
-    UINT    NumDigits;                 
-    UINT    LeadingZero;               
-    UINT    Grouping;                  
-    LPSTR   lpDecimalSep;              
-    LPSTR   lpThousandSep;             
-    UINT    NegativeOrder;             
-} NUMBERFMTA, *LPNUMBERFMTA;
-typedef struct _numberfmtW {
-    UINT    NumDigits;                 
-    UINT    LeadingZero;               
-    UINT    Grouping;                  
-    LPWSTR  lpDecimalSep;              
-    LPWSTR  lpThousandSep;             
-    UINT    NegativeOrder;             
-} NUMBERFMTW, *LPNUMBERFMTW;
-
-typedef NUMBERFMTW NUMBERFMT;
-typedef LPNUMBERFMTW LPNUMBERFMT;
-
-
-
-
-
-
-
-
-
-
-typedef struct _currencyfmtA {
-    UINT    NumDigits;                 
-    UINT    LeadingZero;               
-    UINT    Grouping;                  
-    LPSTR   lpDecimalSep;              
-    LPSTR   lpThousandSep;             
-    UINT    NegativeOrder;             
-    UINT    PositiveOrder;             
-    LPSTR   lpCurrencySymbol;          
-} CURRENCYFMTA, *LPCURRENCYFMTA;
-typedef struct _currencyfmtW {
-    UINT    NumDigits;                 
-    UINT    LeadingZero;               
-    UINT    Grouping;                  
-    LPWSTR  lpDecimalSep;              
-    LPWSTR  lpThousandSep;             
-    UINT    NegativeOrder;             
-    UINT    PositiveOrder;             
-    LPWSTR  lpCurrencySymbol;          
-} CURRENCYFMTW, *LPCURRENCYFMTW;
-
-typedef CURRENCYFMTW CURRENCYFMT;
-typedef LPCURRENCYFMTW LPCURRENCYFMT;
-
-
-
-
-
-
-
-
-
-enum SYSNLS_FUNCTION{
-    COMPARE_STRING    =  0x0001,
-};
-typedef DWORD NLS_FUNCTION;
-
-
-
-
-
-
-typedef struct _nlsversioninfo{ 
-    DWORD dwNLSVersionInfoSize; 
-    DWORD dwNLSVersion; 
-    DWORD dwDefinedVersion; 
-} NLSVERSIONINFO, *LPNLSVERSIONINFO; 
-
-
-
-
-
-
-typedef LONG    GEOID;
-typedef DWORD   GEOTYPE;
-typedef DWORD   GEOCLASS;
-
-
-
-
-
-
-
-enum SYSGEOTYPE {
-    GEO_NATION      =       0x0001,
-    GEO_LATITUDE    =       0x0002,
-    GEO_LONGITUDE   =       0x0003,
-    GEO_ISO2        =       0x0004,
-    GEO_ISO3        =       0x0005,
-    GEO_RFC1766     =       0x0006,
-    GEO_LCID        =       0x0007,
-    GEO_FRIENDLYNAME=       0x0008,
-    GEO_OFFICIALNAME=       0x0009,
-    GEO_TIMEZONES   =       0x000A,
-    GEO_OFFICIALLANGUAGES = 0x000B,
-};
-
-
-
-
-
-enum SYSGEOCLASS {
-    GEOCLASS_NATION  = 16,
-    GEOCLASS_REGION  = 14,
-};
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall* LANGUAGEGROUP_ENUMPROCA)(LGRPID, LPSTR, LPSTR, DWORD, LONG_PTR);
-typedef BOOL (__stdcall* LANGGROUPLOCALE_ENUMPROCA)(LGRPID, LCID, LPSTR, LONG_PTR);
-typedef BOOL (__stdcall* UILANGUAGE_ENUMPROCA)(LPSTR, LONG_PTR);
-typedef BOOL (__stdcall* LOCALE_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* CODEPAGE_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* DATEFMT_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* DATEFMT_ENUMPROCEXA)(LPSTR, CALID);
-typedef BOOL (__stdcall* TIMEFMT_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* CALINFO_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* CALINFO_ENUMPROCEXA)(LPSTR, CALID);
-
-typedef BOOL (__stdcall* LANGUAGEGROUP_ENUMPROCW)(LGRPID, LPWSTR, LPWSTR, DWORD, LONG_PTR);
-typedef BOOL (__stdcall* LANGGROUPLOCALE_ENUMPROCW)(LGRPID, LCID, LPWSTR, LONG_PTR);
-typedef BOOL (__stdcall* UILANGUAGE_ENUMPROCW)(LPWSTR, LONG_PTR);
-typedef BOOL (__stdcall* LOCALE_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* CODEPAGE_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* DATEFMT_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* DATEFMT_ENUMPROCEXW)(LPWSTR, CALID);
-typedef BOOL (__stdcall* TIMEFMT_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* CALINFO_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* CALINFO_ENUMPROCEXW)(LPWSTR, CALID);
-typedef BOOL (__stdcall* GEO_ENUMPROC)(GEOID);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidCodePage(
-         UINT  CodePage);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetACP(void);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetOEMCP(void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCPInfo(
-         UINT       CodePage,
-         LPCPINFO  lpCPInfo);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCPInfoExA(
-         UINT          CodePage,
-         DWORD         dwFlags,
-         LPCPINFOEXA  lpCPInfoEx);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCPInfoExW(
-         UINT          CodePage,
-         DWORD         dwFlags,
-         LPCPINFOEXW  lpCPInfoEx);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDBCSLeadByte(
-         BYTE  TestChar);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDBCSLeadByteEx(
-         UINT  CodePage,
-         BYTE  TestChar);
-
-__declspec(dllimport)
-int
-__stdcall
-MultiByteToWideChar(
-         UINT     CodePage,
-         DWORD    dwFlags,
-         LPCSTR   lpMultiByteStr,
-         int      cbMultiByte,
-           LPWSTR  lpWideCharStr,
-         int      cchWideChar);
-
-__declspec(dllimport)
-int
-__stdcall
-WideCharToMultiByte(
-         UINT     CodePage,
-         DWORD    dwFlags,
-           LPCWSTR  lpWideCharStr,
-         int      cchWideChar,
-           LPSTR   lpMultiByteStr,
-         int      cbMultiByte,
-           LPCSTR   lpDefaultChar,
-           LPBOOL  lpUsedDefaultChar);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-CompareStringA(
-         LCID     Locale,
-         DWORD    dwCmpFlags,
-         LPCSTR  lpString1,
-         int      cchCount1,
-         LPCSTR  lpString2,
-         int      cchCount2);
-__declspec(dllimport)
-int
-__stdcall
-CompareStringW(
-         LCID     Locale,
-         DWORD    dwCmpFlags,
-         LPCWSTR  lpString1,
-         int      cchCount1,
-         LPCWSTR  lpString2,
-         int      cchCount2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-LCMapStringA(
-         LCID     Locale,
-         DWORD    dwMapFlags,
-         LPCSTR  lpSrcStr,
-         int      cchSrc,
-           LPSTR  lpDestStr,
-         int      cchDest);
-__declspec(dllimport)
-int
-__stdcall
-LCMapStringW(
-         LCID     Locale,
-         DWORD    dwMapFlags,
-         LPCWSTR  lpSrcStr,
-         int      cchSrc,
-           LPWSTR  lpDestStr,
-         int      cchDest);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetLocaleInfoA(
-         LCID     Locale,
-         LCTYPE   LCType,
-           LPSTR  lpLCData,
-         int      cchData);
-__declspec(dllimport)
-int
-__stdcall
-GetLocaleInfoW(
-         LCID     Locale,
-         LCTYPE   LCType,
-           LPWSTR  lpLCData,
-         int      cchData);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetLocaleInfoA(
-         LCID     Locale,
-         LCTYPE   LCType,
-         LPCSTR  lpLCData);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetLocaleInfoW(
-         LCID     Locale,
-         LCTYPE   LCType,
-         LPCWSTR  lpLCData);
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetCalendarInfoA(
-         LCID     Locale,
-         CALID    Calendar,
-         CALTYPE  CalType,
-           LPSTR   lpCalData,
-         int      cchData,
-           LPDWORD  lpValue);
-__declspec(dllimport)
-int
-__stdcall
-GetCalendarInfoW(
-         LCID     Locale,
-         CALID    Calendar,
-         CALTYPE  CalType,
-           LPWSTR   lpCalData,
-         int      cchData,
-           LPDWORD  lpValue);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCalendarInfoA(
-         LCID     Locale,
-         CALID    Calendar,
-         CALTYPE  CalType,
-         LPCSTR  lpCalData);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCalendarInfoW(
-         LCID     Locale,
-         CALID    Calendar,
-         CALTYPE  CalType,
-         LPCWSTR  lpCalData);
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetTimeFormatA(
-         LCID             Locale,
-         DWORD            dwFlags,
-           const SYSTEMTIME *lpTime,
-           LPCSTR          lpFormat,
-           LPSTR          lpTimeStr,
-         int              cchTime);
-__declspec(dllimport)
-int
-__stdcall
-GetTimeFormatW(
-         LCID             Locale,
-         DWORD            dwFlags,
-           const SYSTEMTIME *lpTime,
-           LPCWSTR          lpFormat,
-           LPWSTR          lpTimeStr,
-         int              cchTime);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetDateFormatA(
-         LCID             Locale,
-         DWORD            dwFlags,
-           const SYSTEMTIME *lpDate,
-           LPCSTR          lpFormat,
-           LPSTR          lpDateStr,
-         int              cchDate);
-__declspec(dllimport)
-int
-__stdcall
-GetDateFormatW(
-         LCID             Locale,
-         DWORD            dwFlags,
-           const SYSTEMTIME *lpDate,
-           LPCWSTR          lpFormat,
-           LPWSTR          lpDateStr,
-         int              cchDate);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetNumberFormatA(
-         LCID             Locale,
-         DWORD            dwFlags,
-         LPCSTR          lpValue,
-           const NUMBERFMTA *lpFormat,
-           LPSTR          lpNumberStr,
-         int              cchNumber);
-__declspec(dllimport)
-int
-__stdcall
-GetNumberFormatW(
-         LCID             Locale,
-         DWORD            dwFlags,
-         LPCWSTR          lpValue,
-           const NUMBERFMTW *lpFormat,
-           LPWSTR          lpNumberStr,
-         int              cchNumber);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetCurrencyFormatA(
-         LCID               Locale,
-         DWORD              dwFlags,
-         LPCSTR            lpValue,
-           const CURRENCYFMTA *lpFormat,
-           LPSTR            lpCurrencyStr,
-         int                cchCurrency);
-__declspec(dllimport)
-int
-__stdcall
-GetCurrencyFormatW(
-         LCID               Locale,
-         DWORD              dwFlags,
-         LPCWSTR            lpValue,
-           const CURRENCYFMTW *lpFormat,
-           LPWSTR            lpCurrencyStr,
-         int                cchCurrency);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumCalendarInfoA(
-         CALINFO_ENUMPROCA lpCalInfoEnumProc,
-         LCID              Locale,
-         CALID             Calendar,
-         CALTYPE           CalType);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumCalendarInfoW(
-         CALINFO_ENUMPROCW lpCalInfoEnumProc,
-         LCID              Locale,
-         CALID             Calendar,
-         CALTYPE           CalType);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumCalendarInfoExA(
-         CALINFO_ENUMPROCEXA lpCalInfoEnumProcEx,
-         LCID                Locale,
-         CALID               Calendar,
-         CALTYPE             CalType);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumCalendarInfoExW(
-         CALINFO_ENUMPROCEXW lpCalInfoEnumProcEx,
-         LCID                Locale,
-         CALID               Calendar,
-         CALTYPE             CalType);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumTimeFormatsA(
-         TIMEFMT_ENUMPROCA lpTimeFmtEnumProc,
-         LCID              Locale,
-         DWORD             dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumTimeFormatsW(
-         TIMEFMT_ENUMPROCW lpTimeFmtEnumProc,
-         LCID              Locale,
-         DWORD             dwFlags);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDateFormatsA(
-         DATEFMT_ENUMPROCA lpDateFmtEnumProc,
-         LCID              Locale,
-         DWORD             dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDateFormatsW(
-         DATEFMT_ENUMPROCW lpDateFmtEnumProc,
-         LCID              Locale,
-         DWORD             dwFlags);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDateFormatsExA(
-         DATEFMT_ENUMPROCEXA lpDateFmtEnumProcEx,
-         LCID                Locale,
-         DWORD               dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDateFormatsExW(
-         DATEFMT_ENUMPROCEXW lpDateFmtEnumProcEx,
-         LCID                Locale,
-         DWORD               dwFlags);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidLanguageGroup(
-         LGRPID  LanguageGroup,
-         DWORD   dwFlags);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNLSVersion(
-         NLS_FUNCTION     Function,
-         LCID             Locale,
-         LPNLSVERSIONINFO lpVersionInformation);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsNLSDefinedString(
-         NLS_FUNCTION     Function,
-         DWORD            dwFlags,
-         LPNLSVERSIONINFO lpVersionInformation,
-         LPCWSTR          lpString,
-         INT              cchStr);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidLocale(
-         LCID   Locale,
-         DWORD  dwFlags);
-
-__declspec(dllimport)
-int
-__stdcall
-GetGeoInfoA(
-         GEOID       Location,
-         GEOTYPE     GeoType,
-           LPSTR     lpGeoData,
-         int         cchData,
-         LANGID      LangId);
-__declspec(dllimport)
-int
-__stdcall
-GetGeoInfoW(
-         GEOID       Location,
-         GEOTYPE     GeoType,
-           LPWSTR     lpGeoData,
-         int         cchData,
-         LANGID      LangId);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemGeoID(
-         GEOCLASS        GeoClass,
-         GEOID           ParentGeoId,
-         GEO_ENUMPROC    lpGeoEnumProc);
-
-__declspec(dllimport)
-GEOID
-__stdcall
-GetUserGeoID(
-         GEOCLASS    GeoClass);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetUserGeoID(
-         GEOID       GeoId);
-
-__declspec(dllimport)
-LCID
-__stdcall
-ConvertDefaultLocale(
-         LCID   Locale);
-
-__declspec(dllimport)
-LCID
-__stdcall
-GetThreadLocale(void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadLocale(
-         LCID  Locale
-    );
-
-
-__declspec(dllimport)
-LANGID
-__stdcall
-GetSystemDefaultUILanguage(void);
-
-__declspec(dllimport)
-LANGID
-__stdcall
-GetUserDefaultUILanguage(void);
-
-
-__declspec(dllimport)
-LANGID
-__stdcall
-GetSystemDefaultLangID(void);
-
-__declspec(dllimport)
-LANGID
-__stdcall
-GetUserDefaultLangID(void);
-
-__declspec(dllimport)
-LCID
-__stdcall
-GetSystemDefaultLCID(void);
-
-__declspec(dllimport)
-LCID
-__stdcall
-GetUserDefaultLCID(void);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetStringTypeExA(
-         LCID     Locale,
-         DWORD    dwInfoType,
-         LPCSTR  lpSrcStr,
-         int      cchSrc,
-         LPWORD  lpCharType);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetStringTypeExW(
-         LCID     Locale,
-         DWORD    dwInfoType,
-         LPCWSTR  lpSrcStr,
-         int      cchSrc,
-         LPWORD  lpCharType);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetStringTypeA(
-         LCID     Locale,
-         DWORD    dwInfoType,
-         LPCSTR   lpSrcStr,
-         int      cchSrc,
-         LPWORD  lpCharType);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetStringTypeW(
-         DWORD    dwInfoType,
-         LPCWSTR  lpSrcStr,
-         int      cchSrc,
-         LPWORD  lpCharType);
-
-
-__declspec(dllimport)
-int
-__stdcall
-FoldStringA(
-         DWORD    dwMapFlags,
-         LPCSTR  lpSrcStr,
-         int      cchSrc,
-           LPSTR  lpDestStr,
-         int      cchDest);
-__declspec(dllimport)
-int
-__stdcall
-FoldStringW(
-         DWORD    dwMapFlags,
-         LPCWSTR  lpSrcStr,
-         int      cchSrc,
-           LPWSTR  lpDestStr,
-         int      cchDest);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemLanguageGroupsA(
-         LANGUAGEGROUP_ENUMPROCA lpLanguageGroupEnumProc,
-         DWORD                   dwFlags,
-         LONG_PTR                lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemLanguageGroupsW(
-         LANGUAGEGROUP_ENUMPROCW lpLanguageGroupEnumProc,
-         DWORD                   dwFlags,
-         LONG_PTR                lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumLanguageGroupLocalesA(
-         LANGGROUPLOCALE_ENUMPROCA lpLangGroupLocaleEnumProc,
-         LGRPID                    LanguageGroup,
-         DWORD                     dwFlags,
-         LONG_PTR                  lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumLanguageGroupLocalesW(
-         LANGGROUPLOCALE_ENUMPROCW lpLangGroupLocaleEnumProc,
-         LGRPID                    LanguageGroup,
-         DWORD                     dwFlags,
-         LONG_PTR                  lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumUILanguagesA(
-         UILANGUAGE_ENUMPROCA lpUILanguageEnumProc,
-         DWORD                dwFlags,
-         LONG_PTR             lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumUILanguagesW(
-         UILANGUAGE_ENUMPROCW lpUILanguageEnumProc,
-         DWORD                dwFlags,
-         LONG_PTR             lParam);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemLocalesA(
-         LOCALE_ENUMPROCA lpLocaleEnumProc,
-         DWORD            dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemLocalesW(
-         LOCALE_ENUMPROCW lpLocaleEnumProc,
-         DWORD            dwFlags);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemCodePagesA(
-         CODEPAGE_ENUMPROCA lpCodePageEnumProc,
-         DWORD              dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemCodePagesW(
-         CODEPAGE_ENUMPROCW lpCodePageEnumProc,
-         DWORD              dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-typedef struct _COORD {
-    SHORT X;
-    SHORT Y;
-} COORD, *PCOORD;
-
-typedef struct _SMALL_RECT {
-    SHORT Left;
-    SHORT Top;
-    SHORT Right;
-    SHORT Bottom;
-} SMALL_RECT, *PSMALL_RECT;
-
-typedef struct _KEY_EVENT_RECORD {
-    BOOL bKeyDown;
-    WORD wRepeatCount;
-    WORD wVirtualKeyCode;
-    WORD wVirtualScanCode;
-    union {
-        WCHAR UnicodeChar;
-        CHAR   AsciiChar;
-    } uChar;
-    DWORD dwControlKeyState;
-} KEY_EVENT_RECORD, *PKEY_EVENT_RECORD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _MOUSE_EVENT_RECORD {
-    COORD dwMousePosition;
-    DWORD dwButtonState;
-    DWORD dwControlKeyState;
-    DWORD dwEventFlags;
-} MOUSE_EVENT_RECORD, *PMOUSE_EVENT_RECORD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _WINDOW_BUFFER_SIZE_RECORD {
-    COORD dwSize;
-} WINDOW_BUFFER_SIZE_RECORD, *PWINDOW_BUFFER_SIZE_RECORD;
-
-typedef struct _MENU_EVENT_RECORD {
-    UINT dwCommandId;
-} MENU_EVENT_RECORD, *PMENU_EVENT_RECORD;
-
-typedef struct _FOCUS_EVENT_RECORD {
-    BOOL bSetFocus;
-} FOCUS_EVENT_RECORD, *PFOCUS_EVENT_RECORD;
-
-typedef struct _INPUT_RECORD {
-    WORD EventType;
-    union {
-        KEY_EVENT_RECORD KeyEvent;
-        MOUSE_EVENT_RECORD MouseEvent;
-        WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
-        MENU_EVENT_RECORD MenuEvent;
-        FOCUS_EVENT_RECORD FocusEvent;
-    } Event;
-} INPUT_RECORD, *PINPUT_RECORD;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CHAR_INFO {
-    union {
-        WCHAR UnicodeChar;
-        CHAR   AsciiChar;
-    } Char;
-    WORD Attributes;
-} CHAR_INFO, *PCHAR_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
-    COORD dwSize;
-    COORD dwCursorPosition;
-    WORD  wAttributes;
-    SMALL_RECT srWindow;
-    COORD dwMaximumWindowSize;
-} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;
-
-typedef struct _CONSOLE_CURSOR_INFO {
-    DWORD  dwSize;
-    BOOL   bVisible;
-} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
-
-typedef struct _CONSOLE_FONT_INFO {
-    DWORD  nFont;
-    COORD  dwFontSize;
-} CONSOLE_FONT_INFO, *PCONSOLE_FONT_INFO;
-
-
-typedef struct _CONSOLE_SELECTION_INFO {
-    DWORD dwFlags;
-    COORD dwSelectionAnchor;
-    SMALL_RECT srSelection;
-} CONSOLE_SELECTION_INFO, *PCONSOLE_SELECTION_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-BOOL
-(__stdcall *PHANDLER_ROUTINE)(
-    DWORD CtrlType
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekConsoleInputA(
-     HANDLE hConsoleInput,
-     PINPUT_RECORD lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsRead
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekConsoleInputW(
-     HANDLE hConsoleInput,
-     PINPUT_RECORD lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsRead
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleInputA(
-     HANDLE hConsoleInput,
-     PINPUT_RECORD lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsRead
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleInputW(
-     HANDLE hConsoleInput,
-     PINPUT_RECORD lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsRead
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleInputA(
-     HANDLE hConsoleInput,
-     const INPUT_RECORD *lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsWritten
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleInputW(
-     HANDLE hConsoleInput,
-     const INPUT_RECORD *lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsWritten
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputA(
-     HANDLE hConsoleOutput,
-     PCHAR_INFO lpBuffer,
-     COORD dwBufferSize,
-     COORD dwBufferCoord,
-      PSMALL_RECT lpReadRegion
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputW(
-     HANDLE hConsoleOutput,
-     PCHAR_INFO lpBuffer,
-     COORD dwBufferSize,
-     COORD dwBufferCoord,
-      PSMALL_RECT lpReadRegion
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputA(
-     HANDLE hConsoleOutput,
-     const CHAR_INFO *lpBuffer,
-     COORD dwBufferSize,
-     COORD dwBufferCoord,
-      PSMALL_RECT lpWriteRegion
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputW(
-     HANDLE hConsoleOutput,
-     const CHAR_INFO *lpBuffer,
-     COORD dwBufferSize,
-     COORD dwBufferCoord,
-      PSMALL_RECT lpWriteRegion
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputCharacterA(
-     HANDLE hConsoleOutput,
-     LPSTR lpCharacter,
-      DWORD nLength,
-     COORD dwReadCoord,
-     LPDWORD lpNumberOfCharsRead
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputCharacterW(
-     HANDLE hConsoleOutput,
-     LPWSTR lpCharacter,
-      DWORD nLength,
-     COORD dwReadCoord,
-     LPDWORD lpNumberOfCharsRead
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputAttribute(
-     HANDLE hConsoleOutput,
-     LPWORD lpAttribute,
-     DWORD nLength,
-     COORD dwReadCoord,
-     LPDWORD lpNumberOfAttrsRead
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputCharacterA(
-     HANDLE hConsoleOutput,
-     LPCSTR lpCharacter,
-     DWORD nLength,
-     COORD dwWriteCoord,
-     LPDWORD lpNumberOfCharsWritten
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputCharacterW(
-     HANDLE hConsoleOutput,
-     LPCWSTR lpCharacter,
-     DWORD nLength,
-     COORD dwWriteCoord,
-     LPDWORD lpNumberOfCharsWritten
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputAttribute(
-     HANDLE hConsoleOutput,
-     const WORD *lpAttribute,
-     DWORD nLength,
-     COORD dwWriteCoord,
-     LPDWORD lpNumberOfAttrsWritten
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FillConsoleOutputCharacterA(
-     HANDLE hConsoleOutput,
-     CHAR  cCharacter,
-     DWORD  nLength,
-     COORD  dwWriteCoord,
-     LPDWORD lpNumberOfCharsWritten
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FillConsoleOutputCharacterW(
-     HANDLE hConsoleOutput,
-     WCHAR  cCharacter,
-     DWORD  nLength,
-     COORD  dwWriteCoord,
-     LPDWORD lpNumberOfCharsWritten
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FillConsoleOutputAttribute(
-     HANDLE hConsoleOutput,
-     WORD   wAttribute,
-     DWORD  nLength,
-     COORD  dwWriteCoord,
-     LPDWORD lpNumberOfAttrsWritten
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleMode(
-     HANDLE hConsoleHandle,
-     LPDWORD lpMode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumberOfConsoleInputEvents(
-     HANDLE hConsoleInput,
-     LPDWORD lpNumberOfEvents
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleScreenBufferInfo(
-     HANDLE hConsoleOutput,
-     PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
-    );
-
-__declspec(dllimport)
-COORD
-__stdcall
-GetLargestConsoleWindowSize(
-     HANDLE hConsoleOutput
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleCursorInfo(
-     HANDLE hConsoleOutput,
-     PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCurrentConsoleFont(
-     HANDLE hConsoleOutput,
-     BOOL bMaximumWindow,
-     PCONSOLE_FONT_INFO lpConsoleCurrentFont
-    );
-
-__declspec(dllimport)
-COORD
-__stdcall
-GetConsoleFontSize(
-     HANDLE hConsoleOutput,
-     DWORD nFont
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleSelectionInfo(
-     PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumberOfConsoleMouseButtons(
-     LPDWORD lpNumberOfMouseButtons
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleMode(
-     HANDLE hConsoleHandle,
-     DWORD dwMode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleActiveScreenBuffer(
-     HANDLE hConsoleOutput
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlushConsoleInputBuffer(
-     HANDLE hConsoleInput
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleScreenBufferSize(
-     HANDLE hConsoleOutput,
-     COORD dwSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleCursorPosition(
-     HANDLE hConsoleOutput,
-     COORD dwCursorPosition
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleCursorInfo(
-     HANDLE hConsoleOutput,
-     const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ScrollConsoleScreenBufferA(
-     HANDLE hConsoleOutput,
-     const SMALL_RECT *lpScrollRectangle,
-     const SMALL_RECT *lpClipRectangle,
-     COORD dwDestinationOrigin,
-     const CHAR_INFO *lpFill
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ScrollConsoleScreenBufferW(
-     HANDLE hConsoleOutput,
-     const SMALL_RECT *lpScrollRectangle,
-     const SMALL_RECT *lpClipRectangle,
-     COORD dwDestinationOrigin,
-     const CHAR_INFO *lpFill
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleWindowInfo(
-     HANDLE hConsoleOutput,
-     BOOL bAbsolute,
-     const SMALL_RECT *lpConsoleWindow
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleTextAttribute(
-     HANDLE hConsoleOutput,
-     WORD wAttributes
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleCtrlHandler(
-     PHANDLER_ROUTINE HandlerRoutine,
-     BOOL Add
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GenerateConsoleCtrlEvent(
-     DWORD dwCtrlEvent,
-     DWORD dwProcessGroupId
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllocConsole( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeConsole( void );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AttachConsole(
-     DWORD dwProcessId
-    );
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleTitleA(
-     LPSTR lpConsoleTitle,
-     DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleTitleW(
-     LPWSTR lpConsoleTitle,
-     DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleTitleA(
-     LPCSTR lpConsoleTitle
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleTitleW(
-     LPCWSTR lpConsoleTitle
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleA(
-     HANDLE hConsoleInput,
-     LPVOID lpBuffer,
-     DWORD nNumberOfCharsToRead,
-     LPDWORD lpNumberOfCharsRead,
-     LPVOID lpReserved
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleW(
-     HANDLE hConsoleInput,
-     LPVOID lpBuffer,
-     DWORD nNumberOfCharsToRead,
-     LPDWORD lpNumberOfCharsRead,
-     LPVOID lpReserved
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleA(
-     HANDLE hConsoleOutput,
-     const void *lpBuffer,
-     DWORD nNumberOfCharsToWrite,
-     LPDWORD lpNumberOfCharsWritten,
-     LPVOID lpReserved
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleW(
-     HANDLE hConsoleOutput,
-     const void *lpBuffer,
-     DWORD nNumberOfCharsToWrite,
-     LPDWORD lpNumberOfCharsWritten,
-     LPVOID lpReserved
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-CreateConsoleScreenBuffer(
-     DWORD dwDesiredAccess,
-     DWORD dwShareMode,
-     const SECURITY_ATTRIBUTES *lpSecurityAttributes,
-     DWORD dwFlags,
-     LPVOID lpScreenBufferData
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetConsoleCP( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleCP(
-     UINT wCodePageID
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetConsoleOutputCP( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleOutputCP(
-     UINT wCodePageID
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleDisplayMode(
-     LPDWORD lpModeFlags
-    );
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetConsoleWindow(
-    void
-    );
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleProcessList(
-     LPDWORD lpdwProcessList,
-     DWORD dwProcessCount);
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddConsoleAliasA(
-     LPSTR Source,
-     LPSTR Target,
-     LPSTR ExeName);
-__declspec(dllimport)
-BOOL
-__stdcall
-AddConsoleAliasW(
-     LPWSTR Source,
-     LPWSTR Target,
-     LPWSTR ExeName);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasA(
-     LPSTR Source,
-     LPSTR TargetBuffer,
-     DWORD TargetBufferLength,
-     LPSTR ExeName);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasW(
-     LPWSTR Source,
-     LPWSTR TargetBuffer,
-     DWORD TargetBufferLength,
-     LPWSTR ExeName);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasesLengthA(
-     LPSTR ExeName);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasesLengthW(
-     LPWSTR ExeName);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasExesLengthA(
-    void);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasExesLengthW(
-    void);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasesA(
-     LPSTR AliasBuffer,
-     DWORD AliasBufferLength,
-     LPSTR ExeName);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasesW(
-     LPWSTR AliasBuffer,
-     DWORD AliasBufferLength,
-     LPWSTR ExeName);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasExesA(
-     LPSTR ExeNameBuffer,
-     DWORD ExeNameBufferLength);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasExesW(
-     LPWSTR ExeNameBuffer,
-     DWORD ExeNameBufferLength);
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagVS_FIXEDFILEINFO
-{
-    DWORD   dwSignature;            
-    DWORD   dwStrucVersion;         
-    DWORD   dwFileVersionMS;        
-    DWORD   dwFileVersionLS;        
-    DWORD   dwProductVersionMS;     
-    DWORD   dwProductVersionLS;     
-    DWORD   dwFileFlagsMask;        
-    DWORD   dwFileFlags;            
-    DWORD   dwFileOS;               
-    DWORD   dwFileType;             
-    DWORD   dwFileSubtype;          
-    DWORD   dwFileDateMS;           
-    DWORD   dwFileDateLS;           
-} VS_FIXEDFILEINFO;
-
-
-
-DWORD
-__stdcall
-VerFindFileA(
-        DWORD uFlags,
-        LPSTR szFileName,
-        LPSTR szWinDir,
-        LPSTR szAppDir,
-        LPSTR szCurDir,
-        PUINT lpuCurDirLen,
-        LPSTR szDestDir,
-        PUINT lpuDestDirLen
-        );
-DWORD
-__stdcall
-VerFindFileW(
-        DWORD uFlags,
-        LPWSTR szFileName,
-        LPWSTR szWinDir,
-        LPWSTR szAppDir,
-        LPWSTR szCurDir,
-        PUINT lpuCurDirLen,
-        LPWSTR szDestDir,
-        PUINT lpuDestDirLen
-        );
-
-
-
-
-
-
-DWORD
-__stdcall
-VerInstallFileA(
-        DWORD uFlags,
-        LPSTR szSrcFileName,
-        LPSTR szDestFileName,
-        LPSTR szSrcDir,
-        LPSTR szDestDir,
-        LPSTR szCurDir,
-        LPSTR szTmpFile,
-        PUINT lpuTmpFileLen
-        );
-DWORD
-__stdcall
-VerInstallFileW(
-        DWORD uFlags,
-        LPWSTR szSrcFileName,
-        LPWSTR szDestFileName,
-        LPWSTR szSrcDir,
-        LPWSTR szDestDir,
-        LPWSTR szCurDir,
-        LPWSTR szTmpFile,
-        PUINT lpuTmpFileLen
-        );
-
-
-
-
-
-
-
-DWORD
-__stdcall
-GetFileVersionInfoSizeA(
-         LPCSTR lptstrFilename, 
-           LPDWORD lpdwHandle
-    );                      
-
-DWORD
-__stdcall
-GetFileVersionInfoSizeW(
-         LPCWSTR lptstrFilename, 
-           LPDWORD lpdwHandle
-    );                      
-
-
-
-
-
-
-
-BOOL
-__stdcall
-GetFileVersionInfoA(
-         LPCSTR lptstrFilename, 
-         DWORD dwHandle,         
-         DWORD dwLen,            
-         LPVOID lpData
-    );                      
-
-BOOL
-__stdcall
-GetFileVersionInfoW(
-         LPCWSTR lptstrFilename, 
-         DWORD dwHandle,         
-         DWORD dwLen,            
-         LPVOID lpData
-    );                      
-
-
-
-
-
-
-DWORD
-__stdcall
-VerLanguageNameA(
-        DWORD wLang,
-        LPSTR szLang,
-        DWORD nSize
-        );
-DWORD
-__stdcall
-VerLanguageNameW(
-        DWORD wLang,
-        LPWSTR szLang,
-        DWORD nSize
-        );
-
-
-
-
-
-
-BOOL
-__stdcall
-VerQueryValueA(
-        const LPVOID pBlock,
-        LPSTR lpSubBlock,
-        LPVOID * lplpBuffer,
-        PUINT puLen
-        );
-BOOL
-__stdcall
-VerQueryValueW(
-        const LPVOID pBlock,
-        LPWSTR lpSubBlock,
-        LPVOID * lplpBuffer,
-        PUINT puLen
-        );
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ACCESS_MASK REGSAM;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct val_context {
-    int valuelen;       
-    LPVOID value_context;   
-    LPVOID val_buff_ptr;    
-};
-
-typedef struct val_context  *PVALCONTEXT;
-
-typedef struct pvalueA {           
-    LPSTR   pv_valuename;          
-    int pv_valuelen;
-    LPVOID pv_value_context;
-    DWORD pv_type;
-}PVALUEA,  *PPVALUEA;
-typedef struct pvalueW {           
-    LPWSTR  pv_valuename;          
-    int pv_valuelen;
-    LPVOID pv_value_context;
-    DWORD pv_type;
-}PVALUEW,  *PPVALUEW;
-
-typedef PVALUEW PVALUE;
-typedef PPVALUEW PPVALUE;
-
-
-
-
-
-typedef
-DWORD _cdecl
-QUERYHANDLER (LPVOID keycontext, PVALCONTEXT val_list, DWORD num_vals,
-          LPVOID outputbuffer, DWORD  *total_outlen, DWORD input_blen);
-
-typedef QUERYHANDLER  *PQUERYHANDLER;
-
-typedef struct provider_info {
-    PQUERYHANDLER pi_R0_1val;
-    PQUERYHANDLER pi_R0_allvals;
-    PQUERYHANDLER pi_R3_1val;
-    PQUERYHANDLER pi_R3_allvals;
-    DWORD pi_flags;    
-    LPVOID pi_key_context;
-}REG_PROVIDER;
-
-typedef struct provider_info  *PPROVIDER;
-
-typedef struct value_entA {
-    LPSTR   ve_valuename;
-    DWORD ve_valuelen;
-    DWORD_PTR ve_valueptr;
-    DWORD ve_type;
-}VALENTA,  *PVALENTA;
-typedef struct value_entW {
-    LPWSTR  ve_valuename;
-    DWORD ve_valuelen;
-    DWORD_PTR ve_valueptr;
-    DWORD ve_type;
-}VALENTW,  *PVALENTW;
-
-typedef VALENTW VALENT;
-typedef PVALENTW PVALENT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegCloseKey (
-         HKEY hKey
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOverridePredefKey (
-         HKEY hKey,
-           HKEY hNewHKey
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenUserClassesRoot(
-         HANDLE hToken,
-      DWORD dwOptions,
-         REGSAM samDesired,
-         PHKEY  phkResult
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenCurrentUser(
-         REGSAM samDesired,
-         PHKEY phkResult
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegDisablePredefinedCache(
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegConnectRegistryA (
-           LPCSTR lpMachineName,
-         HKEY hKey,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegConnectRegistryW (
-           LPCWSTR lpMachineName,
-         HKEY hKey,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegConnectRegistryExA (
-           LPCSTR lpMachineName,
-         HKEY hKey,
-         ULONG Flags,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegConnectRegistryExW (
-           LPCWSTR lpMachineName,
-         HKEY hKey,
-         ULONG Flags,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegCreateKeyA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegCreateKeyW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegCreateKeyExA (
-         HKEY hKey,
-         LPCSTR lpSubKey,
-      DWORD Reserved,
-           LPSTR lpClass,
-         DWORD dwOptions,
-         REGSAM samDesired,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-         PHKEY phkResult,
-           LPDWORD lpdwDisposition
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegCreateKeyExW (
-         HKEY hKey,
-         LPCWSTR lpSubKey,
-      DWORD Reserved,
-           LPWSTR lpClass,
-         DWORD dwOptions,
-         REGSAM samDesired,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-         PHKEY phkResult,
-           LPDWORD lpdwDisposition
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteKeyA (
-         HKEY hKey,
-         LPCSTR lpSubKey
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteKeyW (
-         HKEY hKey,
-         LPCWSTR lpSubKey
-    );
-
-
-
-
-
-    
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteKeyExA (
-         HKEY hKey,
-         LPCSTR lpSubKey,
-         REGSAM samDesired,
-      DWORD Reserved
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteKeyExW (
-         HKEY hKey,
-         LPCWSTR lpSubKey,
-         REGSAM samDesired,
-      DWORD Reserved
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegDisableReflectionKey (
-         HKEY hBase
-    );    
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnableReflectionKey (
-         HKEY hBase
-    );    
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryReflectionKey (
-         HKEY hBase,
-         BOOL *bIsReflectionDisabled
-    );    
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteValueA (
-         HKEY hKey,
-           LPCSTR lpValueName
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteValueW (
-         HKEY hKey,
-           LPCWSTR lpValueName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumKeyA (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPSTR lpName,
-         DWORD cchName
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumKeyW (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPWSTR lpName,
-         DWORD cchName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumKeyExA (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPSTR lpName,
-         LPDWORD lpcchName,
-      LPDWORD lpReserved,
-             LPSTR lpClass,
-           LPDWORD lpcchClass,
-           PFILETIME lpftLastWriteTime
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumKeyExW (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPWSTR lpName,
-         LPDWORD lpcchName,
-      LPDWORD lpReserved,
-             LPWSTR lpClass,
-           LPDWORD lpcchClass,
-           PFILETIME lpftLastWriteTime
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumValueA (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPSTR lpValueName,
-         LPDWORD lpcchValueName,
-      LPDWORD lpReserved,
-           LPDWORD lpType,
-           LPBYTE lpData,
-           LPDWORD lpcbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumValueW (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPWSTR lpValueName,
-         LPDWORD lpcchValueName,
-      LPDWORD lpReserved,
-           LPDWORD lpType,
-           LPBYTE lpData,
-           LPDWORD lpcbData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegFlushKey (
-         HKEY hKey
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegGetKeySecurity (
-         HKEY hKey,
-         SECURITY_INFORMATION SecurityInformation,
-           PSECURITY_DESCRIPTOR pSecurityDescriptor,
-         LPDWORD lpcbSecurityDescriptor
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegLoadKeyA (
-         HKEY    hKey,
-           LPCSTR  lpSubKey,
-         LPCSTR  lpFile
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegLoadKeyW (
-         HKEY    hKey,
-           LPCWSTR  lpSubKey,
-         LPCWSTR  lpFile
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegNotifyChangeKeyValue (
-         HKEY hKey,
-         BOOL bWatchSubtree,
-         DWORD dwNotifyFilter,
-           HANDLE hEvent,
-         BOOL fAsynchronous
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenKeyA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenKeyW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenKeyExA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-      DWORD ulOptions,
-         REGSAM samDesired,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenKeyExW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-      DWORD ulOptions,
-         REGSAM samDesired,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryInfoKeyA (
-         HKEY hKey,
-           LPSTR lpClass,
-           LPDWORD lpcchClass,
-      LPDWORD lpReserved,
-           LPDWORD lpcSubKeys,
-           LPDWORD lpcbMaxSubKeyLen,
-           LPDWORD lpcbMaxClassLen,
-           LPDWORD lpcValues,
-           LPDWORD lpcbMaxValueNameLen,
-           LPDWORD lpcbMaxValueLen,
-           LPDWORD lpcbSecurityDescriptor,
-           PFILETIME lpftLastWriteTime
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryInfoKeyW (
-         HKEY hKey,
-           LPWSTR lpClass,
-           LPDWORD lpcchClass,
-      LPDWORD lpReserved,
-           LPDWORD lpcSubKeys,
-           LPDWORD lpcbMaxSubKeyLen,
-           LPDWORD lpcbMaxClassLen,
-           LPDWORD lpcValues,
-           LPDWORD lpcbMaxValueNameLen,
-           LPDWORD lpcbMaxValueLen,
-           LPDWORD lpcbSecurityDescriptor,
-           PFILETIME lpftLastWriteTime
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryValueA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-           LPSTR lpData,
-           PLONG lpcbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryValueW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-           LPWSTR lpData,
-           PLONG lpcbData
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryMultipleValuesA (
-         HKEY hKey,
-         PVALENTA val_list,
-         DWORD num_vals,
-           LPSTR lpValueBuf,
-           LPDWORD ldwTotsize
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryMultipleValuesW (
-         HKEY hKey,
-         PVALENTW val_list,
-         DWORD num_vals,
-           LPWSTR lpValueBuf,
-           LPDWORD ldwTotsize
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryValueExA (
-         HKEY hKey,
-           LPCSTR lpValueName,
-      LPDWORD lpReserved,
-           LPDWORD lpType,
-           LPBYTE lpData,
-           LPDWORD lpcbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryValueExW (
-         HKEY hKey,
-           LPCWSTR lpValueName,
-      LPDWORD lpReserved,
-           LPDWORD lpType,
-           LPBYTE lpData,
-           LPDWORD lpcbData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegReplaceKeyA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-         LPCSTR lpNewFile,
-         LPCSTR lpOldFile
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegReplaceKeyW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-         LPCWSTR lpNewFile,
-         LPCWSTR lpOldFile
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegRestoreKeyA (
-         HKEY hKey,
-         LPCSTR lpFile,
-         DWORD dwFlags
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegRestoreKeyW (
-         HKEY hKey,
-         LPCWSTR lpFile,
-         DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSaveKeyA (
-         HKEY hKey,
-         LPCSTR lpFile,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegSaveKeyW (
-         HKEY hKey,
-         LPCWSTR lpFile,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetKeySecurity (
-         HKEY hKey,
-         SECURITY_INFORMATION SecurityInformation,
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetValueA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-         DWORD dwType,
-             LPCSTR lpData,
-         DWORD cbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetValueW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-         DWORD dwType,
-             LPCWSTR lpData,
-         DWORD cbData
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetValueExA (
-         HKEY hKey,
-           LPCSTR lpValueName,
-      DWORD Reserved,
-         DWORD dwType,
-             const BYTE* lpData,
-         DWORD cbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetValueExW (
-         HKEY hKey,
-           LPCWSTR lpValueName,
-      DWORD Reserved,
-         DWORD dwType,
-             const BYTE* lpData,
-         DWORD cbData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegUnLoadKeyA (
-         HKEY    hKey,
-           LPCSTR lpSubKey
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegUnLoadKeyW (
-         HKEY    hKey,
-           LPCWSTR lpSubKey
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegGetValueA (
-         HKEY    hkey,
-           LPCSTR  lpSubKey,
-           LPCSTR  lpValue,
-           DWORD    dwFlags,
-           LPDWORD pdwType,
-           PVOID   pvData,
-           LPDWORD pcbData 
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegGetValueW (
-         HKEY    hkey,
-           LPCWSTR  lpSubKey,
-           LPCWSTR  lpValue,
-           DWORD    dwFlags,
-           LPDWORD pdwType,
-           PVOID   pvData,
-           LPDWORD pcbData 
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitiateSystemShutdownA(
-           LPSTR lpMachineName,
-           LPSTR lpMessage,
-         DWORD dwTimeout,
-         BOOL bForceAppsClosed,
-         BOOL bRebootAfterShutdown
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-InitiateSystemShutdownW(
-           LPWSTR lpMachineName,
-           LPWSTR lpMessage,
-         DWORD dwTimeout,
-         BOOL bForceAppsClosed,
-         BOOL bRebootAfterShutdown
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AbortSystemShutdownA(
-           LPSTR lpMachineName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AbortSystemShutdownW(
-           LPWSTR lpMachineName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitiateSystemShutdownExA(
-           LPSTR lpMachineName,
-           LPSTR lpMessage,
-         DWORD dwTimeout,
-         BOOL bForceAppsClosed,
-         BOOL bRebootAfterShutdown,
-         DWORD dwReason
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-InitiateSystemShutdownExW(
-           LPWSTR lpMachineName,
-           LPWSTR lpMessage,
-         DWORD dwTimeout,
-         BOOL bForceAppsClosed,
-         BOOL bRebootAfterShutdown,
-         DWORD dwReason
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSaveKeyExA (
-         HKEY hKey,
-         LPCSTR lpFile,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-         DWORD Flags
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegSaveKeyExW (
-         HKEY hKey,
-         LPCWSTR lpFile,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-         DWORD Flags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-Wow64Win32ApiEntry (
-         DWORD dwFuncNumber,
-         DWORD dwFlag,
-         DWORD dwRes
-    );
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  _NETRESOURCEA {
-    DWORD    dwScope;
-    DWORD    dwType;
-    DWORD    dwDisplayType;
-    DWORD    dwUsage;
-    LPSTR    lpLocalName;
-    LPSTR    lpRemoteName;
-    LPSTR    lpComment ;
-    LPSTR    lpProvider;
-}NETRESOURCEA, *LPNETRESOURCEA;
-typedef struct  _NETRESOURCEW {
-    DWORD    dwScope;
-    DWORD    dwType;
-    DWORD    dwDisplayType;
-    DWORD    dwUsage;
-    LPWSTR   lpLocalName;
-    LPWSTR   lpRemoteName;
-    LPWSTR   lpComment ;
-    LPWSTR   lpProvider;
-}NETRESOURCEW, *LPNETRESOURCEW;
-
-typedef NETRESOURCEW NETRESOURCE;
-typedef LPNETRESOURCEW LPNETRESOURCE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetAddConnectionA(
-      LPCSTR   lpRemoteName,
-      LPCSTR   lpPassword,
-      LPCSTR   lpLocalName
-    );
-DWORD __stdcall
-WNetAddConnectionW(
-      LPCWSTR   lpRemoteName,
-      LPCWSTR   lpPassword,
-      LPCWSTR   lpLocalName
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetAddConnection2A(
-      LPNETRESOURCEA lpNetResource,
-      LPCSTR       lpPassword,
-      LPCSTR       lpUserName,
-      DWORD          dwFlags
-    );
-DWORD __stdcall
-WNetAddConnection2W(
-      LPNETRESOURCEW lpNetResource,
-      LPCWSTR       lpPassword,
-      LPCWSTR       lpUserName,
-      DWORD          dwFlags
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetAddConnection3A(
-      HWND           hwndOwner,
-      LPNETRESOURCEA lpNetResource,
-      LPCSTR       lpPassword,
-      LPCSTR       lpUserName,
-      DWORD          dwFlags
-    );
-DWORD __stdcall
-WNetAddConnection3W(
-      HWND           hwndOwner,
-      LPNETRESOURCEW lpNetResource,
-      LPCWSTR       lpPassword,
-      LPCWSTR       lpUserName,
-      DWORD          dwFlags
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetCancelConnectionA(
-      LPCSTR lpName,
-      BOOL     fForce
-    );
-DWORD __stdcall
-WNetCancelConnectionW(
-      LPCWSTR lpName,
-      BOOL     fForce
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetCancelConnection2A(
-      LPCSTR lpName,
-      DWORD    dwFlags,
-      BOOL     fForce
-    );
-DWORD __stdcall
-WNetCancelConnection2W(
-      LPCWSTR lpName,
-      DWORD    dwFlags,
-      BOOL     fForce
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetConnectionA(
-      LPCSTR lpLocalName,
-      LPSTR  lpRemoteName,
-       LPDWORD  lpnLength
-    );
-DWORD __stdcall
-WNetGetConnectionW(
-      LPCWSTR lpLocalName,
-      LPWSTR  lpRemoteName,
-       LPDWORD  lpnLength
-    );
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetRestoreConnectionA(
-     HWND     hwndParent,
-     LPCSTR lpDevice
-    );
-DWORD __stdcall
-WNetRestoreConnectionW(
-     HWND     hwndParent,
-     LPCWSTR lpDevice
-    );
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetUseConnectionA(
-     HWND            hwndOwner,
-     LPNETRESOURCEA  lpNetResource,
-     LPCSTR        lpPassword,
-     LPCSTR        lpUserID,
-     DWORD           dwFlags,
-     LPSTR        lpAccessName,
-      LPDWORD     lpBufferSize,
-     LPDWORD        lpResult
-    );
-DWORD __stdcall
-WNetUseConnectionW(
-     HWND            hwndOwner,
-     LPNETRESOURCEW  lpNetResource,
-     LPCWSTR        lpPassword,
-     LPCWSTR        lpUserID,
-     DWORD           dwFlags,
-     LPWSTR        lpAccessName,
-      LPDWORD     lpBufferSize,
-     LPDWORD        lpResult
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetConnectionDialog(
-     HWND  hwnd,
-     DWORD dwType
-    );
-
-DWORD __stdcall
-WNetDisconnectDialog(
-     HWND  hwnd,
-     DWORD dwType
-    );
-
-
-typedef struct _CONNECTDLGSTRUCTA{
-    DWORD cbStructure;       
-    HWND hwndOwner;          
-    LPNETRESOURCEA lpConnRes;
-    DWORD dwFlags;           
-    DWORD dwDevNum;          
-} CONNECTDLGSTRUCTA,  *LPCONNECTDLGSTRUCTA;
-typedef struct _CONNECTDLGSTRUCTW{
-    DWORD cbStructure;       
-    HWND hwndOwner;          
-    LPNETRESOURCEW lpConnRes;
-    DWORD dwFlags;           
-    DWORD dwDevNum;          
-} CONNECTDLGSTRUCTW,  *LPCONNECTDLGSTRUCTW;
-
-typedef CONNECTDLGSTRUCTW CONNECTDLGSTRUCT;
-typedef LPCONNECTDLGSTRUCTW LPCONNECTDLGSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetConnectionDialog1A(
-      LPCONNECTDLGSTRUCTA lpConnDlgStruct
-    );
-DWORD __stdcall
-WNetConnectionDialog1W(
-      LPCONNECTDLGSTRUCTW lpConnDlgStruct
-    );
-
-
-
-
-
-
-typedef struct _DISCDLGSTRUCTA{
-    DWORD           cbStructure;      
-    HWND            hwndOwner;        
-    LPSTR           lpLocalName;      
-    LPSTR           lpRemoteName;     
-    DWORD           dwFlags;          
-} DISCDLGSTRUCTA,  *LPDISCDLGSTRUCTA;
-typedef struct _DISCDLGSTRUCTW{
-    DWORD           cbStructure;      
-    HWND            hwndOwner;        
-    LPWSTR          lpLocalName;      
-    LPWSTR          lpRemoteName;     
-    DWORD           dwFlags;          
-} DISCDLGSTRUCTW,  *LPDISCDLGSTRUCTW;
-
-typedef DISCDLGSTRUCTW DISCDLGSTRUCT;
-typedef LPDISCDLGSTRUCTW LPDISCDLGSTRUCT;
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetDisconnectDialog1A(
-     LPDISCDLGSTRUCTA lpConnDlgStruct
-    );
-DWORD __stdcall
-WNetDisconnectDialog1W(
-     LPDISCDLGSTRUCTW lpConnDlgStruct
-    );
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetOpenEnumA(
-      DWORD          dwScope,
-      DWORD          dwType,
-      DWORD          dwUsage,
-      LPNETRESOURCEA lpNetResource,
-      LPHANDLE       lphEnum
-    );
-DWORD __stdcall
-WNetOpenEnumW(
-      DWORD          dwScope,
-      DWORD          dwType,
-      DWORD          dwUsage,
-      LPNETRESOURCEW lpNetResource,
-      LPHANDLE       lphEnum
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetEnumResourceA(
-      HANDLE  hEnum,
-       LPDWORD lpcCount,
-      LPVOID  lpBuffer,
-       LPDWORD lpBufferSize
-    );
-DWORD __stdcall
-WNetEnumResourceW(
-      HANDLE  hEnum,
-       LPDWORD lpcCount,
-      LPVOID  lpBuffer,
-       LPDWORD lpBufferSize
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetCloseEnum(
-     HANDLE   hEnum
-    );
-
-
-DWORD __stdcall
-WNetGetResourceParentA(
-     LPNETRESOURCEA lpNetResource,
-     LPVOID lpBuffer,
-      LPDWORD lpcbBuffer
-    );
-DWORD __stdcall
-WNetGetResourceParentW(
-     LPNETRESOURCEW lpNetResource,
-     LPVOID lpBuffer,
-      LPDWORD lpcbBuffer
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetResourceInformationA(
-     LPNETRESOURCEA  lpNetResource,
-     LPVOID          lpBuffer,
-      LPDWORD         lpcbBuffer,
-     LPSTR         *lplpSystem
-    );
-DWORD __stdcall
-WNetGetResourceInformationW(
-     LPNETRESOURCEW  lpNetResource,
-     LPVOID          lpBuffer,
-      LPDWORD         lpcbBuffer,
-     LPWSTR         *lplpSystem
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  _UNIVERSAL_NAME_INFOA {
-    LPSTR    lpUniversalName;
-}UNIVERSAL_NAME_INFOA, *LPUNIVERSAL_NAME_INFOA;
-typedef struct  _UNIVERSAL_NAME_INFOW {
-    LPWSTR   lpUniversalName;
-}UNIVERSAL_NAME_INFOW, *LPUNIVERSAL_NAME_INFOW;
-
-typedef UNIVERSAL_NAME_INFOW UNIVERSAL_NAME_INFO;
-typedef LPUNIVERSAL_NAME_INFOW LPUNIVERSAL_NAME_INFO;
-
-
-
-
-
-typedef struct  _REMOTE_NAME_INFOA {
-    LPSTR    lpUniversalName;
-    LPSTR    lpConnectionName;
-    LPSTR    lpRemainingPath;
-}REMOTE_NAME_INFOA, *LPREMOTE_NAME_INFOA;
-typedef struct  _REMOTE_NAME_INFOW {
-    LPWSTR   lpUniversalName;
-    LPWSTR   lpConnectionName;
-    LPWSTR   lpRemainingPath;
-}REMOTE_NAME_INFOW, *LPREMOTE_NAME_INFOW;
-
-typedef REMOTE_NAME_INFOW REMOTE_NAME_INFO;
-typedef LPREMOTE_NAME_INFOW LPREMOTE_NAME_INFO;
-
-
-
-
-
-DWORD __stdcall
-WNetGetUniversalNameA(
-      LPCSTR lpLocalPath,
-      DWORD    dwInfoLevel,
-      LPVOID   lpBuffer,
-       LPDWORD  lpBufferSize
-     );
-DWORD __stdcall
-WNetGetUniversalNameW(
-      LPCWSTR lpLocalPath,
-      DWORD    dwInfoLevel,
-      LPVOID   lpBuffer,
-       LPDWORD  lpBufferSize
-     );
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetUserA(
-      LPCSTR  lpName,
-      LPSTR   lpUserName,
-       LPDWORD   lpnLength
-    );
-DWORD __stdcall
-WNetGetUserW(
-      LPCWSTR  lpName,
-      LPWSTR   lpUserName,
-       LPDWORD   lpnLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetProviderNameA(
-     DWORD   dwNetType,
-     LPSTR lpProviderName,
-      LPDWORD lpBufferSize
-    );
-DWORD __stdcall
-WNetGetProviderNameW(
-     DWORD   dwNetType,
-     LPWSTR lpProviderName,
-      LPDWORD lpBufferSize
-    );
-
-
-
-
-
-
-typedef struct _NETINFOSTRUCT{
-    DWORD cbStructure;
-    DWORD dwProviderVersion;
-    DWORD dwStatus;
-    DWORD dwCharacteristics;
-    ULONG_PTR dwHandle;
-    WORD  wNetType;
-    DWORD dwPrinters;
-    DWORD dwDrives;
-} NETINFOSTRUCT,  *LPNETINFOSTRUCT;
-
-
-
-
-
-DWORD __stdcall
-WNetGetNetworkInformationA(
-     LPCSTR          lpProvider,
-     LPNETINFOSTRUCT   lpNetInfoStruct
-    );
-DWORD __stdcall
-WNetGetNetworkInformationW(
-     LPCWSTR          lpProvider,
-     LPNETINFOSTRUCT   lpNetInfoStruct
-    );
-
-
-
-
-
-
-
-
-
-
-typedef UINT ( __stdcall *PFNGETPROFILEPATHA) (
-    LPCSTR    pszUsername,
-    LPSTR     pszBuffer,
-    UINT        cbBuffer
-    );
-typedef UINT ( __stdcall *PFNGETPROFILEPATHW) (
-    LPCWSTR    pszUsername,
-    LPWSTR     pszBuffer,
-    UINT        cbBuffer
-    );
-
-
-
-
-
-
-typedef UINT ( __stdcall *PFNRECONCILEPROFILEA) (
-    LPCSTR    pszCentralFile,
-    LPCSTR    pszLocalFile,
-    DWORD       dwFlags
-    );
-typedef UINT ( __stdcall *PFNRECONCILEPROFILEW) (
-    LPCWSTR    pszCentralFile,
-    LPCWSTR    pszLocalFile,
-    DWORD       dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL ( __stdcall *PFNPROCESSPOLICIESA) (
-    HWND        hwnd,
-    LPCSTR    pszPath,
-    LPCSTR    pszUsername,
-    LPCSTR    pszComputerName,
-    DWORD       dwFlags
-    );
-typedef BOOL ( __stdcall *PFNPROCESSPOLICIESW) (
-    HWND        hwnd,
-    LPCWSTR    pszPath,
-    LPCWSTR    pszUsername,
-    LPCWSTR    pszComputerName,
-    DWORD       dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetLastErrorA(
-      LPDWORD    lpError,
-      LPSTR    lpErrorBuf,
-      DWORD      nErrorBufSize,
-      LPSTR    lpNameBuf,
-      DWORD      nNameBufSize
-    );
-DWORD __stdcall
-WNetGetLastErrorW(
-      LPDWORD    lpError,
-      LPWSTR    lpErrorBuf,
-      DWORD      nErrorBufSize,
-      LPWSTR    lpNameBuf,
-      DWORD      nNameBufSize
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _NETCONNECTINFOSTRUCT{
-    DWORD cbStructure;
-    DWORD dwFlags;
-    DWORD dwSpeed;
-    DWORD dwDelay;
-    DWORD dwOptDataSize;
-} NETCONNECTINFOSTRUCT,  *LPNETCONNECTINFOSTRUCT;
-
-
-
-
-
-
-DWORD __stdcall
-MultinetGetConnectionPerformanceA(
-         LPNETRESOURCEA lpNetResource,
-         LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
-        );
-DWORD __stdcall
-MultinetGetConnectionPerformanceW(
-         LPNETRESOURCEW lpNetResource,
-         LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
-        );
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-        unsigned short bAppReturnCode:8,
-                 reserved:6,
-                 fBusy:1,
-		 fAck:1;
-
-
-
-} DDEACK;
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-        unsigned short reserved:14,
-                 fDeferUpd:1,
-		 fAckReq:1;
-
-
-
-	short     cfFormat;
-} DDEADVISE;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-	unsigned short unused:12,
-                 fResponse:1,
-                 fRelease:1,
-                 reserved:1,
-                 fAckReq:1;
-
-
-
-	short	 cfFormat;
-	BYTE	 Value[1];
-} DDEDATA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-	unsigned short unused:13,  
-                             
-		 fRelease:1,
-		 fReserved:2;
-
-
-
-	short    cfFormat;
-	BYTE	 Value[1];  
-                            
-
-} DDEPOKE;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-        unsigned short unused:13,
-                 fRelease:1,
-                 fDeferUpd:1,
-		 fAckReq:1;
-
-
-
-	short	 cfFormat;
-} DDELN;
-
-typedef struct {
-
-	unsigned short unused:12,
-                 fAck:1,
-                 fRelease:1,
-                 fReserved:1,
-                 fAckReq:1;
-
-
-
-	short	 cfFormat;
-	BYTE	 rgb[1];
-} DDEUP;
-
-
-
-
-
-
-BOOL
-__stdcall
-DdeSetQualityOfService(
-    HWND hwndClient,
-    const SECURITY_QUALITY_OF_SERVICE *pqosNew,
-    PSECURITY_QUALITY_OF_SERVICE pqosPrev);
-
-BOOL
-__stdcall
-ImpersonateDdeClientWindow(
-    HWND hWndClient,
-    HWND hWndServer);
-
-
-
-
-LPARAM __stdcall PackDDElParam(UINT msg, UINT_PTR uiLo, UINT_PTR uiHi);
-BOOL   __stdcall UnpackDDElParam(UINT msg, LPARAM lParam, PUINT_PTR puiLo, PUINT_PTR puiHi);
-BOOL   __stdcall FreeDDElParam(UINT msg, LPARAM lParam);
-LPARAM __stdcall ReuseDDElParam(LPARAM lParam, UINT msgIn, UINT msgOut, UINT_PTR uiLo, UINT_PTR uiHi);
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-struct HCONVLIST__ { int unused; }; typedef struct HCONVLIST__ *HCONVLIST;
-struct HCONV__ { int unused; }; typedef struct HCONV__ *HCONV;
-struct HSZ__ { int unused; }; typedef struct HSZ__ *HSZ;
-struct HDDEDATA__ { int unused; }; typedef struct HDDEDATA__ *HDDEDATA;
-
-
-
-
-typedef struct tagHSZPAIR {
-    HSZ hszSvc;
-    HSZ hszTopic;
-} HSZPAIR;
-typedef HSZPAIR  *PHSZPAIR;
-
-
-
-
-typedef struct tagCONVCONTEXT {
-    UINT        cb;             
-    UINT        wFlags;         
-    UINT        wCountryID;     
-    int         iCodePage;      
-    DWORD       dwLangID;       
-    DWORD       dwSecurity;     
-    SECURITY_QUALITY_OF_SERVICE qos;  
-} CONVCONTEXT;
-typedef CONVCONTEXT  *PCONVCONTEXT;
-
-
-
-
-typedef struct tagCONVINFO {
-    DWORD   cb;            
-    DWORD_PTR hUser;       
-    HCONV   hConvPartner;  
-    HSZ     hszSvcPartner; 
-    HSZ     hszServiceReq; 
-    HSZ     hszTopic;      
-    HSZ     hszItem;       
-    UINT    wFmt;          
-    UINT    wType;         
-    UINT    wStatus;       
-    UINT    wConvst;       
-    UINT    wLastError;    
-    HCONVLIST hConvList;   
-    CONVCONTEXT ConvCtxt;  
-    HWND    hwnd;          
-    HWND    hwndPartner;   
-} CONVINFO;
-typedef CONVINFO  *PCONVINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef HDDEDATA __stdcall FNCALLBACK(UINT wType, UINT wFmt, HCONV hConv,
-        HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dwData1, ULONG_PTR dwData2);
-typedef HDDEDATA (__stdcall *PFNCALLBACK)(UINT wType, UINT wFmt, HCONV hConv,
-        HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dwData1, ULONG_PTR dwData2);
-
-
-
-
-
-UINT __stdcall DdeInitializeA(   LPDWORD pidInst,  PFNCALLBACK pfnCallback,
-         DWORD afCmd,  DWORD ulRes);
-UINT __stdcall DdeInitializeW(   LPDWORD pidInst,  PFNCALLBACK pfnCallback,
-         DWORD afCmd,  DWORD ulRes);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL __stdcall DdeUninitialize(  DWORD idInst);
-
-
-
-
-
-HCONVLIST __stdcall DdeConnectList(  DWORD idInst,  HSZ hszService,  HSZ hszTopic,
-         HCONVLIST hConvList,  PCONVCONTEXT pCC);
-HCONV __stdcall DdeQueryNextServer(  HCONVLIST hConvList,  HCONV hConvPrev);
-BOOL __stdcall DdeDisconnectList(  HCONVLIST hConvList);
-
-
-
-
-
-HCONV __stdcall DdeConnect(  DWORD idInst,  HSZ hszService,  HSZ hszTopic,
-         PCONVCONTEXT pCC);
-BOOL __stdcall DdeDisconnect(   HCONV hConv);
-HCONV __stdcall DdeReconnect(  HCONV hConv);
-UINT __stdcall DdeQueryConvInfo(  HCONV hConv,  DWORD idTransaction,   PCONVINFO pConvInfo);
-BOOL __stdcall DdeSetUserHandle(  HCONV hConv,  DWORD id,  DWORD_PTR hUser);
-BOOL __stdcall DdeAbandonTransaction(  DWORD idInst,  HCONV hConv,  DWORD idTransaction);
-
-
-
-
-
-
-BOOL __stdcall DdePostAdvise(  DWORD idInst,  HSZ hszTopic,  HSZ hszItem);
-BOOL __stdcall DdeEnableCallback(  DWORD idInst,  HCONV hConv,  UINT wCmd);
-BOOL __stdcall DdeImpersonateClient(  HCONV hConv);
-
-
-
-
-
-
-HDDEDATA __stdcall DdeNameService(  DWORD idInst,  HSZ hsz1,  HSZ hsz2,  UINT afCmd);
-
-
-
-
-
-
-
-
-
-
-HDDEDATA __stdcall DdeClientTransaction(  LPBYTE pData,  DWORD cbData,
-         HCONV hConv,  HSZ hszItem,  UINT wFmt,  UINT wType,
-         DWORD dwTimeout,  LPDWORD pdwResult);
-
-
-
-
-
-HDDEDATA __stdcall DdeCreateDataHandle(  DWORD idInst,  LPBYTE pSrc,  DWORD cb,
-         DWORD cbOff,  HSZ hszItem,  UINT wFmt,  UINT afCmd);
-HDDEDATA __stdcall DdeAddData(  HDDEDATA hData,  LPBYTE pSrc,  DWORD cb,  DWORD cbOff);
-DWORD __stdcall DdeGetData(  HDDEDATA hData,  LPBYTE pDst,  DWORD cbMax,  DWORD cbOff);
-LPBYTE __stdcall DdeAccessData(  HDDEDATA hData,  LPDWORD pcbDataSize);
-BOOL __stdcall DdeUnaccessData(  HDDEDATA hData);
-BOOL __stdcall DdeFreeDataHandle(   HDDEDATA hData);
-
-
-
-
-UINT __stdcall DdeGetLastError(  DWORD idInst);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HSZ  __stdcall DdeCreateStringHandleA(  DWORD idInst,  LPCSTR psz,  int iCodePage);
-HSZ  __stdcall DdeCreateStringHandleW(  DWORD idInst,  LPCWSTR psz,  int iCodePage);
-
-
-
-
-
-DWORD __stdcall DdeQueryStringA(  DWORD idInst,  HSZ hsz,   LPSTR psz,  DWORD cchMax,  int iCodePage);
-DWORD __stdcall DdeQueryStringW(  DWORD idInst,  HSZ hsz,   LPWSTR psz,  DWORD cchMax,  int iCodePage);
-
-
-
-
-
-BOOL __stdcall DdeFreeStringHandle(  DWORD idInst,   HSZ hsz);
-BOOL __stdcall DdeKeepStringHandle(  DWORD idInst,   HSZ hsz);
-int __stdcall DdeCmpStringHandles(  HSZ hsz1,  HSZ hsz2);
-
-
-
-
-
-
-
-typedef struct tagDDEML_MSG_HOOK_DATA {    
-    UINT_PTR uiLo;  
-    UINT_PTR uiHi;
-    DWORD cbData;   
-    DWORD Data[8];  
-} DDEML_MSG_HOOK_DATA, *PDDEML_MSG_HOOK_DATA;
-
-
-typedef struct tagMONMSGSTRUCT {
-    UINT    cb;
-    HWND    hwndTo;
-    DWORD   dwTime;
-    HANDLE  hTask;
-    UINT    wMsg;
-    WPARAM  wParam;
-    LPARAM  lParam;
-    DDEML_MSG_HOOK_DATA dmhd;       
-} MONMSGSTRUCT, *PMONMSGSTRUCT;
-
-typedef struct tagMONCBSTRUCT {
-    UINT   cb;
-    DWORD  dwTime;
-    HANDLE hTask;
-    DWORD  dwRet;
-    UINT   wType;
-    UINT   wFmt;
-    HCONV  hConv;
-    HSZ    hsz1;
-    HSZ    hsz2;
-    HDDEDATA hData;
-    ULONG_PTR dwData1;
-    ULONG_PTR dwData2;
-    CONVCONTEXT cc;                 
-    DWORD  cbData;                  
-    DWORD  Data[8];                 
-} MONCBSTRUCT, *PMONCBSTRUCT;
-
-typedef struct tagMONHSZSTRUCTA {
-    UINT   cb;
-    BOOL   fsAction;    
-    DWORD  dwTime;
-    HSZ    hsz;
-    HANDLE hTask;
-    CHAR    str[1];
-} MONHSZSTRUCTA, *PMONHSZSTRUCTA;
-typedef struct tagMONHSZSTRUCTW {
-    UINT   cb;
-    BOOL   fsAction;    
-    DWORD  dwTime;
-    HSZ    hsz;
-    HANDLE hTask;
-    WCHAR   str[1];
-} MONHSZSTRUCTW, *PMONHSZSTRUCTW;
-
-typedef MONHSZSTRUCTW MONHSZSTRUCT;
-typedef PMONHSZSTRUCTW PMONHSZSTRUCT;
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMONERRSTRUCT {
-    UINT    cb;
-    UINT    wLastError;
-    DWORD   dwTime;
-    HANDLE  hTask;
-} MONERRSTRUCT, *PMONERRSTRUCT;
-
-typedef struct tagMONLINKSTRUCT {
-    UINT    cb;
-    DWORD   dwTime;
-    HANDLE  hTask;
-    BOOL    fEstablished;
-    BOOL    fNoData;
-    HSZ     hszSvc;
-    HSZ     hszTopic;
-    HSZ     hszItem;
-    UINT    wFmt;
-    BOOL    fServer;
-    HCONV   hConvServer;
-    HCONV   hConvClient;
-} MONLINKSTRUCT, *PMONLINKSTRUCT;
-
-typedef struct tagMONCONVSTRUCT {
-    UINT    cb;
-    BOOL    fConnect;
-    DWORD   dwTime;
-    HANDLE  hTask;
-    HSZ     hszSvc;
-    HSZ     hszTopic;
-    HCONV   hConvClient;        
-    HCONV   hConvServer;        
-} MONCONVSTRUCT, *PMONCONVSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCRGB
-{
-    BYTE    bRed;
-    BYTE    bGreen;
-    BYTE    bBlue;
-    BYTE    bExtra;
-} CRGB;           
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-INT
-__stdcall
-LZStart(
-	void
-	);
-
-void
-__stdcall
-LZDone(
-	void
-	);
-
-LONG
-__stdcall
-CopyLZFile(
-	INT,
-	INT
-	);
-
-LONG
-__stdcall
-LZCopy(
-	INT,
-	INT
-	);
-
-INT
-__stdcall
-LZInit(
-	INT
-	);
-
-INT
-__stdcall
-GetExpandedNameA(
-	LPSTR,
-	LPSTR
-	);
-INT
-__stdcall
-GetExpandedNameW(
-	LPWSTR,
-	LPWSTR
-	);
-
-
-
-
-
-
-INT
-__stdcall
-LZOpenFileA(
-	LPSTR,
-	LPOFSTRUCT,
-	WORD
-	);
-INT
-__stdcall
-LZOpenFileW(
-	LPWSTR,
-	LPOFSTRUCT,
-	WORD
-	);
-
-
-
-
-
-
-LONG
-__stdcall
-LZSeek(
-	INT,
-	LONG,
-	INT
-	);
-
-INT
-__stdcall
-LZRead(
-	INT,
-	LPSTR,
-	INT
-	);
-
-void
-__stdcall
-LZClose(
-	INT
-	);
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT        MMVERSION;  
-
-
-
-typedef UINT        MMRESULT;   
-                                
-
-
-typedef UINT    *LPUINT;
-
-
-
-
-typedef struct mmtime_tag
-{
-    UINT            wType;      
-    union
-    {
-        DWORD       ms;         
-        DWORD       sample;     
-        DWORD       cb;         
-        DWORD       ticks;      
-
-        
-        struct
-        {
-            BYTE    hour;       
-            BYTE    min;        
-            BYTE    sec;        
-            BYTE    frame;      
-            BYTE    fps;        
-            BYTE    dummy;      
-
-            BYTE    pad[2];
-
-        } smpte;
-
-        
-        struct
-        {
-            DWORD songptrpos;   
-        } midi;
-    } u;
-} MMTIME, *PMMTIME,  *NPMMTIME,  *LPMMTIME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
- 
- 
- 
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                   
-                                                   
-
-
-
-
-
-
-
-
-
-
-
-
-struct HDRVR__ { int unused; }; typedef struct HDRVR__ *HDRVR;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct DRVCONFIGINFOEX {
-    DWORD   dwDCISize;
-    LPCWSTR  lpszDCISectionName;
-    LPCWSTR  lpszDCIAliasName;
-    DWORD    dnDevNode;
-} DRVCONFIGINFOEX, *PDRVCONFIGINFOEX,  *NPDRVCONFIGINFOEX,  *LPDRVCONFIGINFOEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDRVCONFIGINFO {
-    DWORD   dwDCISize;
-    LPCWSTR  lpszDCISectionName;
-    LPCWSTR  lpszDCIAliasName;
-} DRVCONFIGINFO, *PDRVCONFIGINFO,  *NPDRVCONFIGINFO,  *LPDRVCONFIGINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LRESULT (__stdcall* DRIVERPROC)(DWORD_PTR, HDRVR, UINT, LPARAM, LPARAM);
-
-__declspec(dllimport) LRESULT   __stdcall CloseDriver(  HDRVR hDriver,  LPARAM lParam1,  LPARAM lParam2);
-__declspec(dllimport) HDRVR     __stdcall OpenDriver(  LPCWSTR szDriverName,  LPCWSTR szSectionName,  LPARAM lParam2);
-__declspec(dllimport) LRESULT   __stdcall SendDriverMessage(  HDRVR hDriver,  UINT message,  LPARAM lParam1,  LPARAM lParam2);
-__declspec(dllimport) HMODULE   __stdcall DrvGetModuleHandle(  HDRVR hDriver);
-__declspec(dllimport) HMODULE   __stdcall GetDriverModuleHandle(  HDRVR hDriver);
-__declspec(dllimport) LRESULT   __stdcall DefDriverProc(  DWORD_PTR dwDriverIdentifier,  HDRVR hdrvr,  UINT uMsg,  LPARAM lParam1,  LPARAM lParam2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall DRVCALLBACK)(HDRVR hdrvr, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
-
-typedef DRVCALLBACK  *LPDRVCALLBACK;
-
-typedef DRVCALLBACK     *PDRVCALLBACK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall sndPlaySoundA(  LPCSTR pszSound,  UINT fuSound);
-__declspec(dllimport) BOOL __stdcall sndPlaySoundW(  LPCWSTR pszSound,  UINT fuSound);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall PlaySoundA(  LPCSTR pszSound,  HMODULE hmod,  DWORD fdwSound);
-__declspec(dllimport) BOOL __stdcall PlaySoundW(  LPCWSTR pszSound,  HMODULE hmod,  DWORD fdwSound);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct HWAVE__ { int unused; }; typedef struct HWAVE__ *HWAVE;
-struct HWAVEIN__ { int unused; }; typedef struct HWAVEIN__ *HWAVEIN;
-struct HWAVEOUT__ { int unused; }; typedef struct HWAVEOUT__ *HWAVEOUT;
-typedef HWAVEIN  *LPHWAVEIN;
-typedef HWAVEOUT  *LPHWAVEOUT;
-typedef DRVCALLBACK WAVECALLBACK;
-typedef WAVECALLBACK  *LPWAVECALLBACK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct wavehdr_tag {
-    LPSTR       lpData;                 
-    DWORD       dwBufferLength;         
-    DWORD       dwBytesRecorded;        
-    DWORD_PTR   dwUser;                 
-    DWORD       dwFlags;                
-    DWORD       dwLoops;                
-    struct wavehdr_tag  *lpNext;     
-    DWORD_PTR   reserved;               
-} WAVEHDR, *PWAVEHDR,  *NPWAVEHDR,  *LPWAVEHDR;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagWAVEOUTCAPSA {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    CHAR    szPname[32];  
-    DWORD   dwFormats;             
-    WORD    wChannels;             
-    WORD    wReserved1;            
-    DWORD   dwSupport;             
-} WAVEOUTCAPSA, *PWAVEOUTCAPSA, *NPWAVEOUTCAPSA, *LPWAVEOUTCAPSA;
-typedef struct tagWAVEOUTCAPSW {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    WCHAR   szPname[32];  
-    DWORD   dwFormats;             
-    WORD    wChannels;             
-    WORD    wReserved1;            
-    DWORD   dwSupport;             
-} WAVEOUTCAPSW, *PWAVEOUTCAPSW, *NPWAVEOUTCAPSW, *LPWAVEOUTCAPSW;
-
-typedef WAVEOUTCAPSW WAVEOUTCAPS;
-typedef PWAVEOUTCAPSW PWAVEOUTCAPS;
-typedef NPWAVEOUTCAPSW NPWAVEOUTCAPS;
-typedef LPWAVEOUTCAPSW LPWAVEOUTCAPS;
-
-
-
-
-
-
-typedef struct tagWAVEOUTCAPS2A {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    CHAR    szPname[32];  
-    DWORD   dwFormats;             
-    WORD    wChannels;             
-    WORD    wReserved1;            
-    DWORD   dwSupport;             
-    GUID    ManufacturerGuid;      
-    GUID    ProductGuid;           
-    GUID    NameGuid;              
-} WAVEOUTCAPS2A, *PWAVEOUTCAPS2A, *NPWAVEOUTCAPS2A, *LPWAVEOUTCAPS2A;
-typedef struct tagWAVEOUTCAPS2W {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    WCHAR   szPname[32];  
-    DWORD   dwFormats;             
-    WORD    wChannels;             
-    WORD    wReserved1;            
-    DWORD   dwSupport;             
-    GUID    ManufacturerGuid;      
-    GUID    ProductGuid;           
-    GUID    NameGuid;              
-} WAVEOUTCAPS2W, *PWAVEOUTCAPS2W, *NPWAVEOUTCAPS2W, *LPWAVEOUTCAPS2W;
-
-typedef WAVEOUTCAPS2W WAVEOUTCAPS2;
-typedef PWAVEOUTCAPS2W PWAVEOUTCAPS2;
-typedef NPWAVEOUTCAPS2W NPWAVEOUTCAPS2;
-typedef LPWAVEOUTCAPS2W LPWAVEOUTCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagWAVEINCAPSA {
-    WORD    wMid;                    
-    WORD    wPid;                    
-    MMVERSION vDriverVersion;        
-    CHAR    szPname[32];    
-    DWORD   dwFormats;               
-    WORD    wChannels;               
-    WORD    wReserved1;              
-} WAVEINCAPSA, *PWAVEINCAPSA, *NPWAVEINCAPSA, *LPWAVEINCAPSA;
-typedef struct tagWAVEINCAPSW {
-    WORD    wMid;                    
-    WORD    wPid;                    
-    MMVERSION vDriverVersion;        
-    WCHAR   szPname[32];    
-    DWORD   dwFormats;               
-    WORD    wChannels;               
-    WORD    wReserved1;              
-} WAVEINCAPSW, *PWAVEINCAPSW, *NPWAVEINCAPSW, *LPWAVEINCAPSW;
-
-typedef WAVEINCAPSW WAVEINCAPS;
-typedef PWAVEINCAPSW PWAVEINCAPS;
-typedef NPWAVEINCAPSW NPWAVEINCAPS;
-typedef LPWAVEINCAPSW LPWAVEINCAPS;
-
-
-
-
-
-
-typedef struct tagWAVEINCAPS2A {
-    WORD    wMid;                    
-    WORD    wPid;                    
-    MMVERSION vDriverVersion;        
-    CHAR    szPname[32];    
-    DWORD   dwFormats;               
-    WORD    wChannels;               
-    WORD    wReserved1;              
-    GUID    ManufacturerGuid;        
-    GUID    ProductGuid;             
-    GUID    NameGuid;                
-} WAVEINCAPS2A, *PWAVEINCAPS2A, *NPWAVEINCAPS2A, *LPWAVEINCAPS2A;
-typedef struct tagWAVEINCAPS2W {
-    WORD    wMid;                    
-    WORD    wPid;                    
-    MMVERSION vDriverVersion;        
-    WCHAR   szPname[32];    
-    DWORD   dwFormats;               
-    WORD    wChannels;               
-    WORD    wReserved1;              
-    GUID    ManufacturerGuid;        
-    GUID    ProductGuid;             
-    GUID    NameGuid;                
-} WAVEINCAPS2W, *PWAVEINCAPS2W, *NPWAVEINCAPS2W, *LPWAVEINCAPS2W;
-
-typedef WAVEINCAPS2W WAVEINCAPS2;
-typedef PWAVEINCAPS2W PWAVEINCAPS2;
-typedef NPWAVEINCAPS2W NPWAVEINCAPS2;
-typedef LPWAVEINCAPS2W LPWAVEINCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct waveformat_tag {
-    WORD    wFormatTag;        
-    WORD    nChannels;         
-    DWORD   nSamplesPerSec;    
-    DWORD   nAvgBytesPerSec;   
-    WORD    nBlockAlign;       
-} WAVEFORMAT, *PWAVEFORMAT,  *NPWAVEFORMAT,  *LPWAVEFORMAT;
-
-
-
-
-
-
-typedef struct pcmwaveformat_tag {
-    WAVEFORMAT  wf;
-    WORD        wBitsPerSample;
-} PCMWAVEFORMAT, *PPCMWAVEFORMAT,  *NPPCMWAVEFORMAT,  *LPPCMWAVEFORMAT;
-
-
-
-
-
-
-
-
-
-typedef struct tWAVEFORMATEX
-{
-    WORD        wFormatTag;         
-    WORD        nChannels;          
-    DWORD       nSamplesPerSec;     
-    DWORD       nAvgBytesPerSec;    
-    WORD        nBlockAlign;        
-    WORD        wBitsPerSample;     
-    WORD        cbSize;             
-                                    
-} WAVEFORMATEX, *PWAVEFORMATEX,  *NPWAVEFORMATEX,  *LPWAVEFORMATEX;
-
-
-typedef const WAVEFORMATEX  *LPCWAVEFORMATEX;
-
-
-__declspec(dllimport) UINT __stdcall waveOutGetNumDevs(void);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutGetDevCapsA(  UINT_PTR uDeviceID,  LPWAVEOUTCAPSA pwoc,  UINT cbwoc);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetDevCapsW(  UINT_PTR uDeviceID,  LPWAVEOUTCAPSW pwoc,  UINT cbwoc);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutGetVolume(  HWAVEOUT hwo,  LPDWORD pdwVolume);
-__declspec(dllimport) MMRESULT __stdcall waveOutSetVolume(  HWAVEOUT hwo,  DWORD dwVolume);
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutOpen(  LPHWAVEOUT phwo,  UINT uDeviceID,
-     LPCWAVEFORMATEX pwfx,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-
-__declspec(dllimport) MMRESULT __stdcall waveOutClose(   HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutPrepareHeader(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveOutUnprepareHeader(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveOutWrite(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveOutPause(  HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutRestart(  HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutReset(  HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutBreakLoop(  HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetPosition(  HWAVEOUT hwo,   LPMMTIME pmmt,  UINT cbmmt);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetPitch(  HWAVEOUT hwo,  LPDWORD pdwPitch);
-__declspec(dllimport) MMRESULT __stdcall waveOutSetPitch(  HWAVEOUT hwo,  DWORD dwPitch);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetPlaybackRate(  HWAVEOUT hwo,  LPDWORD pdwRate);
-__declspec(dllimport) MMRESULT __stdcall waveOutSetPlaybackRate(  HWAVEOUT hwo,  DWORD dwRate);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetID(  HWAVEOUT hwo,  LPUINT puDeviceID);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutMessage(  HWAVEOUT hwo,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall waveInGetNumDevs(void);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveInGetDevCapsA(  UINT_PTR uDeviceID,  LPWAVEINCAPSA pwic,  UINT cbwic);
-__declspec(dllimport) MMRESULT __stdcall waveInGetDevCapsW(  UINT_PTR uDeviceID,  LPWAVEINCAPSW pwic,  UINT cbwic);
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveInGetErrorTextA( MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) MMRESULT __stdcall waveInGetErrorTextW( MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveInOpen(  LPHWAVEIN phwi,  UINT uDeviceID,
-     LPCWAVEFORMATEX pwfx,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-
-__declspec(dllimport) MMRESULT __stdcall waveInClose(   HWAVEIN hwi);
-__declspec(dllimport) MMRESULT __stdcall waveInPrepareHeader(  HWAVEIN hwi,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveInUnprepareHeader(  HWAVEIN hwi,   LPWAVEHDR pwh, UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveInAddBuffer(  HWAVEIN hwi,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveInStart(  HWAVEIN hwi);
-__declspec(dllimport) MMRESULT __stdcall waveInStop(  HWAVEIN hwi);
-__declspec(dllimport) MMRESULT __stdcall waveInReset(  HWAVEIN hwi);
-__declspec(dllimport) MMRESULT __stdcall waveInGetPosition(  HWAVEIN hwi,   LPMMTIME pmmt,  UINT cbmmt);
-__declspec(dllimport) MMRESULT __stdcall waveInGetID(  HWAVEIN hwi,  LPUINT puDeviceID);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveInMessage(  HWAVEIN hwi,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct HMIDI__ { int unused; }; typedef struct HMIDI__ *HMIDI;
-struct HMIDIIN__ { int unused; }; typedef struct HMIDIIN__ *HMIDIIN;
-struct HMIDIOUT__ { int unused; }; typedef struct HMIDIOUT__ *HMIDIOUT;
-struct HMIDISTRM__ { int unused; }; typedef struct HMIDISTRM__ *HMIDISTRM;
-typedef HMIDI  *LPHMIDI;
-typedef HMIDIIN  *LPHMIDIIN;
-typedef HMIDIOUT  *LPHMIDIOUT;
-typedef HMIDISTRM  *LPHMIDISTRM;
-typedef DRVCALLBACK MIDICALLBACK;
-typedef MIDICALLBACK  *LPMIDICALLBACK;
-
-typedef WORD PATCHARRAY[128];
-typedef WORD  *LPPATCHARRAY;
-typedef WORD KEYARRAY[128];
-typedef WORD  *LPKEYARRAY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMIDIOUTCAPSA {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    CHAR    szPname[32];  
-    WORD    wTechnology;           
-    WORD    wVoices;               
-    WORD    wNotes;                
-    WORD    wChannelMask;          
-    DWORD   dwSupport;             
-} MIDIOUTCAPSA, *PMIDIOUTCAPSA, *NPMIDIOUTCAPSA, *LPMIDIOUTCAPSA;
-typedef struct tagMIDIOUTCAPSW {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    WCHAR   szPname[32];  
-    WORD    wTechnology;           
-    WORD    wVoices;               
-    WORD    wNotes;                
-    WORD    wChannelMask;          
-    DWORD   dwSupport;             
-} MIDIOUTCAPSW, *PMIDIOUTCAPSW, *NPMIDIOUTCAPSW, *LPMIDIOUTCAPSW;
-
-typedef MIDIOUTCAPSW MIDIOUTCAPS;
-typedef PMIDIOUTCAPSW PMIDIOUTCAPS;
-typedef NPMIDIOUTCAPSW NPMIDIOUTCAPS;
-typedef LPMIDIOUTCAPSW LPMIDIOUTCAPS;
-
-
-
-
-
-
-typedef struct tagMIDIOUTCAPS2A {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    CHAR    szPname[32];  
-    WORD    wTechnology;           
-    WORD    wVoices;               
-    WORD    wNotes;                
-    WORD    wChannelMask;          
-    DWORD   dwSupport;             
-    GUID    ManufacturerGuid;      
-    GUID    ProductGuid;           
-    GUID    NameGuid;              
-} MIDIOUTCAPS2A, *PMIDIOUTCAPS2A, *NPMIDIOUTCAPS2A, *LPMIDIOUTCAPS2A;
-typedef struct tagMIDIOUTCAPS2W {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    WCHAR   szPname[32];  
-    WORD    wTechnology;           
-    WORD    wVoices;               
-    WORD    wNotes;                
-    WORD    wChannelMask;          
-    DWORD   dwSupport;             
-    GUID    ManufacturerGuid;      
-    GUID    ProductGuid;           
-    GUID    NameGuid;              
-} MIDIOUTCAPS2W, *PMIDIOUTCAPS2W, *NPMIDIOUTCAPS2W, *LPMIDIOUTCAPS2W;
-
-typedef MIDIOUTCAPS2W MIDIOUTCAPS2;
-typedef PMIDIOUTCAPS2W PMIDIOUTCAPS2;
-typedef NPMIDIOUTCAPS2W NPMIDIOUTCAPS2;
-typedef LPMIDIOUTCAPS2W LPMIDIOUTCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMIDIINCAPSA {
-    WORD        wMid;                   
-    WORD        wPid;                   
-    MMVERSION   vDriverVersion;         
-    CHAR        szPname[32];   
-
-    DWORD   dwSupport;             
-
-} MIDIINCAPSA, *PMIDIINCAPSA, *NPMIDIINCAPSA, *LPMIDIINCAPSA;
-typedef struct tagMIDIINCAPSW {
-    WORD        wMid;                   
-    WORD        wPid;                   
-    MMVERSION   vDriverVersion;         
-    WCHAR       szPname[32];   
-
-    DWORD   dwSupport;             
-
-} MIDIINCAPSW, *PMIDIINCAPSW, *NPMIDIINCAPSW, *LPMIDIINCAPSW;
-
-typedef MIDIINCAPSW MIDIINCAPS;
-typedef PMIDIINCAPSW PMIDIINCAPS;
-typedef NPMIDIINCAPSW NPMIDIINCAPS;
-typedef LPMIDIINCAPSW LPMIDIINCAPS;
-
-
-
-
-
-
-typedef struct tagMIDIINCAPS2A {
-    WORD        wMid;                   
-    WORD        wPid;                   
-    MMVERSION   vDriverVersion;         
-    CHAR        szPname[32];   
-
-    DWORD       dwSupport;              
-
-    GUID        ManufacturerGuid;       
-    GUID        ProductGuid;            
-    GUID        NameGuid;               
-} MIDIINCAPS2A, *PMIDIINCAPS2A, *NPMIDIINCAPS2A, *LPMIDIINCAPS2A;
-typedef struct tagMIDIINCAPS2W {
-    WORD        wMid;                   
-    WORD        wPid;                   
-    MMVERSION   vDriverVersion;         
-    WCHAR       szPname[32];   
-
-    DWORD       dwSupport;              
-
-    GUID        ManufacturerGuid;       
-    GUID        ProductGuid;            
-    GUID        NameGuid;               
-} MIDIINCAPS2W, *PMIDIINCAPS2W, *NPMIDIINCAPS2W, *LPMIDIINCAPS2W;
-
-typedef MIDIINCAPS2W MIDIINCAPS2;
-typedef PMIDIINCAPS2W PMIDIINCAPS2;
-typedef NPMIDIINCAPS2W NPMIDIINCAPS2;
-typedef LPMIDIINCAPS2W LPMIDIINCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct midihdr_tag {
-    LPSTR       lpData;               
-    DWORD       dwBufferLength;       
-    DWORD       dwBytesRecorded;      
-    DWORD_PTR   dwUser;               
-    DWORD       dwFlags;              
-    struct midihdr_tag  *lpNext;   
-    DWORD_PTR   reserved;             
-
-    DWORD       dwOffset;             
-    DWORD_PTR   dwReserved[8];        
-
-} MIDIHDR, *PMIDIHDR,  *NPMIDIHDR,  *LPMIDIHDR;
-
-
-
-typedef struct midievent_tag
-{
-    DWORD       dwDeltaTime;          
-    DWORD       dwStreamID;           
-    DWORD       dwEvent;              
-    DWORD       dwParms[1];           
-} MIDIEVENT;
-
-typedef struct midistrmbuffver_tag
-{
-    DWORD       dwVersion;                  
-    DWORD       dwMid;                      
-    DWORD       dwOEMVersion;               
-} MIDISTRMBUFFVER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct midiproptimediv_tag
-{
-    DWORD       cbStruct;
-    DWORD       dwTimeDiv;
-} MIDIPROPTIMEDIV,  *LPMIDIPROPTIMEDIV;
-
-typedef struct midiproptempo_tag
-{
-    DWORD       cbStruct;
-    DWORD       dwTempo;
-} MIDIPROPTEMPO,  *LPMIDIPROPTEMPO;
-
-
-
-
-__declspec(dllimport) UINT __stdcall midiOutGetNumDevs(void);
-
-__declspec(dllimport) MMRESULT __stdcall midiStreamOpen(  LPHMIDISTRM phms,  LPUINT puDeviceID,  DWORD cMidi,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-__declspec(dllimport) MMRESULT __stdcall midiStreamClose(  HMIDISTRM hms);
-
-__declspec(dllimport) MMRESULT __stdcall midiStreamProperty(  HMIDISTRM hms,  LPBYTE lppropdata,  DWORD dwProperty);
-__declspec(dllimport) MMRESULT __stdcall midiStreamPosition(  HMIDISTRM hms,  LPMMTIME lpmmt,  UINT cbmmt);
-
-__declspec(dllimport) MMRESULT __stdcall midiStreamOut(  HMIDISTRM hms,  LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiStreamPause(  HMIDISTRM hms);
-__declspec(dllimport) MMRESULT __stdcall midiStreamRestart(  HMIDISTRM hms);
-__declspec(dllimport) MMRESULT __stdcall midiStreamStop(  HMIDISTRM hms);
-
-
-__declspec(dllimport) MMRESULT __stdcall midiConnect(  HMIDI hmi,  HMIDIOUT hmo,  LPVOID pReserved);
-__declspec(dllimport) MMRESULT __stdcall midiDisconnect(  HMIDI hmi,  HMIDIOUT hmo,  LPVOID pReserved);
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutGetDevCapsA(  UINT_PTR uDeviceID,  LPMIDIOUTCAPSA pmoc,  UINT cbmoc);
-__declspec(dllimport) MMRESULT __stdcall midiOutGetDevCapsW(  UINT_PTR uDeviceID,  LPMIDIOUTCAPSW pmoc,  UINT cbmoc);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutGetVolume(  HMIDIOUT hmo,  LPDWORD pdwVolume);
-__declspec(dllimport) MMRESULT __stdcall midiOutSetVolume(  HMIDIOUT hmo,  DWORD dwVolume);
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) MMRESULT __stdcall midiOutGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutOpen(  LPHMIDIOUT phmo,  UINT uDeviceID,
-     DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-__declspec(dllimport) MMRESULT __stdcall midiOutClose(   HMIDIOUT hmo);
-__declspec(dllimport) MMRESULT __stdcall midiOutPrepareHeader(  HMIDIOUT hmo,   LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiOutUnprepareHeader( HMIDIOUT hmo,   LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiOutShortMsg(  HMIDIOUT hmo,  DWORD dwMsg);
-__declspec(dllimport) MMRESULT __stdcall midiOutLongMsg( HMIDIOUT hmo,  LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiOutReset(  HMIDIOUT hmo);
-__declspec(dllimport) MMRESULT __stdcall midiOutCachePatches(  HMIDIOUT hmo,  UINT uBank,  LPWORD pwpa,  UINT fuCache);
-__declspec(dllimport) MMRESULT __stdcall midiOutCacheDrumPatches(  HMIDIOUT hmo,  UINT uPatch,  LPWORD pwkya,  UINT fuCache);
-__declspec(dllimport) MMRESULT __stdcall midiOutGetID(  HMIDIOUT hmo,  LPUINT puDeviceID);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutMessage(  HMIDIOUT hmo,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall midiInGetNumDevs(void);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiInGetDevCapsA(  UINT_PTR uDeviceID,  LPMIDIINCAPSA pmic,  UINT cbmic);
-__declspec(dllimport) MMRESULT __stdcall midiInGetDevCapsW(  UINT_PTR uDeviceID,  LPMIDIINCAPSW pmic,  UINT cbmic);
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiInGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) MMRESULT __stdcall midiInGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiInOpen(  LPHMIDIIN phmi,  UINT uDeviceID,
-         DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-__declspec(dllimport) MMRESULT __stdcall midiInClose(   HMIDIIN hmi);
-__declspec(dllimport) MMRESULT __stdcall midiInPrepareHeader(  HMIDIIN hmi,   LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiInUnprepareHeader(  HMIDIIN hmi,   LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiInAddBuffer(  HMIDIIN hmi,  LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiInStart(  HMIDIIN hmi);
-__declspec(dllimport) MMRESULT __stdcall midiInStop(  HMIDIIN hmi);
-__declspec(dllimport) MMRESULT __stdcall midiInReset(  HMIDIIN hmi);
-__declspec(dllimport) MMRESULT __stdcall midiInGetID(  HMIDIIN hmi,  LPUINT puDeviceID);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiInMessage(  HMIDIIN hmi,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagAUXCAPSA {
-    WORD        wMid;                
-    WORD        wPid;                
-    MMVERSION   vDriverVersion;      
-    CHAR        szPname[32];
-    WORD        wTechnology;         
-    WORD        wReserved1;          
-    DWORD       dwSupport;           
-} AUXCAPSA, *PAUXCAPSA, *NPAUXCAPSA, *LPAUXCAPSA;
-typedef struct tagAUXCAPSW {
-    WORD        wMid;                
-    WORD        wPid;                
-    MMVERSION   vDriverVersion;      
-    WCHAR       szPname[32];
-    WORD        wTechnology;         
-    WORD        wReserved1;          
-    DWORD       dwSupport;           
-} AUXCAPSW, *PAUXCAPSW, *NPAUXCAPSW, *LPAUXCAPSW;
-
-typedef AUXCAPSW AUXCAPS;
-typedef PAUXCAPSW PAUXCAPS;
-typedef NPAUXCAPSW NPAUXCAPS;
-typedef LPAUXCAPSW LPAUXCAPS;
-
-
-
-
-
-
-typedef struct tagAUXCAPS2A {
-    WORD        wMid;                
-    WORD        wPid;                
-    MMVERSION   vDriverVersion;      
-    CHAR        szPname[32];
-    WORD        wTechnology;         
-    WORD        wReserved1;          
-    DWORD       dwSupport;           
-    GUID        ManufacturerGuid;    
-    GUID        ProductGuid;         
-    GUID        NameGuid;            
-} AUXCAPS2A, *PAUXCAPS2A, *NPAUXCAPS2A, *LPAUXCAPS2A;
-typedef struct tagAUXCAPS2W {
-    WORD        wMid;                
-    WORD        wPid;                
-    MMVERSION   vDriverVersion;      
-    WCHAR       szPname[32];
-    WORD        wTechnology;         
-    WORD        wReserved1;          
-    DWORD       dwSupport;           
-    GUID        ManufacturerGuid;    
-    GUID        ProductGuid;         
-    GUID        NameGuid;            
-} AUXCAPS2W, *PAUXCAPS2W, *NPAUXCAPS2W, *LPAUXCAPS2W;
-
-typedef AUXCAPS2W AUXCAPS2;
-typedef PAUXCAPS2W PAUXCAPS2;
-typedef NPAUXCAPS2W NPAUXCAPS2;
-typedef LPAUXCAPS2W LPAUXCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall auxGetNumDevs(void);
-
-
-__declspec(dllimport) MMRESULT __stdcall auxGetDevCapsA(  UINT_PTR uDeviceID,  LPAUXCAPSA pac,  UINT cbac);
-__declspec(dllimport) MMRESULT __stdcall auxGetDevCapsW(  UINT_PTR uDeviceID,  LPAUXCAPSW pac,  UINT cbac);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall auxSetVolume(  UINT uDeviceID,  DWORD dwVolume);
-__declspec(dllimport) MMRESULT __stdcall auxGetVolume(  UINT uDeviceID,  LPDWORD pdwVolume);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall auxOutMessage(  UINT uDeviceID,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct HMIXEROBJ__ { int unused; }; typedef struct HMIXEROBJ__ *HMIXEROBJ;
-typedef HMIXEROBJ  *LPHMIXEROBJ;
-
-struct HMIXER__ { int unused; }; typedef struct HMIXER__ *HMIXER;
-typedef HMIXER      *LPHMIXER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall mixerGetNumDevs(void);
-
-
-
-typedef struct tagMIXERCAPSA {
-    WORD            wMid;                   
-    WORD            wPid;                   
-    MMVERSION       vDriverVersion;         
-    CHAR            szPname[32];   
-    DWORD           fdwSupport;             
-    DWORD           cDestinations;          
-} MIXERCAPSA, *PMIXERCAPSA, *LPMIXERCAPSA;
-typedef struct tagMIXERCAPSW {
-    WORD            wMid;                   
-    WORD            wPid;                   
-    MMVERSION       vDriverVersion;         
-    WCHAR           szPname[32];   
-    DWORD           fdwSupport;             
-    DWORD           cDestinations;          
-} MIXERCAPSW, *PMIXERCAPSW, *LPMIXERCAPSW;
-
-typedef MIXERCAPSW MIXERCAPS;
-typedef PMIXERCAPSW PMIXERCAPS;
-typedef LPMIXERCAPSW LPMIXERCAPS;
-
-
-
-
-
-typedef struct tagMIXERCAPS2A {
-    WORD            wMid;                   
-    WORD            wPid;                   
-    MMVERSION       vDriverVersion;         
-    CHAR            szPname[32];   
-    DWORD           fdwSupport;             
-    DWORD           cDestinations;          
-    GUID            ManufacturerGuid;       
-    GUID            ProductGuid;            
-    GUID            NameGuid;               
-} MIXERCAPS2A, *PMIXERCAPS2A, *LPMIXERCAPS2A;
-typedef struct tagMIXERCAPS2W {
-    WORD            wMid;                   
-    WORD            wPid;                   
-    MMVERSION       vDriverVersion;         
-    WCHAR           szPname[32];   
-    DWORD           fdwSupport;             
-    DWORD           cDestinations;          
-    GUID            ManufacturerGuid;       
-    GUID            ProductGuid;            
-    GUID            NameGuid;               
-} MIXERCAPS2W, *PMIXERCAPS2W, *LPMIXERCAPS2W;
-
-typedef MIXERCAPS2W MIXERCAPS2;
-typedef PMIXERCAPS2W PMIXERCAPS2;
-typedef LPMIXERCAPS2W LPMIXERCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetDevCapsA(  UINT_PTR uMxId,  LPMIXERCAPSA pmxcaps,  UINT cbmxcaps);
-__declspec(dllimport) MMRESULT __stdcall mixerGetDevCapsW(  UINT_PTR uMxId,  LPMIXERCAPSW pmxcaps,  UINT cbmxcaps);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerOpen(  LPHMIXER phmx,  UINT uMxId,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerClose(   HMIXER hmx);
-
-__declspec(dllimport) DWORD __stdcall mixerMessage(  HMIXER hmx,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);
-
-
-
-typedef struct tagMIXERLINEA {
-    DWORD       cbStruct;               
-    DWORD       dwDestination;          
-    DWORD       dwSource;               
-    DWORD       dwLineID;               
-    DWORD       fdwLine;                
-    DWORD_PTR   dwUser;                 
-    DWORD       dwComponentType;        
-    DWORD       cChannels;              
-    DWORD       cConnections;           
-    DWORD       cControls;              
-    CHAR        szShortName[16];
-    CHAR        szName[64];
-    struct {
-        DWORD       dwType;                 
-        DWORD       dwDeviceID;             
-        WORD        wMid;                   
-        WORD        wPid;                   
-        MMVERSION   vDriverVersion;         
-        CHAR        szPname[32];   
-    } Target;
-} MIXERLINEA, *PMIXERLINEA, *LPMIXERLINEA;
-typedef struct tagMIXERLINEW {
-    DWORD       cbStruct;               
-    DWORD       dwDestination;          
-    DWORD       dwSource;               
-    DWORD       dwLineID;               
-    DWORD       fdwLine;                
-    DWORD_PTR   dwUser;                 
-    DWORD       dwComponentType;        
-    DWORD       cChannels;              
-    DWORD       cConnections;           
-    DWORD       cControls;              
-    WCHAR       szShortName[16];
-    WCHAR       szName[64];
-    struct {
-        DWORD       dwType;                 
-        DWORD       dwDeviceID;             
-        WORD        wMid;                   
-        WORD        wPid;                   
-        MMVERSION   vDriverVersion;         
-        WCHAR       szPname[32];   
-    } Target;
-} MIXERLINEW, *PMIXERLINEW, *LPMIXERLINEW;
-
-typedef MIXERLINEW MIXERLINE;
-typedef PMIXERLINEW PMIXERLINE;
-typedef LPMIXERLINEW LPMIXERLINE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetLineInfoA(  HMIXEROBJ hmxobj,  LPMIXERLINEA pmxl,  DWORD fdwInfo);
-__declspec(dllimport) MMRESULT __stdcall mixerGetLineInfoW(  HMIXEROBJ hmxobj,  LPMIXERLINEW pmxl,  DWORD fdwInfo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetID(  HMIXEROBJ hmxobj,  UINT  *puMxId,  DWORD fdwId);
-
-
-
-
-
-
-
-
-typedef struct tagMIXERCONTROLA {
-    DWORD           cbStruct;           
-    DWORD           dwControlID;        
-    DWORD           dwControlType;      
-    DWORD           fdwControl;         
-    DWORD           cMultipleItems;     
-    CHAR            szShortName[16];
-    CHAR            szName[64];
-    union {
-        struct {
-            LONG    lMinimum;           
-            LONG    lMaximum;           
-        };
-        struct {
-            DWORD   dwMinimum;          
-            DWORD   dwMaximum;          
-        };
-        DWORD       dwReserved[6];
-    } Bounds;
-    union {
-        DWORD       cSteps;             
-        DWORD       cbCustomData;       
-        DWORD       dwReserved[6];      
-    } Metrics;
-} MIXERCONTROLA, *PMIXERCONTROLA, *LPMIXERCONTROLA;
-typedef struct tagMIXERCONTROLW {
-    DWORD           cbStruct;           
-    DWORD           dwControlID;        
-    DWORD           dwControlType;      
-    DWORD           fdwControl;         
-    DWORD           cMultipleItems;     
-    WCHAR           szShortName[16];
-    WCHAR           szName[64];
-    union {
-        struct {
-            LONG    lMinimum;           
-            LONG    lMaximum;           
-        };
-        struct {
-            DWORD   dwMinimum;          
-            DWORD   dwMaximum;          
-        };
-        DWORD       dwReserved[6];
-    } Bounds;
-    union {
-        DWORD       cSteps;             
-        DWORD       cbCustomData;       
-        DWORD       dwReserved[6];      
-    } Metrics;
-} MIXERCONTROLW, *PMIXERCONTROLW, *LPMIXERCONTROLW;
-
-typedef MIXERCONTROLW MIXERCONTROL;
-typedef PMIXERCONTROLW PMIXERCONTROL;
-typedef LPMIXERCONTROLW LPMIXERCONTROL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMIXERLINECONTROLSA {
-    DWORD           cbStruct;       
-    DWORD           dwLineID;       
-    union {
-        DWORD       dwControlID;    
-        DWORD       dwControlType;  
-    };
-    DWORD           cControls;      
-    DWORD           cbmxctrl;       
-    LPMIXERCONTROLA pamxctrl;       
-} MIXERLINECONTROLSA, *PMIXERLINECONTROLSA, *LPMIXERLINECONTROLSA;
-typedef struct tagMIXERLINECONTROLSW {
-    DWORD           cbStruct;       
-    DWORD           dwLineID;       
-    union {
-        DWORD       dwControlID;    
-        DWORD       dwControlType;  
-    };
-    DWORD           cControls;      
-    DWORD           cbmxctrl;       
-    LPMIXERCONTROLW pamxctrl;       
-} MIXERLINECONTROLSW, *PMIXERLINECONTROLSW, *LPMIXERLINECONTROLSW;
-
-typedef MIXERLINECONTROLSW MIXERLINECONTROLS;
-typedef PMIXERLINECONTROLSW PMIXERLINECONTROLS;
-typedef LPMIXERLINECONTROLSW LPMIXERLINECONTROLS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetLineControlsA(  HMIXEROBJ hmxobj,   LPMIXERLINECONTROLSA pmxlc,  DWORD fdwControls);
-__declspec(dllimport) MMRESULT __stdcall mixerGetLineControlsW(  HMIXEROBJ hmxobj,   LPMIXERLINECONTROLSW pmxlc,  DWORD fdwControls);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tMIXERCONTROLDETAILS {
-    DWORD           cbStruct;       
-    DWORD           dwControlID;    
-    DWORD           cChannels;      
-    union {
-        HWND        hwndOwner;      
-        DWORD       cMultipleItems; 
-    };
-    DWORD           cbDetails;      
-    LPVOID          paDetails;      
-} MIXERCONTROLDETAILS, *PMIXERCONTROLDETAILS,  *LPMIXERCONTROLDETAILS;
-
-
-
-
-
-
-
-
-typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA {
-    DWORD           dwParam1;
-    DWORD           dwParam2;
-    CHAR            szName[64];
-} MIXERCONTROLDETAILS_LISTTEXTA, *PMIXERCONTROLDETAILS_LISTTEXTA, *LPMIXERCONTROLDETAILS_LISTTEXTA;
-typedef struct tagMIXERCONTROLDETAILS_LISTTEXTW {
-    DWORD           dwParam1;
-    DWORD           dwParam2;
-    WCHAR           szName[64];
-} MIXERCONTROLDETAILS_LISTTEXTW, *PMIXERCONTROLDETAILS_LISTTEXTW, *LPMIXERCONTROLDETAILS_LISTTEXTW;
-
-typedef MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT;
-typedef PMIXERCONTROLDETAILS_LISTTEXTW PMIXERCONTROLDETAILS_LISTTEXT;
-typedef LPMIXERCONTROLDETAILS_LISTTEXTW LPMIXERCONTROLDETAILS_LISTTEXT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tMIXERCONTROLDETAILS_BOOLEAN {
-    LONG            fValue;
-}       MIXERCONTROLDETAILS_BOOLEAN,
-      *PMIXERCONTROLDETAILS_BOOLEAN,
-  *LPMIXERCONTROLDETAILS_BOOLEAN;
-
-typedef struct tMIXERCONTROLDETAILS_SIGNED {
-    LONG            lValue;
-}       MIXERCONTROLDETAILS_SIGNED,
-      *PMIXERCONTROLDETAILS_SIGNED,
-  *LPMIXERCONTROLDETAILS_SIGNED;
-
-
-typedef struct tMIXERCONTROLDETAILS_UNSIGNED {
-    DWORD           dwValue;
-}       MIXERCONTROLDETAILS_UNSIGNED,
-      *PMIXERCONTROLDETAILS_UNSIGNED,
-  *LPMIXERCONTROLDETAILS_UNSIGNED;
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetControlDetailsA(  HMIXEROBJ hmxobj,   LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);
-__declspec(dllimport) MMRESULT __stdcall mixerGetControlDetailsW(  HMIXEROBJ hmxobj,   LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerSetControlDetails(  HMIXEROBJ hmxobj,  LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
-
-typedef TIMECALLBACK  *LPTIMECALLBACK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-                                        
-
-
-
-
-
-typedef struct timecaps_tag {
-    UINT    wPeriodMin;     
-    UINT    wPeriodMax;     
-} TIMECAPS, *PTIMECAPS,  *NPTIMECAPS,  *LPTIMECAPS;
-
-
-__declspec(dllimport) MMRESULT __stdcall timeGetSystemTime(  LPMMTIME pmmt,  UINT cbmmt);
-__declspec(dllimport) DWORD __stdcall timeGetTime(void);
-__declspec(dllimport) MMRESULT __stdcall timeSetEvent(  UINT uDelay,  UINT uResolution,
-     LPTIMECALLBACK fptc,  DWORD_PTR dwUser,  UINT fuEvent);
-__declspec(dllimport) MMRESULT __stdcall timeKillEvent(  UINT uTimerID);
-__declspec(dllimport) MMRESULT __stdcall timeGetDevCaps(  LPTIMECAPS ptc,  UINT cbtc);
-__declspec(dllimport) MMRESULT __stdcall timeBeginPeriod(  UINT uPeriod);
-__declspec(dllimport) MMRESULT __stdcall timeEndPeriod(  UINT uPeriod);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagJOYCAPSA {
-    WORD    wMid;                
-    WORD    wPid;                
-    CHAR    szPname[32];
-    UINT    wXmin;               
-    UINT    wXmax;               
-    UINT    wYmin;               
-    UINT    wYmax;               
-    UINT    wZmin;               
-    UINT    wZmax;               
-    UINT    wNumButtons;         
-    UINT    wPeriodMin;          
-    UINT    wPeriodMax;          
-
-    UINT    wRmin;               
-    UINT    wRmax;               
-    UINT    wUmin;               
-    UINT    wUmax;               
-    UINT    wVmin;               
-    UINT    wVmax;               
-    UINT    wCaps;               
-    UINT    wMaxAxes;            
-    UINT    wNumAxes;            
-    UINT    wMaxButtons;         
-    CHAR    szRegKey[32];
-    CHAR    szOEMVxD[260]; 
-
-} JOYCAPSA, *PJOYCAPSA, *NPJOYCAPSA, *LPJOYCAPSA;
-typedef struct tagJOYCAPSW {
-    WORD    wMid;                
-    WORD    wPid;                
-    WCHAR   szPname[32];
-    UINT    wXmin;               
-    UINT    wXmax;               
-    UINT    wYmin;               
-    UINT    wYmax;               
-    UINT    wZmin;               
-    UINT    wZmax;               
-    UINT    wNumButtons;         
-    UINT    wPeriodMin;          
-    UINT    wPeriodMax;          
-
-    UINT    wRmin;               
-    UINT    wRmax;               
-    UINT    wUmin;               
-    UINT    wUmax;               
-    UINT    wVmin;               
-    UINT    wVmax;               
-    UINT    wCaps;               
-    UINT    wMaxAxes;            
-    UINT    wNumAxes;            
-    UINT    wMaxButtons;         
-    WCHAR   szRegKey[32];
-    WCHAR   szOEMVxD[260]; 
-
-} JOYCAPSW, *PJOYCAPSW, *NPJOYCAPSW, *LPJOYCAPSW;
-
-typedef JOYCAPSW JOYCAPS;
-typedef PJOYCAPSW PJOYCAPS;
-typedef NPJOYCAPSW NPJOYCAPS;
-typedef LPJOYCAPSW LPJOYCAPS;
-
-
-
-
-
-
-typedef struct tagJOYCAPS2A {
-    WORD    wMid;                
-    WORD    wPid;                
-    CHAR    szPname[32];
-    UINT    wXmin;               
-    UINT    wXmax;               
-    UINT    wYmin;               
-    UINT    wYmax;               
-    UINT    wZmin;               
-    UINT    wZmax;               
-    UINT    wNumButtons;         
-    UINT    wPeriodMin;          
-    UINT    wPeriodMax;          
-    UINT    wRmin;               
-    UINT    wRmax;               
-    UINT    wUmin;               
-    UINT    wUmax;               
-    UINT    wVmin;               
-    UINT    wVmax;               
-    UINT    wCaps;               
-    UINT    wMaxAxes;            
-    UINT    wNumAxes;            
-    UINT    wMaxButtons;         
-    CHAR    szRegKey[32];
-    CHAR    szOEMVxD[260]; 
-    GUID    ManufacturerGuid;    
-    GUID    ProductGuid;         
-    GUID    NameGuid;            
-} JOYCAPS2A, *PJOYCAPS2A, *NPJOYCAPS2A, *LPJOYCAPS2A;
-typedef struct tagJOYCAPS2W {
-    WORD    wMid;                
-    WORD    wPid;                
-    WCHAR   szPname[32];
-    UINT    wXmin;               
-    UINT    wXmax;               
-    UINT    wYmin;               
-    UINT    wYmax;               
-    UINT    wZmin;               
-    UINT    wZmax;               
-    UINT    wNumButtons;         
-    UINT    wPeriodMin;          
-    UINT    wPeriodMax;          
-    UINT    wRmin;               
-    UINT    wRmax;               
-    UINT    wUmin;               
-    UINT    wUmax;               
-    UINT    wVmin;               
-    UINT    wVmax;               
-    UINT    wCaps;               
-    UINT    wMaxAxes;            
-    UINT    wNumAxes;            
-    UINT    wMaxButtons;         
-    WCHAR   szRegKey[32];
-    WCHAR   szOEMVxD[260]; 
-    GUID    ManufacturerGuid;    
-    GUID    ProductGuid;         
-    GUID    NameGuid;            
-} JOYCAPS2W, *PJOYCAPS2W, *NPJOYCAPS2W, *LPJOYCAPS2W;
-
-typedef JOYCAPS2W JOYCAPS2;
-typedef PJOYCAPS2W PJOYCAPS2;
-typedef NPJOYCAPS2W NPJOYCAPS2;
-typedef LPJOYCAPS2W LPJOYCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct joyinfo_tag {
-    UINT wXpos;                 
-    UINT wYpos;                 
-    UINT wZpos;                 
-    UINT wButtons;              
-} JOYINFO, *PJOYINFO,  *NPJOYINFO,  *LPJOYINFO;
-
-
-typedef struct joyinfoex_tag {
-    DWORD dwSize;                
-    DWORD dwFlags;               
-    DWORD dwXpos;                
-    DWORD dwYpos;                
-    DWORD dwZpos;                
-    DWORD dwRpos;                
-    DWORD dwUpos;                
-    DWORD dwVpos;                
-    DWORD dwButtons;             
-    DWORD dwButtonNumber;        
-    DWORD dwPOV;                 
-    DWORD dwReserved1;           
-    DWORD dwReserved2;           
-} JOYINFOEX, *PJOYINFOEX,  *NPJOYINFOEX,  *LPJOYINFOEX;
-
-
-
-__declspec(dllimport) UINT __stdcall joyGetNumDevs(void);
-
-
-__declspec(dllimport) MMRESULT __stdcall joyGetDevCapsA(  UINT_PTR uJoyID,  LPJOYCAPSA pjc,  UINT cbjc);
-__declspec(dllimport) MMRESULT __stdcall joyGetDevCapsW(  UINT_PTR uJoyID,  LPJOYCAPSW pjc,  UINT cbjc);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall joyGetPos(  UINT uJoyID,  LPJOYINFO pji);
-
-
-__declspec(dllimport) MMRESULT __stdcall joyGetPosEx(  UINT uJoyID,  LPJOYINFOEX pji);
-
-
-__declspec(dllimport) MMRESULT __stdcall joyGetThreshold(  UINT uJoyID,  LPUINT puThreshold);
-__declspec(dllimport) MMRESULT __stdcall joyReleaseCapture(  UINT uJoyID);
-__declspec(dllimport) MMRESULT __stdcall joySetCapture(  HWND hwnd,  UINT uJoyID,  UINT uPeriod,
-     BOOL fChanged);
-__declspec(dllimport) MMRESULT __stdcall joySetThreshold(  UINT uJoyID,  UINT uThreshold);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD           FOURCC;         
-typedef char  *    HPSTR;          
-struct HMMIO__ { int unused; }; typedef struct HMMIO__ *HMMIO;                  
-typedef LRESULT (__stdcall MMIOPROC)(LPSTR lpmmioinfo, UINT uMsg,
-            LPARAM lParam1, LPARAM lParam2);
-typedef MMIOPROC  *LPMMIOPROC;
-
-
-
-typedef struct _MMIOINFO
-{
-        
-        DWORD           dwFlags;        
-        FOURCC          fccIOProc;      
-        LPMMIOPROC      pIOProc;        
-        UINT            wErrorRet;      
-        HTASK           htask;          
-
-        
-        LONG            cchBuffer;      
-        HPSTR           pchBuffer;      
-        HPSTR           pchNext;        
-        HPSTR           pchEndRead;     
-        HPSTR           pchEndWrite;    
-        LONG            lBufOffset;     
-
-        
-        LONG            lDiskOffset;    
-        DWORD           adwInfo[3];     
-
-        
-        DWORD           dwReserved1;    
-        DWORD           dwReserved2;    
-        HMMIO           hmmio;          
-} MMIOINFO, *PMMIOINFO,  *NPMMIOINFO,  *LPMMIOINFO;
-typedef const MMIOINFO  *LPCMMIOINFO;
-
-
-typedef struct _MMCKINFO
-{
-        FOURCC          ckid;           
-        DWORD           cksize;         
-        FOURCC          fccType;        
-        DWORD           dwDataOffset;   
-        DWORD           dwFlags;        
-} MMCKINFO, *PMMCKINFO,  *NPMMCKINFO,  *LPMMCKINFO;
-typedef const MMCKINFO *LPCMMCKINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) FOURCC __stdcall mmioStringToFOURCCA(  LPCSTR sz,  UINT uFlags);
-__declspec(dllimport) FOURCC __stdcall mmioStringToFOURCCW(  LPCWSTR sz,  UINT uFlags);
-
-
-
-
-
-__declspec(dllimport) LPMMIOPROC __stdcall mmioInstallIOProcA(  FOURCC fccIOProc,  LPMMIOPROC pIOProc,  DWORD dwFlags);
-__declspec(dllimport) LPMMIOPROC __stdcall mmioInstallIOProcW(  FOURCC fccIOProc,  LPMMIOPROC pIOProc,  DWORD dwFlags);
-
-
-
-
-
-__declspec(dllimport) HMMIO __stdcall mmioOpenA(   LPSTR pszFileName,   LPMMIOINFO pmmioinfo,  DWORD fdwOpen);
-__declspec(dllimport) HMMIO __stdcall mmioOpenW(   LPWSTR pszFileName,   LPMMIOINFO pmmioinfo,  DWORD fdwOpen);
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mmioRenameA(  LPCSTR pszFileName,  LPCSTR pszNewFileName,  LPCMMIOINFO pmmioinfo,  DWORD fdwRename);
-__declspec(dllimport) MMRESULT __stdcall mmioRenameW(  LPCWSTR pszFileName,  LPCWSTR pszNewFileName,  LPCMMIOINFO pmmioinfo,  DWORD fdwRename);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mmioClose(  HMMIO hmmio,  UINT fuClose);
-__declspec(dllimport) LONG __stdcall mmioRead(  HMMIO hmmio,  HPSTR pch,  LONG cch);
-__declspec(dllimport) LONG __stdcall mmioWrite(  HMMIO hmmio,  const char * pch,  LONG cch);
-__declspec(dllimport) LONG __stdcall mmioSeek(  HMMIO hmmio,  LONG lOffset,  int iOrigin);
-__declspec(dllimport) MMRESULT __stdcall mmioGetInfo(  HMMIO hmmio,  LPMMIOINFO pmmioinfo,  UINT fuInfo);
-__declspec(dllimport) MMRESULT __stdcall mmioSetInfo(  HMMIO hmmio,  LPCMMIOINFO pmmioinfo,  UINT fuInfo);
-__declspec(dllimport) MMRESULT __stdcall mmioSetBuffer(  HMMIO hmmio,  LPSTR pchBuffer,  LONG cchBuffer,
-     UINT fuBuffer);
-__declspec(dllimport) MMRESULT __stdcall mmioFlush(  HMMIO hmmio,  UINT fuFlush);
-__declspec(dllimport) MMRESULT __stdcall mmioAdvance(  HMMIO hmmio,   LPMMIOINFO pmmioinfo,  UINT fuAdvance);
-__declspec(dllimport) LRESULT __stdcall mmioSendMessage(  HMMIO hmmio,  UINT uMsg,
-     LPARAM lParam1,  LPARAM lParam2);
-__declspec(dllimport) MMRESULT __stdcall mmioDescend(  HMMIO hmmio,   LPMMCKINFO pmmcki,
-     const MMCKINFO * pmmckiParent,  UINT fuDescend);
-__declspec(dllimport) MMRESULT __stdcall mmioAscend(  HMMIO hmmio,  LPMMCKINFO pmmcki,  UINT fuAscend);
-__declspec(dllimport) MMRESULT __stdcall mmioCreateChunk( HMMIO hmmio,  LPMMCKINFO pmmcki,  UINT fuCreate);
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD   MCIERROR;       
-
-
-
-
-typedef UINT    MCIDEVICEID;    
-
-
-
-typedef UINT (__stdcall *YIELDPROC)(MCIDEVICEID mciId, DWORD dwYieldData);
-
-
-
-
-__declspec(dllimport) MCIERROR __stdcall mciSendCommandA(  MCIDEVICEID mciId,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);
-__declspec(dllimport) MCIERROR __stdcall mciSendCommandW(  MCIDEVICEID mciId,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);
-
-
-
-
-
-__declspec(dllimport) MCIERROR  __stdcall mciSendStringA(  LPCSTR lpstrCommand,  LPSTR lpstrReturnString,  UINT uReturnLength,  HWND hwndCallback);
-__declspec(dllimport) MCIERROR  __stdcall mciSendStringW(  LPCWSTR lpstrCommand,  LPWSTR lpstrReturnString,  UINT uReturnLength,  HWND hwndCallback);
-
-
-
-
-
-__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDA(  LPCSTR pszDevice);
-__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDW(  LPCWSTR pszDevice);
-
-
-
-
-
-__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDFromElementIDA(  DWORD dwElementID,  LPCSTR lpstrType );
-__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDFromElementIDW(  DWORD dwElementID,  LPCWSTR lpstrType );
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall mciGetErrorStringA(  MCIERROR mcierr,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) BOOL __stdcall mciGetErrorStringW(  MCIERROR mcierr,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall mciSetYieldProc(  MCIDEVICEID mciId,  YIELDPROC fpYieldProc,
-     DWORD dwYieldData);
-
-
-__declspec(dllimport) HTASK __stdcall mciGetCreatorTask(  MCIDEVICEID mciId);
-__declspec(dllimport) YIELDPROC __stdcall mciGetYieldProc(  MCIDEVICEID mciId,  LPDWORD pdwYieldData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_GENERIC_PARMS {
-    DWORD_PTR   dwCallback;
-} MCI_GENERIC_PARMS, *PMCI_GENERIC_PARMS,  *LPMCI_GENERIC_PARMS;
-
-
-
-
-
-typedef struct tagMCI_OPEN_PARMSA {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCSTR     lpstrDeviceType;
-    LPCSTR     lpstrElementName;
-    LPCSTR     lpstrAlias;
-} MCI_OPEN_PARMSA, *PMCI_OPEN_PARMSA, *LPMCI_OPEN_PARMSA;
-typedef struct tagMCI_OPEN_PARMSW {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCWSTR    lpstrDeviceType;
-    LPCWSTR    lpstrElementName;
-    LPCWSTR    lpstrAlias;
-} MCI_OPEN_PARMSW, *PMCI_OPEN_PARMSW, *LPMCI_OPEN_PARMSW;
-
-typedef MCI_OPEN_PARMSW MCI_OPEN_PARMS;
-typedef PMCI_OPEN_PARMSW PMCI_OPEN_PARMS;
-typedef LPMCI_OPEN_PARMSW LPMCI_OPEN_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_PLAY_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-} MCI_PLAY_PARMS, *PMCI_PLAY_PARMS,  *LPMCI_PLAY_PARMS;
-
-
-
-typedef struct tagMCI_SEEK_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwTo;
-} MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,  *LPMCI_SEEK_PARMS;
-
-
-
-typedef struct tagMCI_STATUS_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD_PTR   dwReturn;
-    DWORD       dwItem;
-    DWORD       dwTrack;
-} MCI_STATUS_PARMS, *PMCI_STATUS_PARMS,  * LPMCI_STATUS_PARMS;
-
-
-
-
-
-typedef struct tagMCI_INFO_PARMSA {
-    DWORD_PTR dwCallback;
-    LPSTR     lpstrReturn;
-    DWORD     dwRetSize;
-} MCI_INFO_PARMSA, * LPMCI_INFO_PARMSA;
-typedef struct tagMCI_INFO_PARMSW {
-    DWORD_PTR dwCallback;
-    LPWSTR    lpstrReturn;
-    DWORD     dwRetSize;
-} MCI_INFO_PARMSW, * LPMCI_INFO_PARMSW;
-
-typedef MCI_INFO_PARMSW MCI_INFO_PARMS;
-typedef LPMCI_INFO_PARMSW LPMCI_INFO_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_GETDEVCAPS_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwReturn;
-    DWORD       dwItem;
-} MCI_GETDEVCAPS_PARMS, *PMCI_GETDEVCAPS_PARMS,  * LPMCI_GETDEVCAPS_PARMS;
-
-
-
-
-
-typedef struct tagMCI_SYSINFO_PARMSA {
-    DWORD_PTR   dwCallback;
-    LPSTR       lpstrReturn;
-    DWORD       dwRetSize;
-    DWORD       dwNumber;
-    UINT        wDeviceType;
-} MCI_SYSINFO_PARMSA, *PMCI_SYSINFO_PARMSA, * LPMCI_SYSINFO_PARMSA;
-typedef struct tagMCI_SYSINFO_PARMSW {
-    DWORD_PTR   dwCallback;
-    LPWSTR      lpstrReturn;
-    DWORD       dwRetSize;
-    DWORD       dwNumber;
-    UINT        wDeviceType;
-} MCI_SYSINFO_PARMSW, *PMCI_SYSINFO_PARMSW, * LPMCI_SYSINFO_PARMSW;
-
-typedef MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS;
-typedef PMCI_SYSINFO_PARMSW PMCI_SYSINFO_PARMS;
-typedef LPMCI_SYSINFO_PARMSW LPMCI_SYSINFO_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_SET_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwTimeFormat;
-    DWORD       dwAudio;
-} MCI_SET_PARMS, *PMCI_SET_PARMS,  *LPMCI_SET_PARMS;
-
-
-
-typedef struct tagMCI_BREAK_PARMS {
-    DWORD_PTR   dwCallback;
-
-    int         nVirtKey;
-    HWND        hwndBreak;
-
-
-
-
-
-
-} MCI_BREAK_PARMS, *PMCI_BREAK_PARMS,  * LPMCI_BREAK_PARMS;
-
-
-
-
-
-typedef struct tagMCI_SAVE_PARMSA {
-    DWORD_PTR    dwCallback;
-    LPCSTR       lpfilename;
-} MCI_SAVE_PARMSA, *PMCI_SAVE_PARMSA, * LPMCI_SAVE_PARMSA;
-typedef struct tagMCI_SAVE_PARMSW {
-    DWORD_PTR    dwCallback;
-    LPCWSTR      lpfilename;
-} MCI_SAVE_PARMSW, *PMCI_SAVE_PARMSW, * LPMCI_SAVE_PARMSW;
-
-typedef MCI_SAVE_PARMSW MCI_SAVE_PARMS;
-typedef PMCI_SAVE_PARMSW PMCI_SAVE_PARMS;
-typedef LPMCI_SAVE_PARMSW LPMCI_SAVE_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_LOAD_PARMSA {
-    DWORD_PTR    dwCallback;
-    LPCSTR       lpfilename;
-} MCI_LOAD_PARMSA, *PMCI_LOAD_PARMSA, * LPMCI_LOAD_PARMSA;
-typedef struct tagMCI_LOAD_PARMSW {
-    DWORD_PTR    dwCallback;
-    LPCWSTR      lpfilename;
-} MCI_LOAD_PARMSW, *PMCI_LOAD_PARMSW, * LPMCI_LOAD_PARMSW;
-
-typedef MCI_LOAD_PARMSW MCI_LOAD_PARMS;
-typedef PMCI_LOAD_PARMSW PMCI_LOAD_PARMS;
-typedef LPMCI_LOAD_PARMSW LPMCI_LOAD_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_RECORD_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-} MCI_RECORD_PARMS,  *LPMCI_RECORD_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_VD_PLAY_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-    DWORD       dwSpeed;
-} MCI_VD_PLAY_PARMS, *PMCI_VD_PLAY_PARMS,  *LPMCI_VD_PLAY_PARMS;
-
-
-
-typedef struct tagMCI_VD_STEP_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrames;
-} MCI_VD_STEP_PARMS, *PMCI_VD_STEP_PARMS,  *LPMCI_VD_STEP_PARMS;
-
-
-
-
-
-typedef struct tagMCI_VD_ESCAPE_PARMSA {
-    DWORD_PTR   dwCallback;
-    LPCSTR      lpstrCommand;
-} MCI_VD_ESCAPE_PARMSA, *PMCI_VD_ESCAPE_PARMSA, *LPMCI_VD_ESCAPE_PARMSA;
-typedef struct tagMCI_VD_ESCAPE_PARMSW {
-    DWORD_PTR   dwCallback;
-    LPCWSTR     lpstrCommand;
-} MCI_VD_ESCAPE_PARMSW, *PMCI_VD_ESCAPE_PARMSW, *LPMCI_VD_ESCAPE_PARMSW;
-
-typedef MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS;
-typedef PMCI_VD_ESCAPE_PARMSW PMCI_VD_ESCAPE_PARMS;
-typedef LPMCI_VD_ESCAPE_PARMSW LPMCI_VD_ESCAPE_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_WAVE_OPEN_PARMSA {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCSTR      lpstrDeviceType;
-    LPCSTR      lpstrElementName;
-    LPCSTR      lpstrAlias;
-    DWORD   dwBufferSeconds;
-} MCI_WAVE_OPEN_PARMSA, *PMCI_WAVE_OPEN_PARMSA, *LPMCI_WAVE_OPEN_PARMSA;
-typedef struct tagMCI_WAVE_OPEN_PARMSW {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCWSTR     lpstrDeviceType;
-    LPCWSTR     lpstrElementName;
-    LPCWSTR     lpstrAlias;
-    DWORD   dwBufferSeconds;
-} MCI_WAVE_OPEN_PARMSW, *PMCI_WAVE_OPEN_PARMSW, *LPMCI_WAVE_OPEN_PARMSW;
-
-typedef MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS;
-typedef PMCI_WAVE_OPEN_PARMSW PMCI_WAVE_OPEN_PARMS;
-typedef LPMCI_WAVE_OPEN_PARMSW LPMCI_WAVE_OPEN_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_WAVE_DELETE_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-} MCI_WAVE_DELETE_PARMS, *PMCI_WAVE_DELETE_PARMS,  *LPMCI_WAVE_DELETE_PARMS;
-
-
-
-typedef struct tagMCI_WAVE_SET_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwTimeFormat;
-    DWORD       dwAudio;
-
-    UINT    wInput;
-    UINT    wOutput;
-
-
-
-
-
-
-    WORD    wFormatTag;
-    WORD    wReserved2;
-    WORD    nChannels;
-    WORD    wReserved3;
-    DWORD   nSamplesPerSec;
-    DWORD   nAvgBytesPerSec;
-    WORD    nBlockAlign;
-    WORD    wReserved4;
-    WORD    wBitsPerSample;
-    WORD    wReserved5;
-} MCI_WAVE_SET_PARMS, *PMCI_WAVE_SET_PARMS,  * LPMCI_WAVE_SET_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_SEQ_SET_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwTimeFormat;
-    DWORD       dwAudio;
-    DWORD       dwTempo;
-    DWORD       dwPort;
-    DWORD       dwSlave;
-    DWORD       dwMaster;
-    DWORD       dwOffset;
-} MCI_SEQ_SET_PARMS, *PMCI_SEQ_SET_PARMS,  * LPMCI_SEQ_SET_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_ANIM_OPEN_PARMSA {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCSTR      lpstrDeviceType;
-    LPCSTR      lpstrElementName;
-    LPCSTR      lpstrAlias;
-    DWORD   dwStyle;
-    HWND    hWndParent;
-} MCI_ANIM_OPEN_PARMSA, *PMCI_ANIM_OPEN_PARMSA, *LPMCI_ANIM_OPEN_PARMSA;
-typedef struct tagMCI_ANIM_OPEN_PARMSW {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCWSTR     lpstrDeviceType;
-    LPCWSTR     lpstrElementName;
-    LPCWSTR     lpstrAlias;
-    DWORD   dwStyle;
-    HWND    hWndParent;
-} MCI_ANIM_OPEN_PARMSW, *PMCI_ANIM_OPEN_PARMSW, *LPMCI_ANIM_OPEN_PARMSW;
-
-typedef MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS;
-typedef PMCI_ANIM_OPEN_PARMSW PMCI_ANIM_OPEN_PARMS;
-typedef LPMCI_ANIM_OPEN_PARMSW LPMCI_ANIM_OPEN_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_ANIM_PLAY_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-    DWORD       dwSpeed;
-} MCI_ANIM_PLAY_PARMS, *PMCI_ANIM_PLAY_PARMS,  *LPMCI_ANIM_PLAY_PARMS;
-
-
-
-typedef struct tagMCI_ANIM_STEP_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrames;
-} MCI_ANIM_STEP_PARMS, *PMCI_ANIM_STEP_PARMS,  *LPMCI_ANIM_STEP_PARMS;
-
-
-
-
-
-typedef struct tagMCI_ANIM_WINDOW_PARMSA {
-    DWORD_PTR   dwCallback;
-    HWND        hWnd;
-    UINT        nCmdShow;
-    LPCSTR     lpstrText;
-} MCI_ANIM_WINDOW_PARMSA, *PMCI_ANIM_WINDOW_PARMSA, * LPMCI_ANIM_WINDOW_PARMSA;
-typedef struct tagMCI_ANIM_WINDOW_PARMSW {
-    DWORD_PTR   dwCallback;
-    HWND        hWnd;
-    UINT        nCmdShow;
-    LPCWSTR    lpstrText;
-} MCI_ANIM_WINDOW_PARMSW, *PMCI_ANIM_WINDOW_PARMSW, * LPMCI_ANIM_WINDOW_PARMSW;
-
-typedef MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS;
-typedef PMCI_ANIM_WINDOW_PARMSW PMCI_ANIM_WINDOW_PARMS;
-typedef LPMCI_ANIM_WINDOW_PARMSW LPMCI_ANIM_WINDOW_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_ANIM_RECT_PARMS {
-    DWORD_PTR   dwCallback;
-
-
-
-
-    RECT    rc;
-
-} MCI_ANIM_RECT_PARMS;
-typedef MCI_ANIM_RECT_PARMS * PMCI_ANIM_RECT_PARMS;
-typedef MCI_ANIM_RECT_PARMS  * LPMCI_ANIM_RECT_PARMS;
-
-
-
-typedef struct tagMCI_ANIM_UPDATE_PARMS {
-    DWORD_PTR   dwCallback;
-    RECT        rc;
-    HDC         hDC;
-} MCI_ANIM_UPDATE_PARMS, *PMCI_ANIM_UPDATE_PARMS,  * LPMCI_ANIM_UPDATE_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_OVLY_OPEN_PARMSA {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCSTR      lpstrDeviceType;
-    LPCSTR      lpstrElementName;
-    LPCSTR      lpstrAlias;
-    DWORD   dwStyle;
-    HWND    hWndParent;
-} MCI_OVLY_OPEN_PARMSA, *PMCI_OVLY_OPEN_PARMSA, *LPMCI_OVLY_OPEN_PARMSA;
-typedef struct tagMCI_OVLY_OPEN_PARMSW {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCWSTR     lpstrDeviceType;
-    LPCWSTR     lpstrElementName;
-    LPCWSTR     lpstrAlias;
-    DWORD   dwStyle;
-    HWND    hWndParent;
-} MCI_OVLY_OPEN_PARMSW, *PMCI_OVLY_OPEN_PARMSW, *LPMCI_OVLY_OPEN_PARMSW;
-
-typedef MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS;
-typedef PMCI_OVLY_OPEN_PARMSW PMCI_OVLY_OPEN_PARMS;
-typedef LPMCI_OVLY_OPEN_PARMSW LPMCI_OVLY_OPEN_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_OVLY_WINDOW_PARMSA {
-    DWORD_PTR   dwCallback;
-    HWND        hWnd;
-    UINT        nCmdShow;
-    LPCSTR      lpstrText;
-} MCI_OVLY_WINDOW_PARMSA, *PMCI_OVLY_WINDOW_PARMSA, * LPMCI_OVLY_WINDOW_PARMSA;
-typedef struct tagMCI_OVLY_WINDOW_PARMSW {
-    DWORD_PTR   dwCallback;
-    HWND        hWnd;
-    UINT        nCmdShow;
-    LPCWSTR     lpstrText;
-} MCI_OVLY_WINDOW_PARMSW, *PMCI_OVLY_WINDOW_PARMSW, * LPMCI_OVLY_WINDOW_PARMSW;
-
-typedef MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS;
-typedef PMCI_OVLY_WINDOW_PARMSW PMCI_OVLY_WINDOW_PARMS;
-typedef LPMCI_OVLY_WINDOW_PARMSW LPMCI_OVLY_WINDOW_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_OVLY_RECT_PARMS {
-    DWORD_PTR   dwCallback;
-
-
-
-
-    RECT    rc;
-
-} MCI_OVLY_RECT_PARMS, *PMCI_OVLY_RECT_PARMS,  * LPMCI_OVLY_RECT_PARMS;
-
-
-
-
-
-typedef struct tagMCI_OVLY_SAVE_PARMSA {
-    DWORD_PTR   dwCallback;
-    LPCSTR      lpfilename;
-    RECT        rc;
-} MCI_OVLY_SAVE_PARMSA, *PMCI_OVLY_SAVE_PARMSA, * LPMCI_OVLY_SAVE_PARMSA;
-typedef struct tagMCI_OVLY_SAVE_PARMSW {
-    DWORD_PTR   dwCallback;
-    LPCWSTR     lpfilename;
-    RECT        rc;
-} MCI_OVLY_SAVE_PARMSW, *PMCI_OVLY_SAVE_PARMSW, * LPMCI_OVLY_SAVE_PARMSW;
-
-typedef MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS;
-typedef PMCI_OVLY_SAVE_PARMSW PMCI_OVLY_SAVE_PARMS;
-typedef LPMCI_OVLY_SAVE_PARMSW LPMCI_OVLY_SAVE_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_OVLY_LOAD_PARMSA {
-    DWORD_PTR   dwCallback;
-    LPCSTR      lpfilename;
-    RECT    rc;
-} MCI_OVLY_LOAD_PARMSA, *PMCI_OVLY_LOAD_PARMSA, * LPMCI_OVLY_LOAD_PARMSA;
-typedef struct tagMCI_OVLY_LOAD_PARMSW {
-    DWORD_PTR   dwCallback;
-    LPCWSTR     lpfilename;
-    RECT    rc;
-} MCI_OVLY_LOAD_PARMSW, *PMCI_OVLY_LOAD_PARMSW, * LPMCI_OVLY_LOAD_PARMSW;
-
-typedef MCI_OVLY_LOAD_PARMSW MCI_OVLY_LOAD_PARMS;
-typedef PMCI_OVLY_LOAD_PARMSW PMCI_OVLY_LOAD_PARMS;
-typedef LPMCI_OVLY_LOAD_PARMSW LPMCI_OVLY_LOAD_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}                       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _NCB {
-    UCHAR   ncb_command;            
-    UCHAR   ncb_retcode;            
-    UCHAR   ncb_lsn;                
-    UCHAR   ncb_num;                
-    PUCHAR  ncb_buffer;             
-    WORD    ncb_length;             
-    UCHAR   ncb_callname[16]; 
-    UCHAR   ncb_name[16];     
-    UCHAR   ncb_rto;                
-    UCHAR   ncb_sto;                
-    void (__stdcall *ncb_post)( struct _NCB * ); 
-    UCHAR   ncb_lana_num;           
-    UCHAR   ncb_cmd_cplt;           
-
-
-
-    UCHAR   ncb_reserve[10];        
-
-    HANDLE  ncb_event;              
-                                    
-                                    
-                                    
-} NCB, *PNCB;
-
-
-
-
-
-
-typedef struct _ADAPTER_STATUS {
-    UCHAR   adapter_address[6];
-    UCHAR   rev_major;
-    UCHAR   reserved0;
-    UCHAR   adapter_type;
-    UCHAR   rev_minor;
-    WORD    duration;
-    WORD    frmr_recv;
-    WORD    frmr_xmit;
-
-    WORD    iframe_recv_err;
-
-    WORD    xmit_aborts;
-    DWORD   xmit_success;
-    DWORD   recv_success;
-
-    WORD    iframe_xmit_err;
-
-    WORD    recv_buff_unavail;
-    WORD    t1_timeouts;
-    WORD    ti_timeouts;
-    DWORD   reserved1;
-    WORD    free_ncbs;
-    WORD    max_cfg_ncbs;
-    WORD    max_ncbs;
-    WORD    xmit_buf_unavail;
-    WORD    max_dgram_size;
-    WORD    pending_sess;
-    WORD    max_cfg_sess;
-    WORD    max_sess;
-    WORD    max_sess_pkt_size;
-    WORD    name_count;
-} ADAPTER_STATUS, *PADAPTER_STATUS;
-
-typedef struct _NAME_BUFFER {
-    UCHAR   name[16];
-    UCHAR   name_num;
-    UCHAR   name_flags;
-} NAME_BUFFER, *PNAME_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SESSION_HEADER {
-    UCHAR   sess_name;
-    UCHAR   num_sess;
-    UCHAR   rcv_dg_outstanding;
-    UCHAR   rcv_any_outstanding;
-} SESSION_HEADER, *PSESSION_HEADER;
-
-typedef struct _SESSION_BUFFER {
-    UCHAR   lsn;
-    UCHAR   state;
-    UCHAR   local_name[16];
-    UCHAR   remote_name[16];
-    UCHAR   rcvs_outstanding;
-    UCHAR   sends_outstanding;
-} SESSION_BUFFER, *PSESSION_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _LANA_ENUM {
-    UCHAR   length;         
-    UCHAR   lana[254+1];
-} LANA_ENUM, *PLANA_ENUM;
-
-
-
-
-
-
-typedef struct _FIND_NAME_HEADER {
-    WORD    node_count;
-    UCHAR   reserved;
-    UCHAR   unique_group;
-} FIND_NAME_HEADER, *PFIND_NAME_HEADER;
-
-typedef struct _FIND_NAME_BUFFER {
-    UCHAR   length;
-    UCHAR   access_control;
-    UCHAR   frame_control;
-    UCHAR   destination_addr[6];
-    UCHAR   source_addr[6];
-    UCHAR   routing_info[18];
-} FIND_NAME_BUFFER, *PFIND_NAME_BUFFER;
-
-
-
-
-
-
-typedef struct _ACTION_HEADER {
-    ULONG   transport_id;
-    USHORT  action_code;
-    USHORT  reserved;
-} ACTION_HEADER, *PACTION_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-UCHAR
-__stdcall
-Netbios(
-    PNCB pncb
-    );
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void * I_RPC_HANDLE;
-typedef long RPC_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  unsigned char  *RPC_CSTR;
-typedef  unsigned short  *RPC_WSTR;
-
-typedef I_RPC_HANDLE RPC_BINDING_HANDLE;
-typedef RPC_BINDING_HANDLE handle_t;
-
-
-
-
-
-
-
-
-typedef GUID UUID;
-
-
-
-
-
-typedef struct _RPC_BINDING_VECTOR
-{
-    unsigned long Count;
-    RPC_BINDING_HANDLE BindingH[1];
-} RPC_BINDING_VECTOR;
-
-
-
-
-typedef struct _UUID_VECTOR
-{
-  unsigned long Count;
-  UUID *Uuid[1];
-} UUID_VECTOR;
-
-
-
-
-typedef void  * RPC_IF_HANDLE;
-
-
-
-typedef struct _RPC_IF_ID
-{
-    UUID Uuid;
-    unsigned short VersMajor;
-    unsigned short VersMinor;
-} RPC_IF_ID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RPC_PROTSEQ_VECTORA
-{
-    unsigned int Count;
-    unsigned char  * Protseq[1];
-} RPC_PROTSEQ_VECTORA;
-
-typedef struct _RPC_PROTSEQ_VECTORW
-{
-    unsigned int Count;
-    unsigned short  * Protseq[1];
-} RPC_PROTSEQ_VECTORW;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RPC_POLICY {
-    unsigned int Length ;
-    unsigned long EndpointFlags ;
-    unsigned long NICFlags ;
-    } RPC_POLICY,   *PRPC_POLICY ;
-
-typedef void __stdcall
-RPC_OBJECT_INQ_FN (
-     UUID  * ObjectUuid,
-     UUID  * TypeUuid,
-     RPC_STATUS  * Status
-    );
-
-typedef RPC_STATUS __stdcall
-RPC_IF_CALLBACK_FN (
-     RPC_IF_HANDLE  InterfaceUuid,
-     void *Context
-    ) ;
-
-typedef void __stdcall
-RPC_SECURITY_CALLBACK_FN (
-     void *Context
-    ) ;
-
-
-
-typedef struct
-{
-    unsigned int Count;
-    unsigned long Stats[1];
-} RPC_STATS_VECTOR;
-
-
-
-
-
-
-typedef struct
-{
-  unsigned long Count;
-  RPC_IF_ID  * IfId[1];
-} RPC_IF_ID_VECTOR;
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingCopy (
-     RPC_BINDING_HANDLE SourceBinding,
-     RPC_BINDING_HANDLE  * DestinationBinding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingFree (
-      RPC_BINDING_HANDLE  * Binding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetOption(  RPC_BINDING_HANDLE hBinding,
-                      unsigned long      option,
-                      ULONG_PTR          optionValue );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqOption(   RPC_BINDING_HANDLE hBinding,
-                       unsigned long      option,
-                      ULONG_PTR         *pOptionValue );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingFromStringBindingA (
-         RPC_CSTR StringBinding,
-         RPC_BINDING_HANDLE  *Binding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingFromStringBindingW (
-         RPC_WSTR StringBinding,
-         RPC_BINDING_HANDLE  *Binding
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSsGetContextBinding (
-     void *ContextHandle,
-     RPC_BINDING_HANDLE  * Binding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqObject (
-     RPC_BINDING_HANDLE Binding,
-     UUID  * ObjectUuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingReset (
-     RPC_BINDING_HANDLE Binding
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetObject (
-     RPC_BINDING_HANDLE Binding,
-     UUID  * ObjectUuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqDefaultProtectLevel(
-      unsigned long AuthnSvc,
-     unsigned long  *AuthnLevel
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingToStringBindingA (
-         RPC_BINDING_HANDLE Binding,
-                  RPC_CSTR  *StringBinding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingToStringBindingW (
-         RPC_BINDING_HANDLE Binding,
-                  RPC_WSTR  *StringBinding
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingVectorFree (
-      RPC_BINDING_VECTOR  *  * BindingVector
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringBindingComposeA (
-           RPC_CSTR ObjUuid,
-           RPC_CSTR Protseq,
-           RPC_CSTR NetworkAddr,
-           RPC_CSTR Endpoint,
-           RPC_CSTR Options,
-                    RPC_CSTR  *StringBinding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringBindingComposeW (
-           RPC_WSTR ObjUuid,
-           RPC_WSTR Protseq,
-           RPC_WSTR NetworkAddr,
-           RPC_WSTR Endpoint,
-           RPC_WSTR Options,
-                    RPC_WSTR  *StringBinding
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringBindingParseA (
-         RPC_CSTR StringBinding,
-                    RPC_CSTR  *ObjUuid,
-                    RPC_CSTR  *Protseq,
-                    RPC_CSTR  *NetworkAddr,
-                    RPC_CSTR  *Endpoint,
-                    RPC_CSTR  *NetworkOptions
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringBindingParseW (
-         RPC_WSTR StringBinding,
-                    RPC_WSTR  *ObjUuid,
-                    RPC_WSTR  *Protseq,
-                    RPC_WSTR  *NetworkAddr,
-                    RPC_WSTR  *Endpoint,
-                    RPC_WSTR  *NetworkOptions
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringFreeA (
-     RPC_CSTR  *String
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringFreeW (
-     RPC_WSTR  *String
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcIfInqId (
-     RPC_IF_HANDLE RpcIfHandle,
-     RPC_IF_ID  * RpcIfId
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNetworkIsProtseqValidA (
-         RPC_CSTR Protseq
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNetworkIsProtseqValidW (
-         RPC_WSTR Protseq
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqComTimeout (
-     RPC_BINDING_HANDLE Binding,
-     unsigned int  * Timeout
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtSetComTimeout (
-     RPC_BINDING_HANDLE Binding,
-     unsigned int Timeout
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtSetCancelTimeout(
-    long Timeout
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNetworkInqProtseqsA (
-     RPC_PROTSEQ_VECTORA  *  * ProtseqVector
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNetworkInqProtseqsW (
-     RPC_PROTSEQ_VECTORW  *  * ProtseqVector
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcObjectInqType (
-     UUID  * ObjUuid,
-     UUID  * TypeUuid 
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcObjectSetInqFn (
-     RPC_OBJECT_INQ_FN  * InquiryFn
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcObjectSetType (
-     UUID  * ObjUuid,
-     UUID  * TypeUuid 
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcProtseqVectorFreeA (
-      RPC_PROTSEQ_VECTORA  *  * ProtseqVector
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcProtseqVectorFreeW (
-      RPC_PROTSEQ_VECTORW  *  * ProtseqVector
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqBindings (
-     RPC_BINDING_VECTOR  *  * BindingVector
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqIf (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid, 
-     void  *  * MgrEpv
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerListen (
-     unsigned int MinimumCallThreads,
-     unsigned int MaxCalls,
-     unsigned int DontWait
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterIf (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid ,
-     void  * MgrEpv 
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterIfEx (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid,
-     void  * MgrEpv,
-     unsigned int Flags,
-     unsigned int MaxCalls,
-     RPC_IF_CALLBACK_FN  *IfCallback
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterIf2 (
-     RPC_IF_HANDLE IfSpec,
-     UUID * MgrTypeUuid,
-     void * MgrEpv,
-     unsigned int Flags,
-     unsigned int MaxCalls,
-     unsigned int MaxRpcSize,
-     RPC_IF_CALLBACK_FN *IfCallbackFn
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUnregisterIf (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid, 
-     unsigned int WaitForCallsToComplete
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUnregisterIfEx (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid, 
-     int RundownContextHandles
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseAllProtseqs (
-     unsigned int MaxCalls,
-     void  * SecurityDescriptor 
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseAllProtseqsEx (
-     unsigned int MaxCalls,
-     void  * SecurityDescriptor,
-     PRPC_POLICY Policy
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseAllProtseqsIf (
-     unsigned int MaxCalls,
-     RPC_IF_HANDLE IfSpec,
-     void  * SecurityDescriptor 
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseAllProtseqsIfEx (
-     unsigned int MaxCalls,
-     RPC_IF_HANDLE IfSpec,
-     void  * SecurityDescriptor,
-     PRPC_POLICY Policy
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqExA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqExW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqEpA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_CSTR Endpoint,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqEpExA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_CSTR Endpoint,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqEpW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_WSTR Endpoint,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqEpExW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_WSTR Endpoint,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqIfA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_IF_HANDLE IfSpec,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqIfExA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_IF_HANDLE IfSpec,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqIfW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_IF_HANDLE IfSpec,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqIfExW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_IF_HANDLE IfSpec,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-RpcServerYield (
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtStatsVectorFree (
-     RPC_STATS_VECTOR ** StatsVector
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqStats (
-     RPC_BINDING_HANDLE Binding,
-     RPC_STATS_VECTOR ** Statistics
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtIsServerListening (
-     RPC_BINDING_HANDLE Binding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtStopServerListening (
-     RPC_BINDING_HANDLE Binding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtWaitServerListen (
-    void
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtSetServerStackSize (
-     unsigned long ThreadStackSize
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsDontSerializeContext (
-    void
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEnableIdleCleanup (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqIfIds (
-     RPC_BINDING_HANDLE Binding,
-     RPC_IF_ID_VECTOR  *  * IfIdVector
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcIfIdVectorFree (
-      RPC_IF_ID_VECTOR  *  * IfIdVector
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqServerPrincNameA (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long AuthnSvc,
-                  RPC_CSTR  *ServerPrincName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqServerPrincNameW (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long AuthnSvc,
-                  RPC_WSTR  *ServerPrincName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqDefaultPrincNameA (
-         unsigned long AuthnSvc,
-                  RPC_CSTR  *PrincName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqDefaultPrincNameW (
-         unsigned long AuthnSvc,
-                  RPC_WSTR  *PrincName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpResolveBinding (
-     RPC_BINDING_HANDLE Binding,
-     RPC_IF_HANDLE IfSpec
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNsBindingInqEntryNameA (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long EntryNameSyntax,
-                  RPC_CSTR  *EntryName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNsBindingInqEntryNameW (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long EntryNameSyntax,
-                  RPC_WSTR  *EntryName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void  * RPC_AUTH_IDENTITY_HANDLE;
-typedef void  * RPC_AUTHZ_HANDLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RPC_SECURITY_QOS {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-} RPC_SECURITY_QOS, *PRPC_SECURITY_QOS;
-
-
-
-
-
-
-
-typedef struct _SEC_WINNT_AUTH_IDENTITY_W {
-  unsigned short  *User;
-  unsigned long UserLength;
-  unsigned short  *Domain;
-  unsigned long DomainLength;
-  unsigned short  *Password;
-  unsigned long PasswordLength;
-  unsigned long Flags;
-} SEC_WINNT_AUTH_IDENTITY_W, *PSEC_WINNT_AUTH_IDENTITY_W;
-
-typedef struct _SEC_WINNT_AUTH_IDENTITY_A {
-  unsigned char  *User;
-  unsigned long UserLength;
-  unsigned char  *Domain;
-  unsigned long DomainLength;
-  unsigned char  *Password;
-  unsigned long PasswordLength;
-  unsigned long Flags;
-} SEC_WINNT_AUTH_IDENTITY_A, *PSEC_WINNT_AUTH_IDENTITY_A;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RPC_HTTP_TRANSPORT_CREDENTIALS_W
-{
-    SEC_WINNT_AUTH_IDENTITY_W *TransportCredentials;
-    unsigned long Flags;
-    unsigned long AuthenticationTarget;
-    unsigned long NumberOfAuthnSchemes;
-    unsigned long *AuthnSchemes;
-    unsigned short  *ServerCertificateSubject;
-} RPC_HTTP_TRANSPORT_CREDENTIALS_W, *PRPC_HTTP_TRANSPORT_CREDENTIALS_W;
-
-typedef struct _RPC_HTTP_TRANSPORT_CREDENTIALS_A
-{
-    SEC_WINNT_AUTH_IDENTITY_A *TransportCredentials;
-    unsigned long Flags;
-    unsigned long AuthenticationTarget;
-    unsigned long NumberOfAuthnSchemes;
-    unsigned long *AuthnSchemes;
-    unsigned char  *ServerCertificateSubject;
-} RPC_HTTP_TRANSPORT_CREDENTIALS_A, *PRPC_HTTP_TRANSPORT_CREDENTIALS_A;
-
-typedef struct _RPC_SECURITY_QOS_V2_W {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-  unsigned long AdditionalSecurityInfoType;
-  union 
-      {
-      RPC_HTTP_TRANSPORT_CREDENTIALS_W *HttpCredentials;
-      } u;
-} RPC_SECURITY_QOS_V2_W, *PRPC_SECURITY_QOS_V2_W;
-
-typedef struct _RPC_SECURITY_QOS_V2_A {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-  unsigned long AdditionalSecurityInfoType;
-  union 
-      {
-      RPC_HTTP_TRANSPORT_CREDENTIALS_A *HttpCredentials;
-      } u;
-} RPC_SECURITY_QOS_V2_A, *PRPC_SECURITY_QOS_V2_A;
-
-
-
-typedef struct _RPC_SECURITY_QOS_V3_W {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-  unsigned long AdditionalSecurityInfoType;
-  union 
-      {
-      RPC_HTTP_TRANSPORT_CREDENTIALS_W *HttpCredentials;
-      } u;
-  void *Sid;
-} RPC_SECURITY_QOS_V3_W, *PRPC_SECURITY_QOS_V3_W;
-
-typedef struct _RPC_SECURITY_QOS_V3_A {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-  unsigned long AdditionalSecurityInfoType;
-  union 
-      {
-      RPC_HTTP_TRANSPORT_CREDENTIALS_A *HttpCredentials;
-      } u;
-  void *Sid;
-} RPC_SECURITY_QOS_V3_A, *PRPC_SECURITY_QOS_V3_A;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _RPC_HTTP_REDIRECTOR_STAGE
-{
-    RPCHTTP_RS_REDIRECT = 1,
-    RPCHTTP_RS_ACCESS_1,
-    RPCHTTP_RS_SESSION,
-    RPCHTTP_RS_ACCESS_2,
-    RPCHTTP_RS_INTERFACE
-} RPC_HTTP_REDIRECTOR_STAGE;
-
-typedef RPC_STATUS
-(__stdcall * RPC_NEW_HTTP_PROXY_CHANNEL) (
-     RPC_HTTP_REDIRECTOR_STAGE RedirectorStage,
-     unsigned short  *ServerName,
-     unsigned short  *ServerPort,
-      unsigned short  *RemoteUser,
-      unsigned short  *AuthType,
-      void  *ResourceUuid,
-      void  *Metadata,
-      void  *SessionId,
-      void  *Interface,
-      void  *Reserved,
-     unsigned long Flags,
-      unsigned short  **NewServerName,
-      unsigned short  **NewServerPort
-    );
-
-typedef void
-(__stdcall * RPC_HTTP_PROXY_FREE_STRING) (
-     unsigned short  *String
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcImpersonateClient (
-     RPC_BINDING_HANDLE BindingHandle 
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcRevertToSelfEx (
-     RPC_BINDING_HANDLE BindingHandle 
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcRevertToSelf (
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthClientA (
-           RPC_BINDING_HANDLE ClientBinding,
-         RPC_AUTHZ_HANDLE  *Privs,
-                    RPC_CSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel, 
-           unsigned long  *AuthnSvc,
-           unsigned long  *AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthClientW (
-           RPC_BINDING_HANDLE ClientBinding,
-         RPC_AUTHZ_HANDLE  *Privs,
-                    RPC_WSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           unsigned long  *AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthClientExA (
-           RPC_BINDING_HANDLE ClientBinding,
-         RPC_AUTHZ_HANDLE  *Privs,
-                    RPC_CSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           unsigned long  *AuthzSvc,
-      unsigned long             Flags
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthClientExW (
-           RPC_BINDING_HANDLE ClientBinding,
-         RPC_AUTHZ_HANDLE  *Privs,
-                    RPC_WSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           unsigned long  *AuthzSvc,
-      unsigned long             Flags
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthInfoA (
-         RPC_BINDING_HANDLE Binding,
-                    RPC_CSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
-           unsigned long  *AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthInfoW (
-         RPC_BINDING_HANDLE Binding,
-                    RPC_WSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
-           unsigned long  *AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetAuthInfoA (
-         RPC_BINDING_HANDLE Binding,
-         RPC_CSTR ServerPrincName,
-         unsigned long AuthnLevel,
-         unsigned long AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
-         unsigned long AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetAuthInfoExA (
-         RPC_BINDING_HANDLE Binding,
-         RPC_CSTR ServerPrincName,
-         unsigned long AuthnLevel,
-         unsigned long AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
-         unsigned long AuthzSvc,
-           RPC_SECURITY_QOS *SecurityQos
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetAuthInfoW (
-         RPC_BINDING_HANDLE Binding,
-         RPC_WSTR ServerPrincName,
-         unsigned long AuthnLevel,
-         unsigned long AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
-         unsigned long AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetAuthInfoExW (
-         RPC_BINDING_HANDLE Binding,
-         RPC_WSTR ServerPrincName,
-         unsigned long AuthnLevel,
-         unsigned long AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
-         unsigned long AuthzSvc,
-           RPC_SECURITY_QOS *SecurityQOS
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthInfoExA (
-         RPC_BINDING_HANDLE Binding,
-                    RPC_CSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
-           unsigned long  *AuthzSvc,
-         unsigned long RpcQosVersion,
-           RPC_SECURITY_QOS *SecurityQOS
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthInfoExW (
-         RPC_BINDING_HANDLE Binding,
-                    RPC_WSTR  *ServerPrincName, 
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
-           unsigned long  *AuthzSvc,
-         unsigned long RpcQosVersion,
-           RPC_SECURITY_QOS *SecurityQOS
-    );
-
-typedef void
-(__stdcall * RPC_AUTH_KEY_RETRIEVAL_FN) (
-     void  * Arg,
-     unsigned short  * ServerPrincName,
-     unsigned long KeyVer,
-     void  *  * Key,
-     RPC_STATUS  * Status
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterAuthInfoA (
-         RPC_CSTR ServerPrincName,
-         unsigned long AuthnSvc,
-           RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn,
-           void  *Arg
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterAuthInfoW (
-         RPC_WSTR ServerPrincName,
-         unsigned long AuthnSvc,
-           RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn,
-           void  *Arg
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    unsigned char  * UserName;
-    unsigned char  * ComputerName;
-    unsigned short Privilege;
-    unsigned long AuthFlags;
-} RPC_CLIENT_INFORMATION1,  * PRPC_CLIENT_INFORMATION1;
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingServerFromClient (
-     RPC_BINDING_HANDLE ClientBinding,
-     RPC_BINDING_HANDLE  * ServerBinding
-    );
-
-__declspec(dllimport)
-__declspec(noreturn)
-void
-__stdcall
-RpcRaiseException (
-     RPC_STATUS exception
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcTestCancel(
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerTestCancel (
-     RPC_BINDING_HANDLE BindingHandle 
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcCancelThread(
-     void * Thread
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcCancelThreadEx(
-     void * Thread,
-     long Timeout
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidCreate (
-     UUID  * Uuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidCreateSequential (
-     UUID  * Uuid
-    );
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidToStringA (
-         UUID  *Uuid,
-                  RPC_CSTR  *StringUuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidFromStringA (
-         RPC_CSTR StringUuid,
-         UUID  *Uuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidToStringW (
-         UUID  *Uuid,
-                  RPC_WSTR  *StringUuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidFromStringW (
-           RPC_WSTR StringUuid,
-         UUID  *Uuid
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-signed int
-__stdcall
-UuidCompare (
-     UUID  * Uuid1,
-     UUID  * Uuid2,
-     RPC_STATUS  * Status
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidCreateNil (
-     UUID  * NilUuid
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-UuidEqual (
-     UUID  * Uuid1,
-     UUID  * Uuid2,
-     RPC_STATUS  * Status
-    );
-
-__declspec(dllimport)
-unsigned short
-__stdcall
-UuidHash (
-     UUID  * Uuid,
-     RPC_STATUS  * Status
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-UuidIsNil (
-     UUID  * Uuid,
-     RPC_STATUS  * Status
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpRegisterNoReplaceA (
-         RPC_IF_HANDLE IfSpec,
-         RPC_BINDING_VECTOR *BindingVector,
-           UUID_VECTOR *UuidVector,
-           RPC_CSTR Annotation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpRegisterNoReplaceW (
-         RPC_IF_HANDLE IfSpec,
-         RPC_BINDING_VECTOR *BindingVector,
-           UUID_VECTOR *UuidVector,
-           RPC_WSTR Annotation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpRegisterA (
-         RPC_IF_HANDLE IfSpec,
-         RPC_BINDING_VECTOR *BindingVector,
-           UUID_VECTOR *UuidVector,
-           RPC_CSTR Annotation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpRegisterW (
-         RPC_IF_HANDLE IfSpec,
-         RPC_BINDING_VECTOR *BindingVector,
-           UUID_VECTOR *UuidVector,
-           RPC_WSTR Annotation
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpUnregister(
-     RPC_IF_HANDLE IfSpec,
-     RPC_BINDING_VECTOR *BindingVector,
-     UUID_VECTOR *UuidVector
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-DceErrorInqTextA (
-         RPC_STATUS RpcStatus,
-         RPC_CSTR ErrorText
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-DceErrorInqTextW (
-         RPC_STATUS RpcStatus,
-         RPC_WSTR ErrorText
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef I_RPC_HANDLE * RPC_EP_INQ_HANDLE;
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpEltInqBegin (
-     RPC_BINDING_HANDLE EpBinding ,
-     unsigned long InquiryType,
-     RPC_IF_ID  * IfId ,
-     unsigned long VersOption ,
-     UUID  * ObjectUuid ,
-     RPC_EP_INQ_HANDLE  * InquiryContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpEltInqDone (
-      RPC_EP_INQ_HANDLE  * InquiryContext
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpEltInqNextA (
-         RPC_EP_INQ_HANDLE InquiryContext,
-         RPC_IF_ID  *IfId,
-           RPC_BINDING_HANDLE  *Binding,
-           UUID  *ObjectUuid,
-                    RPC_CSTR  *Annotation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpEltInqNextW (
-         RPC_EP_INQ_HANDLE InquiryContext,
-         RPC_IF_ID  *IfId,
-           RPC_BINDING_HANDLE  *Binding,
-           UUID  *ObjectUuid,
-                    RPC_WSTR  *Annotation
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpUnregister (
-     RPC_BINDING_HANDLE EpBinding ,
-     RPC_IF_ID  * IfId,
-     RPC_BINDING_HANDLE Binding,
-     UUID  * ObjectUuid 
-    );
-
-typedef int
-(__stdcall * RPC_MGMT_AUTHORIZATION_FN) (
-     RPC_BINDING_HANDLE ClientBinding,
-     unsigned long RequestedMgmtOperation,
-     RPC_STATUS  * Status
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtSetAuthorizationFn (
-     RPC_MGMT_AUTHORIZATION_FN AuthorizationFn
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-typedef struct _RPC_VERSION {
-    unsigned short MajorVersion;
-    unsigned short MinorVersion;
-} RPC_VERSION;
-
-typedef struct _RPC_SYNTAX_IDENTIFIER {
-    GUID SyntaxGUID;
-    RPC_VERSION SyntaxVersion;
-} RPC_SYNTAX_IDENTIFIER,  * PRPC_SYNTAX_IDENTIFIER;
-
-typedef struct _RPC_MESSAGE
-{
-    RPC_BINDING_HANDLE Handle;
-    unsigned long DataRepresentation;
-    void  * Buffer;
-    unsigned int BufferLength;
-    unsigned int ProcNum;
-    PRPC_SYNTAX_IDENTIFIER TransferSyntax;
-    void  * RpcInterfaceInformation;
-    void  * ReservedForRuntime;
-    void  * ManagerEpv;
-    void  * ImportContext;
-    unsigned long RpcFlags;
-} RPC_MESSAGE,  * PRPC_MESSAGE;
-
-
-typedef RPC_STATUS
-__stdcall RPC_FORWARD_FUNCTION(
-                        UUID              * InterfaceId,
-                        RPC_VERSION       * InterfaceVersion,
-                        UUID              * ObjectId,
-                        unsigned char          * Rpcpro,
-                        void  *  * ppDestEndpoint);
-
-enum RPC_ADDRESS_CHANGE_TYPE
-{
-    PROTOCOL_NOT_LOADED = 1,
-    PROTOCOL_LOADED,
-    PROTOCOL_ADDRESS_CHANGE
-};
-
-typedef void
-__stdcall RPC_ADDRESS_CHANGE_FN(
-                         void * arg
-                        );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-void
-(__stdcall  * RPC_DISPATCH_FUNCTION) (
-      PRPC_MESSAGE Message
-    );
-
-typedef struct {
-    unsigned int DispatchTableCount;
-    RPC_DISPATCH_FUNCTION  * DispatchTable;
-    LONG_PTR                          Reserved;
-} RPC_DISPATCH_TABLE,  * PRPC_DISPATCH_TABLE;
-
-typedef struct _RPC_PROTSEQ_ENDPOINT
-{
-    unsigned char  * RpcProtocolSequence;
-    unsigned char  * Endpoint;
-} RPC_PROTSEQ_ENDPOINT,  * PRPC_PROTSEQ_ENDPOINT;
-
-
-
-
-
-
-
-
-typedef struct _RPC_SERVER_INTERFACE
-{
-    unsigned int Length;
-    RPC_SYNTAX_IDENTIFIER InterfaceId;
-    RPC_SYNTAX_IDENTIFIER TransferSyntax;
-    PRPC_DISPATCH_TABLE DispatchTable;
-    unsigned int RpcProtseqEndpointCount;
-    PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;
-    void  *DefaultManagerEpv;
-    void const  *InterpreterInfo;
-    unsigned int Flags ;
-} RPC_SERVER_INTERFACE,  * PRPC_SERVER_INTERFACE;
-
-typedef struct _RPC_CLIENT_INTERFACE
-{
-    unsigned int Length;
-    RPC_SYNTAX_IDENTIFIER   InterfaceId;
-    RPC_SYNTAX_IDENTIFIER   TransferSyntax;
-    PRPC_DISPATCH_TABLE     DispatchTable;
-    unsigned int            RpcProtseqEndpointCount;
-    PRPC_PROTSEQ_ENDPOINT   RpcProtseqEndpoint;
-    ULONG_PTR               Reserved;
-    void const  *  InterpreterInfo;
-    unsigned int Flags ;
-} RPC_CLIENT_INTERFACE,  * PRPC_CLIENT_INTERFACE;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNegotiateTransferSyntax (
-      RPC_MESSAGE  * Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcGetBuffer (
-      RPC_MESSAGE  * Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcGetBufferWithObject (
-      RPC_MESSAGE  * Message,
-     UUID * ObjectUuid
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcSendReceive (
-      RPC_MESSAGE  * Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcFreeBuffer (
-      RPC_MESSAGE  * Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcSend (
-      PRPC_MESSAGE Message
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcReceive (
-      PRPC_MESSAGE Message,
-     unsigned int Size
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcFreePipeBuffer (
-      RPC_MESSAGE  * Message
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcReallocPipeBuffer (
-     PRPC_MESSAGE Message,
-     unsigned int NewSize
-    ) ;
-
-typedef void * I_RPC_MUTEX;
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcRequestMutex (
-      I_RPC_MUTEX * Mutex
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcClearMutex (
-     I_RPC_MUTEX Mutex
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcDeleteMutex (
-     I_RPC_MUTEX Mutex
-    );
-
-__declspec(dllimport)
-void  *
-__stdcall
-I_RpcAllocate (
-     unsigned int Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcFree (
-     void  * Object
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcPauseExecution (
-     unsigned long Milliseconds
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcGetExtendedError (
-    );
-
-typedef
-void
-(__stdcall  * PRPC_RUNDOWN) (
-    void  * AssociationContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcMonitorAssociation (
-     RPC_BINDING_HANDLE Handle,
-     PRPC_RUNDOWN RundownRoutine,
-     void * Context
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcStopMonitorAssociation (
-     RPC_BINDING_HANDLE Handle
-    );
-
-__declspec(dllimport)
-RPC_BINDING_HANDLE
-__stdcall
-I_RpcGetCurrentCallHandle(
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcGetAssociationContext (
-     RPC_BINDING_HANDLE BindingHandle,
-     void  *  * AssociationContext
-    );
-
-__declspec(dllimport)
-void *
-__stdcall
-I_RpcGetServerContextList (
-     RPC_BINDING_HANDLE BindingHandle
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcSetServerContextList (
-     RPC_BINDING_HANDLE BindingHandle,
-     void * ServerContextList
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsInterfaceExported (
-     unsigned long EntryNameSyntax,
-     unsigned short *EntryName,
-     RPC_SERVER_INTERFACE * RpcInterfaceInformation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsInterfaceUnexported (
-     unsigned long EntryNameSyntax,
-     unsigned short *EntryName,
-     RPC_SERVER_INTERFACE * RpcInterfaceInformation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingToStaticStringBindingW (
-     RPC_BINDING_HANDLE Binding,
-     unsigned short **StringBinding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqSecurityContext (
-     RPC_BINDING_HANDLE Binding,
-     void **SecurityContextHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqWireIdForSnego (
-         RPC_BINDING_HANDLE Binding,
-         RPC_CSTR WireId
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqMarshalledTargetInfo (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long *MarshalledTargetInfoLength,
-                  RPC_CSTR *MarshalledTargetInfo
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqLocalClientPID (
-     RPC_BINDING_HANDLE Binding,
-     unsigned long *Pid
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingHandleToAsyncHandle (
-     RPC_BINDING_HANDLE Binding,
-     void **AsyncHandle
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsBindingSetEntryNameW (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsBindingSetEntryNameA (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUseProtseqEp2A (
-         RPC_CSTR NetworkAddress,
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_CSTR Endpoint,
-         void  * SecurityDescriptor,
-         void *Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUseProtseqEp2W (
-         RPC_WSTR NetworkAddress,
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_WSTR Endpoint,
-         void  *SecurityDescriptor,
-         void *Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUseProtseq2W (
-         RPC_WSTR NetworkAddress,
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         void  *SecurityDescriptor,
-         void *Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUseProtseq2A (
-         RPC_CSTR NetworkAddress,
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         void  *SecurityDescriptor,
-         void *Policy
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqDynamicEndpointW (
-         RPC_BINDING_HANDLE Binding,
-                      RPC_WSTR  *DynamicEndpoint
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqDynamicEndpointA (
-         RPC_BINDING_HANDLE Binding,
-                      RPC_CSTR  *DynamicEndpoint
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerCheckClientRestriction (
-     RPC_BINDING_HANDLE Context
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqTransportType (
-     RPC_BINDING_HANDLE Binding,
-     unsigned int  * Type
-    );
-
-typedef struct _RPC_TRANSFER_SYNTAX
-{
-    UUID Uuid;
-    unsigned short VersMajor;
-    unsigned short VersMinor;
-} RPC_TRANSFER_SYNTAX;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcIfInqTransferSyntaxes (
-     RPC_IF_HANDLE RpcIfHandle,
-     RPC_TRANSFER_SYNTAX  * TransferSyntaxes,
-     unsigned int TransferSyntaxSize,
-     unsigned int  * TransferSyntaxCount
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_UuidCreate (
-     UUID  * Uuid
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingCopy (
-     RPC_BINDING_HANDLE SourceBinding,
-     RPC_BINDING_HANDLE  * DestinationBinding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingIsClientLocal (
-     RPC_BINDING_HANDLE BindingHandle ,
-     unsigned int  * ClientLocalFlag
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqConnId (
-     RPC_BINDING_HANDLE Binding,
-     void **ConnId,
-     int *pfFirstCall
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcSsDontSerializeContext (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcLaunchDatagramReceiveThread(
-    void  * pAddress
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerRegisterForwardFunction (
-     RPC_FORWARD_FUNCTION  * pForwardFunction
-    );
-
-RPC_ADDRESS_CHANGE_FN * __stdcall
-I_RpcServerInqAddressChangeFn();
-
-RPC_STATUS __stdcall
-I_RpcServerSetAddressChangeFn(
-     RPC_ADDRESS_CHANGE_FN * pAddressChangeFn
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerInqLocalConnAddress (
-     RPC_BINDING_HANDLE Binding,
-      void *Buffer,
-      unsigned long *BufferSize,
-     unsigned long *AddressFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcSessionStrictContextHandle (
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcTurnOnEEInfoPropagation (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcConnectionInqSockBuffSize(
-   unsigned long  * RecvBuffSize,
-   unsigned long  * SendBuffSize
-  );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcConnectionSetSockBuffSize(
-    unsigned long RecvBuffSize,
-    unsigned long SendBuffSize
-   );
-
-typedef
-void
-(*RPCLT_PDU_FILTER_FUNC) (
-     void *Buffer,
-     unsigned int BufferLength,
-     int fDatagram
-    );
-
-typedef
-void
-(__cdecl *RPC_SETFILTER_FUNC) (
-     RPCLT_PDU_FILTER_FUNC pfnFilter
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerStartListening(
-    void * hWnd
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerStopListening(
-    ) ;
-
-typedef RPC_STATUS (*RPC_BLOCKING_FN) (
-     void * hWnd,
-     void * Context,
-      void * hSyncEvent
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingSetAsync(
-     RPC_BINDING_HANDLE Binding,
-     RPC_BLOCKING_FN BlockingFn,
-     unsigned long ServerTid
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcSetThreadParams(
-     int fClientFree,
-      void *Context,
-      void * hWndClient
-    );
-
-__declspec(dllimport)
-unsigned int
-__stdcall
-I_RpcWindowProc(
-     void * hWnd,
-     unsigned int Message,
-     unsigned int wParam,
-     unsigned long lParam
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUnregisterEndpointA (
-         RPC_CSTR Protseq,
-         RPC_CSTR Endpoint
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUnregisterEndpointW (
-         RPC_WSTR Protseq,
-         RPC_WSTR Endpoint
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerInqTransportType(
-     unsigned int  * Type
-    ) ;
-
-__declspec(dllimport)
-long
-__stdcall
-I_RpcMapWin32Status (
-     RPC_STATUS Status
-    );
-
-typedef struct _RPC_C_OPT_METADATA_DESCRIPTOR
-{
-    unsigned long BufferSize;   
-    char *Buffer;               
-} RPC_C_OPT_METADATA_DESCRIPTOR;
-
-typedef struct _RDR_CALLOUT_STATE
-{
-    
-    RPC_STATUS LastError;
-    void *LastEEInfo;
-
-    RPC_HTTP_REDIRECTOR_STAGE LastCalledStage;
-
-    
-    unsigned short *ServerName;   
-    unsigned short *ServerPort;   
-    unsigned short *RemoteUser;   
-    unsigned short *AuthType;     
-    unsigned char ResourceTypePresent;
-    unsigned char MetadataPresent;
-    unsigned char SessionIdPresent;
-    unsigned char InterfacePresent;
-    UUID ResourceType;
-    RPC_C_OPT_METADATA_DESCRIPTOR Metadata;     
-    UUID SessionId;
-    RPC_SYNTAX_IDENTIFIER Interface;
-    void *CertContext;            
-                                  
-                                  
-} RDR_CALLOUT_STATE;
-
-typedef RPC_STATUS
-(__stdcall *I_RpcProxyIsValidMachineFn)
-        (
-         char *pszMachine,
-         char *pszDotMachine,
-         unsigned long dwPortNumber        
-        );
-
-typedef RPC_STATUS
-(__stdcall *I_RpcProxyGetClientAddressFn)
-        (
-         void *Context,
-         char *Buffer,
-         unsigned long *BufferLength
-        );
-
-typedef RPC_STATUS
-(__stdcall *I_RpcProxyGetConnectionTimeoutFn)
-        (
-         unsigned long *ConnectionTimeout
-        );
-
-typedef RPC_STATUS
-(__stdcall *I_RpcPerformCalloutFn) 
-    (
-     void *Context,
-     RDR_CALLOUT_STATE *CallOutState,
-     RPC_HTTP_REDIRECTOR_STAGE Stage
-    );
-
-typedef void
-(__stdcall *I_RpcFreeCalloutStateFn)
-    (
-     RDR_CALLOUT_STATE *CallOutState
-    );
-
-typedef struct tagI_RpcProxyCallbackInterface
-{
-    I_RpcProxyIsValidMachineFn IsValidMachineFn;
-    I_RpcProxyGetClientAddressFn GetClientAddressFn;
-    I_RpcProxyGetConnectionTimeoutFn GetConnectionTimeoutFn;
-    I_RpcPerformCalloutFn PerformCalloutFn;
-    I_RpcFreeCalloutStateFn FreeCalloutStateFn;
-} I_RpcProxyCallbackInterface;
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcProxyNewConnection (
-     unsigned long ConnectionType,
-     unsigned short *ServerAddress,
-     unsigned short *ServerPort,
-     unsigned short *MinConnTimeout,
-     void *ConnectionParameter,
-      RDR_CALLOUT_STATE *CallOutState, 
-     I_RpcProxyCallbackInterface *ProxyCallbackInterface
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcReplyToClientWithStatus (
-     void *ConnectionParameter,
-     RPC_STATUS RpcStatus
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcRecordCalloutFailure (
-     RPC_STATUS RpcStatus,
-     RDR_CALLOUT_STATE *CallOutState,
-     unsigned short *DllName
-    );
-
-
-}
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-typedef void  * RPC_NS_HANDLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingExportA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           RPC_BINDING_VECTOR  *BindingVec,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingUnexportA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingExportW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           RPC_BINDING_VECTOR  *BindingVec,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingUnexportW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-
-
-
-
-RPC_STATUS __stdcall
-RpcNsBindingExportPnPA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR *ObjectVector
-    );
-
-RPC_STATUS __stdcall
-RpcNsBindingUnexportPnPA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR *ObjectVector
-    );
-
-
-
-RPC_STATUS __stdcall
-RpcNsBindingExportPnPW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR *ObjectVector
-    );
-
-RPC_STATUS __stdcall
-RpcNsBindingUnexportPnPW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR *ObjectVector
-    );
-
-
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingLookupBeginA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID  *ObjUuid,
-         unsigned long BindingMaxCount,
-         RPC_NS_HANDLE  *LookupContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingLookupBeginW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID  *ObjUuid,
-         unsigned long BindingMaxCount,
-         RPC_NS_HANDLE  *LookupContext
-    );
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingLookupNext(
-      RPC_NS_HANDLE LookupContext,
-     RPC_BINDING_VECTOR  *  * BindingVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingLookupDone(
-      RPC_NS_HANDLE  * LookupContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupDeleteA(
-         unsigned long GroupNameSyntax,
-           RPC_CSTR GroupName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrAddA(
-         unsigned long GroupNameSyntax,
-         RPC_CSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_CSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrRemoveA(
-         unsigned long GroupNameSyntax,
-         RPC_CSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_CSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqBeginA(
-         unsigned long GroupNameSyntax,
-         RPC_CSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqNextA(
-         RPC_NS_HANDLE InquiryContext,
-                  RPC_CSTR  *MemberName
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupDeleteW(
-         unsigned long GroupNameSyntax,
-           RPC_WSTR GroupName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrAddW(
-         unsigned long GroupNameSyntax,
-         RPC_WSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_WSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrRemoveW(
-         unsigned long GroupNameSyntax,
-         RPC_WSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_WSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqBeginW(
-         unsigned long GroupNameSyntax,
-         RPC_WSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqNextW(
-         RPC_NS_HANDLE InquiryContext,
-                  RPC_WSTR  *MemberName
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqDone(
-      RPC_NS_HANDLE  * InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileDeleteA(
-         unsigned long ProfileNameSyntax,
-         RPC_CSTR ProfileName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltAddA(
-         unsigned long ProfileNameSyntax,
-         RPC_CSTR ProfileName,
-           RPC_IF_ID  *IfId,
-         unsigned long MemberNameSyntax,
-         RPC_CSTR MemberName,
-         unsigned long Priority,
-           RPC_CSTR Annotation
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltRemoveA(
-         unsigned long ProfileNameSyntax,
-         RPC_CSTR ProfileName,
-           RPC_IF_ID  *IfId,
-         unsigned long MemberNameSyntax,
-         RPC_CSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqBeginA(
-         unsigned long ProfileNameSyntax,
-         RPC_CSTR ProfileName,
-         unsigned long InquiryType,
-           RPC_IF_ID  *IfId,
-         unsigned long VersOption,
-         unsigned long MemberNameSyntax,
-           RPC_CSTR MemberName,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqNextA(
-         RPC_NS_HANDLE InquiryContext,
-           RPC_IF_ID  *IfId,
-         RPC_CSTR  *MemberName,
-         unsigned long  *Priority,
-         RPC_CSTR  *Annotation
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileDeleteW(
-         unsigned long ProfileNameSyntax,
-         RPC_WSTR ProfileName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltAddW(
-         unsigned long ProfileNameSyntax,
-         RPC_WSTR ProfileName,
-           RPC_IF_ID  *IfId,
-         unsigned long MemberNameSyntax,
-         RPC_WSTR MemberName,
-         unsigned long Priority,
-           RPC_WSTR Annotation
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltRemoveW(
-         unsigned long ProfileNameSyntax,
-         RPC_WSTR ProfileName,
-           RPC_IF_ID  *IfId,
-         unsigned long MemberNameSyntax,
-         RPC_WSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqBeginW(
-         unsigned long ProfileNameSyntax,
-         RPC_WSTR ProfileName,
-         unsigned long InquiryType,
-           RPC_IF_ID  *IfId,
-         unsigned long VersOption,
-         unsigned long MemberNameSyntax,
-           RPC_WSTR MemberName,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqNextW(
-         RPC_NS_HANDLE InquiryContext,
-           RPC_IF_ID  *IfId,
-         RPC_WSTR  *MemberName,
-         unsigned long  *Priority,
-         RPC_WSTR  *Annotation
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqDone(
-      RPC_NS_HANDLE  * InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryObjectInqBeginA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryObjectInqBeginW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryObjectInqNext(
-      RPC_NS_HANDLE InquiryContext,
-     UUID  * ObjUuid
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryObjectInqDone(
-      RPC_NS_HANDLE  * InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryExpandNameA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName,
-         RPC_CSTR  *ExpandedName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtBindingUnexportA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName,
-           RPC_IF_ID  *IfId,
-         unsigned long VersOption,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryCreateA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryDeleteA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryInqIfIdsA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName,
-         RPC_IF_ID_VECTOR  *  *IfIdVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtHandleSetExpAge(
-     RPC_NS_HANDLE NsHandle,
-     unsigned long ExpirationAge
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtInqExpAge(
-     unsigned long  * ExpirationAge
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtSetExpAge(
-     unsigned long ExpirationAge
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryExpandNameW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName,
-         RPC_WSTR  *ExpandedName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtBindingUnexportW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName,
-           RPC_IF_ID  *IfId,
-         unsigned long VersOption,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryCreateW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryDeleteW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryInqIfIdsW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName,
-         RPC_IF_ID_VECTOR  *  *IfIdVec
-    );
-
-
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingImportBeginA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID  *ObjUuid,
-         RPC_NS_HANDLE  *ImportContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingImportBeginW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID  *ObjUuid,
-         RPC_NS_HANDLE  *ImportContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingImportNext(
-     RPC_NS_HANDLE ImportContext,
-     RPC_BINDING_HANDLE   * Binding
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingImportDone(
-      RPC_NS_HANDLE  * ImportContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingSelect(
-      RPC_BINDING_VECTOR  * BindingVec,
-     RPC_BINDING_HANDLE   * Binding
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-typedef
-enum _RPC_NOTIFICATION_TYPES
-{
-    RpcNotificationTypeNone,
-    RpcNotificationTypeEvent,
-    RpcNotificationTypeApc,
-    RpcNotificationTypeIoc,
-    RpcNotificationTypeHwnd,
-    RpcNotificationTypeCallback
-} RPC_NOTIFICATION_TYPES;
-
-typedef
-enum _RPC_ASYNC_EVENT {
-    RpcCallComplete,
-    RpcSendComplete,
-    RpcReceiveComplete
-    } RPC_ASYNC_EVENT;
-
-struct _RPC_ASYNC_STATE;
-
-typedef void __stdcall
-RPCNOTIFICATION_ROUTINE (
-                  struct _RPC_ASYNC_STATE *pAsync,
-                  void *Context,
-                  RPC_ASYNC_EVENT Event);
-typedef RPCNOTIFICATION_ROUTINE *PFN_RPCNOTIFICATION_ROUTINE;
-
-typedef struct _RPC_ASYNC_STATE {
-    unsigned int    Size; 
-    unsigned long   Signature;
-    long   Lock;
-    unsigned long   Flags;
-    void           *StubInfo;
-    void           *UserInfo;
-    void           *RuntimeInfo;
-    RPC_ASYNC_EVENT Event;
-
-    RPC_NOTIFICATION_TYPES NotificationType;
-    union {
-        
-        
-        
-        struct {
-            PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
-            HANDLE hThread;
-            } APC;
-
-        
-        
-        
-        struct {
-            HANDLE hIOPort;
-            DWORD dwNumberOfBytesTransferred;
-            DWORD_PTR dwCompletionKey;
-            LPOVERLAPPED lpOverlapped;
-            } IOC;
-
-        
-        
-        
-        struct {
-            HWND hWnd;
-            UINT Msg;
-            } HWND;
-
-
-        
-        
-        
-        HANDLE hEvent;
-
-        
-        
-        
-        
-        
-        PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
-        } u;
-
-    LONG_PTR Reserved[4];
-    } RPC_ASYNC_STATE, *PRPC_ASYNC_STATE;
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncInitializeHandle (
-    PRPC_ASYNC_STATE pAsync,
-    unsigned int     Size
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncRegisterInfo (
-    PRPC_ASYNC_STATE pAsync
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncGetCallStatus (
-    PRPC_ASYNC_STATE pAsync
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncCompleteCall (
-    PRPC_ASYNC_STATE pAsync,
-    void *Reply
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncAbortCall (
-    PRPC_ASYNC_STATE pAsync,
-    unsigned long ExceptionCode
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncCancelCall (
-     PRPC_ASYNC_STATE pAsync,
-     BOOL fAbort
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncCleanupThread (
-     DWORD dwTimeout
-    );
-
-typedef enum tagExtendedErrorParamTypes
-{
-    eeptAnsiString = 1,
-    eeptUnicodeString,
-    eeptLongVal,
-    eeptShortVal,
-    eeptPointerVal,
-    eeptNone,
-    eeptBinary
-} ExtendedErrorParamTypes;
-
-
-
-
-typedef struct tagBinaryParam
-{
-    void *Buffer;
-    short Size;
-} BinaryParam;
-
-typedef struct tagRPC_EE_INFO_PARAM
-{
-    ExtendedErrorParamTypes ParameterType;
-    union
-        {
-        LPSTR AnsiString;
-        LPWSTR UnicodeString;
-        long LVal;
-        short SVal;
-        ULONGLONG PVal;
-        BinaryParam BVal;
-        } u;
-} RPC_EE_INFO_PARAM;
-
-
-
-
-
-
-
-
-typedef struct tagRPC_EXTENDED_ERROR_INFO
-{
-    ULONG Version;
-    LPWSTR ComputerName;
-    ULONG ProcessID;
-    union
-        {
-        SYSTEMTIME SystemTime;
-        FILETIME FileTime;
-        } u;
-    ULONG GeneratingComponent;
-    ULONG Status;
-    USHORT DetectionLocation;
-    USHORT Flags;
-    int NumberOfParameters;
-    RPC_EE_INFO_PARAM Parameters[4];
-} RPC_EXTENDED_ERROR_INFO;
-
-typedef struct tagRPC_ERROR_ENUM_HANDLE
-{
-    ULONG Signature;
-    void *CurrentPos;
-    void *Head;
-} RPC_ERROR_ENUM_HANDLE;
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorStartEnumeration (
-      RPC_ERROR_ENUM_HANDLE *EnumHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorGetNextRecord (
-     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
-     BOOL CopyStrings, 
-     RPC_EXTENDED_ERROR_INFO *ErrorInfo
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorEndEnumeration (
-      RPC_ERROR_ENUM_HANDLE *EnumHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorResetEnumeration (
-      RPC_ERROR_ENUM_HANDLE *EnumHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorGetNumberOfRecords (
-     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
-     int *Records
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorSaveErrorInfo (
-     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
-     PVOID *ErrorBlob, 
-     size_t *BlobSize
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorLoadErrorInfo (
-     PVOID ErrorBlob, 
-     size_t BlobSize, 
-     RPC_ERROR_ENUM_HANDLE *EnumHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorAddRecord (
-     RPC_EXTENDED_ERROR_INFO *ErrorInfo
-    );
-
-__declspec(dllimport)
-void 
-__stdcall
-RpcErrorClearInformation (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcGetAuthorizationContextForClient (
-     RPC_BINDING_HANDLE ClientBinding ,
-     BOOL ImpersonateOnReturn,
-     PVOID Reserved1,
-     PLARGE_INTEGER pExpirationTime ,
-     LUID Reserved2,
-     DWORD Reserved3,
-     PVOID Reserved4,
-     PVOID *pAuthzClientContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcFreeAuthorizationContext (
-      PVOID *pAuthzClientContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSsContextLockExclusive (
-     RPC_BINDING_HANDLE ServerBindingHandle,
-     PVOID UserContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSsContextLockShared (
-     RPC_BINDING_HANDLE ServerBindingHandle,
-     PVOID UserContext
-    );
-
-
-
-
-
-typedef struct tagRPC_CALL_ATTRIBUTES_V1_W
-{
-    unsigned int Version;
-    unsigned long Flags;
-    unsigned long ServerPrincipalNameBufferLength;
-    unsigned short *ServerPrincipalName;
-    unsigned long ClientPrincipalNameBufferLength;
-    unsigned short *ClientPrincipalName;
-    unsigned long AuthenticationLevel;
-    unsigned long AuthenticationService;
-    BOOL NullSession;
-} RPC_CALL_ATTRIBUTES_V1_W;
-
-typedef struct tagRPC_CALL_ATTRIBUTES_V1_A
-{
-    unsigned int Version;
-    unsigned long Flags;
-    unsigned long ServerPrincipalNameBufferLength;
-    unsigned char *ServerPrincipalName;
-    unsigned long ClientPrincipalNameBufferLength;
-    unsigned char *ClientPrincipalName;
-    unsigned long AuthenticationLevel;
-    unsigned long AuthenticationService;
-    BOOL NullSession;
-} RPC_CALL_ATTRIBUTES_V1_A;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqCallAttributesW (
-     RPC_BINDING_HANDLE ClientBinding, 
-      void *RpcCallAttributes
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqCallAttributesA (
-     RPC_BINDING_HANDLE ClientBinding, 
-      void *RpcCallAttributes
-    );
-
-
-
-
-
-
-
-
-
-typedef RPC_CALL_ATTRIBUTES_V1_W RPC_CALL_ATTRIBUTES;
-
-
-
-
-RPC_STATUS __stdcall
-I_RpcAsyncSetHandle (
-      PRPC_MESSAGE Message,
-      PRPC_ASYNC_STATE pAsync
-    );
-
-RPC_STATUS __stdcall
-I_RpcAsyncAbortCall (
-     PRPC_ASYNC_STATE pAsync,
-     unsigned long ExceptionCode
-    ) ;
-
-int 
-__stdcall
-I_RpcExceptionFilter (
-    unsigned long ExceptionCode
-    );
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {            
-
-
-
-
-struct HDROP__ { int unused; }; typedef struct HDROP__ *HDROP;
-
-extern "C" __declspec(dllimport) UINT __stdcall DragQueryFileA(HDROP,UINT,LPSTR,UINT);
-extern "C" __declspec(dllimport) UINT __stdcall DragQueryFileW(HDROP,UINT,LPWSTR,UINT);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall DragQueryPoint(HDROP,LPPOINT);
-extern "C" __declspec(dllimport) void __stdcall DragFinish(HDROP);
-extern "C" __declspec(dllimport) void __stdcall DragAcceptFiles(HWND,BOOL);
-
-extern "C" __declspec(dllimport) HINSTANCE __stdcall ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
-extern "C" __declspec(dllimport) HINSTANCE __stdcall ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
-
-
-
-
-
-extern "C" __declspec(dllimport) HINSTANCE __stdcall FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
-extern "C" __declspec(dllimport) HINSTANCE __stdcall FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPWSTR * __stdcall  CommandLineToArgvW(LPCWSTR lpCmdLine, int*pNumArgs);
-
-extern "C" __declspec(dllimport) INT __stdcall ShellAboutA(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon);
-extern "C" __declspec(dllimport) INT __stdcall ShellAboutW(HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, HICON hIcon);
-
-
-
-
-
-extern "C" __declspec(dllimport) HICON __stdcall DuplicateIcon(HINSTANCE hInst, HICON hIcon);
-extern "C" __declspec(dllimport) HICON __stdcall ExtractAssociatedIconA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIcon);
-extern "C" __declspec(dllimport) HICON __stdcall ExtractAssociatedIconW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIcon);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HICON __stdcall ExtractIconA(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex);
-extern "C" __declspec(dllimport) HICON __stdcall ExtractIconW(HINSTANCE hInst, LPCWSTR lpszExeFileName, UINT nIconIndex);
-
-
-
-
-
-
-
-typedef struct _DRAGINFOA {
-    UINT uSize;                 
-    POINT pt;
-    BOOL fNC;
-    LPSTR   lpFileList;
-    DWORD grfKeyState;
-} DRAGINFOA, *LPDRAGINFOA;
-typedef struct _DRAGINFOW {
-    UINT uSize;                 
-    POINT pt;
-    BOOL fNC;
-    LPWSTR  lpFileList;
-    DWORD grfKeyState;
-} DRAGINFOW, *LPDRAGINFOW;
-
-typedef DRAGINFOW DRAGINFO;
-typedef LPDRAGINFOW LPDRAGINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _AppBarData
-{
-    DWORD cbSize;
-    HWND hWnd;
-    UINT uCallbackMessage;
-    UINT uEdge;
-    RECT rc;
-    LPARAM lParam; 
-} APPBARDATA, *PAPPBARDATA;
-
-
-extern "C" __declspec(dllimport) UINT_PTR __stdcall SHAppBarMessage(DWORD dwMessage, PAPPBARDATA pData);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall   DoEnvironmentSubstA(LPSTR szString, UINT cchString);
-extern "C" __declspec(dllimport) DWORD __stdcall   DoEnvironmentSubstW(LPWSTR szString, UINT cchString);
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) UINT __stdcall ExtractIconExA(LPCSTR lpszFile, int nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons);
-extern "C" __declspec(dllimport) UINT __stdcall ExtractIconExW(LPCWSTR lpszFile, int nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                      
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef WORD FILEOP_FLAGS;
-
-
-
-
-                                
-                                
-                                
-                                
-
-
-
-
-typedef WORD PRINTEROP_FLAGS;
-
-
-
-
-
-
-
-
-
-
-typedef struct _SHFILEOPSTRUCTA
-{
-        HWND            hwnd;
-        UINT            wFunc;
-        LPCSTR          pFrom;
-        LPCSTR          pTo;
-        FILEOP_FLAGS    fFlags;
-        BOOL            fAnyOperationsAborted;
-        LPVOID          hNameMappings;
-        LPCSTR           lpszProgressTitle; 
-} SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
-typedef struct _SHFILEOPSTRUCTW
-{
-        HWND            hwnd;
-        UINT            wFunc;
-        LPCWSTR         pFrom;
-        LPCWSTR         pTo;
-        FILEOP_FLAGS    fFlags;
-        BOOL            fAnyOperationsAborted;
-        LPVOID          hNameMappings;
-        LPCWSTR          lpszProgressTitle; 
-} SHFILEOPSTRUCTW, *LPSHFILEOPSTRUCTW;
-
-typedef SHFILEOPSTRUCTW SHFILEOPSTRUCT;
-typedef LPSHFILEOPSTRUCTW LPSHFILEOPSTRUCT;
-
-
-
-
-
-extern "C" __declspec(dllimport) int __stdcall SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp);
-extern "C" __declspec(dllimport) int __stdcall SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall SHFreeNameMappings(HANDLE hNameMappings);
-
-typedef struct _SHNAMEMAPPINGA
-{
-    LPSTR   pszOldPath;
-    LPSTR   pszNewPath;
-    int   cchOldPath;
-    int   cchNewPath;
-} SHNAMEMAPPINGA, *LPSHNAMEMAPPINGA;
-typedef struct _SHNAMEMAPPINGW
-{
-    LPWSTR  pszOldPath;
-    LPWSTR  pszNewPath;
-    int   cchOldPath;
-    int   cchNewPath;
-} SHNAMEMAPPINGW, *LPSHNAMEMAPPINGW;
-
-typedef SHNAMEMAPPINGW SHNAMEMAPPING;
-typedef LPSHNAMEMAPPINGW LPSHNAMEMAPPING;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SHELLEXECUTEINFOA
-{
-        DWORD cbSize;
-        ULONG fMask;
-        HWND hwnd;
-        LPCSTR   lpVerb;
-        LPCSTR   lpFile;
-        LPCSTR   lpParameters;
-        LPCSTR   lpDirectory;
-        int nShow;
-        HINSTANCE hInstApp;
-        
-        LPVOID lpIDList;
-        LPCSTR   lpClass;
-        HKEY hkeyClass;
-        DWORD dwHotKey;
-        union {
-        HANDLE hIcon;
-        HANDLE hMonitor;
-        } ;
-        HANDLE hProcess;
-} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;
-typedef struct _SHELLEXECUTEINFOW
-{
-        DWORD cbSize;
-        ULONG fMask;
-        HWND hwnd;
-        LPCWSTR  lpVerb;
-        LPCWSTR  lpFile;
-        LPCWSTR  lpParameters;
-        LPCWSTR  lpDirectory;
-        int nShow;
-        HINSTANCE hInstApp;
-        
-        LPVOID lpIDList;
-        LPCWSTR  lpClass;
-        HKEY hkeyClass;
-        DWORD dwHotKey;
-        union {
-        HANDLE hIcon;
-        HANDLE hMonitor;
-        } ;
-        HANDLE hProcess;
-} SHELLEXECUTEINFOW, *LPSHELLEXECUTEINFOW;
-
-typedef SHELLEXECUTEINFOW SHELLEXECUTEINFO;
-typedef LPSHELLEXECUTEINFOW LPSHELLEXECUTEINFO;
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall ShellExecuteExA(LPSHELLEXECUTEINFOA lpExecInfo);
-extern "C" __declspec(dllimport) BOOL __stdcall ShellExecuteExW(LPSHELLEXECUTEINFOW lpExecInfo);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall WinExecErrorA(HWND hwnd, int error, LPCSTR lpstrFileName, LPCSTR lpstrTitle);
-extern "C" __declspec(dllimport) void __stdcall WinExecErrorW(HWND hwnd, int error, LPCWSTR lpstrFileName, LPCWSTR lpstrTitle);
-
-
-
-
-
-
-
-
-typedef struct _SHCREATEPROCESSINFOW
-{
-        DWORD cbSize;
-        ULONG fMask;
-        HWND hwnd;
-        LPCWSTR  pszFile;
-        LPCWSTR  pszParameters;
-        LPCWSTR  pszCurrentDirectory;
-         HANDLE hUserToken;
-         LPSECURITY_ATTRIBUTES lpProcessAttributes;
-         LPSECURITY_ATTRIBUTES lpThreadAttributes;
-         BOOL bInheritHandles;
-         DWORD dwCreationFlags;
-         LPSTARTUPINFOW lpStartupInfo;
-         LPPROCESS_INFORMATION lpProcessInformation;
-} SHCREATEPROCESSINFOW, *PSHCREATEPROCESSINFOW;
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHCreateProcessAsUserW(PSHCREATEPROCESSINFOW pscpi);
-
-
-
-
-
-
-
-
-
-
-typedef struct _SHQUERYRBINFO {
-    DWORD   cbSize;
-
-    __int64 i64Size;
-    __int64 i64NumItems;
-
-
-
-
-} SHQUERYRBINFO, *LPSHQUERYRBINFO;
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHQueryRecycleBinA(LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _NOTIFYICONDATAA {
-        DWORD cbSize;
-        HWND hWnd;
-        UINT uID;
-        UINT uFlags;
-        UINT uCallbackMessage;
-        HICON hIcon;
-
-
-
-        CHAR   szTip[128];
-
-
-        DWORD dwState;
-        DWORD dwStateMask;
-        CHAR   szInfo[256];
-        union {
-            UINT  uTimeout;
-            UINT  uVersion;
-        } ;
-        CHAR   szInfoTitle[64];
-        DWORD dwInfoFlags;
-
-
-        GUID guidItem;
-
-} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
-typedef struct _NOTIFYICONDATAW {
-        DWORD cbSize;
-        HWND hWnd;
-        UINT uID;
-        UINT uFlags;
-        UINT uCallbackMessage;
-        HICON hIcon;
-
-
-
-        WCHAR  szTip[128];
-
-
-        DWORD dwState;
-        DWORD dwStateMask;
-        WCHAR  szInfo[256];
-        union {
-            UINT  uTimeout;
-            UINT  uVersion;
-        } ;
-        WCHAR  szInfoTitle[64];
-        DWORD dwInfoFlags;
-
-
-        GUID guidItem;
-
-} NOTIFYICONDATAW, *PNOTIFYICONDATAW;
-
-typedef NOTIFYICONDATAW NOTIFYICONDATA;
-typedef PNOTIFYICONDATAW PNOTIFYICONDATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA lpData);
-extern "C" __declspec(dllimport) BOOL __stdcall Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW lpData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SHFILEINFOA
-{
-        HICON       hIcon;                      
-        int         iIcon;                      
-        DWORD       dwAttributes;               
-        CHAR        szDisplayName[260];    
-        CHAR        szTypeName[80];             
-} SHFILEINFOA;
-typedef struct _SHFILEINFOW
-{
-        HICON       hIcon;                      
-        int         iIcon;                      
-        DWORD       dwAttributes;               
-        WCHAR       szDisplayName[260];    
-        WCHAR       szTypeName[80];             
-} SHFILEINFOW;
-
-typedef SHFILEINFOW SHFILEINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                
-
-
-extern "C" __declspec(dllimport) DWORD_PTR __stdcall SHGetFileInfoA(LPCSTR pszPath, DWORD dwFileAttributes, SHFILEINFOA *psfi, UINT cbFileInfo, UINT uFlags);
-extern "C" __declspec(dllimport) DWORD_PTR __stdcall SHGetFileInfoW(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags);
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHGetDiskFreeSpaceExA(LPCSTR pszDirectoryName, ULARGE_INTEGER* pulFreeBytesAvailableToCaller, ULARGE_INTEGER* pulTotalNumberOfBytes, ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
-extern "C" __declspec(dllimport) BOOL __stdcall SHGetDiskFreeSpaceExW(LPCWSTR pszDirectoryName, ULARGE_INTEGER* pulFreeBytesAvailableToCaller, ULARGE_INTEGER* pulTotalNumberOfBytes, ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHGetNewLinkInfoA(LPCSTR pszLinkTo, LPCSTR pszDir, LPSTR pszName, BOOL *pfMustCopy, UINT uFlags);
-extern "C" __declspec(dllimport) BOOL __stdcall SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, BOOL *pfMustCopy, UINT uFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHInvokePrinterCommandA(HWND hwnd, UINT uAction, LPCSTR lpBuf1, LPCSTR lpBuf2, BOOL fModal);
-extern "C" __declspec(dllimport) BOOL __stdcall SHInvokePrinterCommandW(HWND hwnd, UINT uAction, LPCWSTR lpBuf1, LPCWSTR lpBuf2, BOOL fModal);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHLoadNonloadedIconOverlayIdentifiers(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHIsFileAvailableOffline(LPCWSTR pwszPath, LPDWORD pdwStatus);
-
-
-
-
-                                            
-                                            
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHSetLocalizedName(LPWSTR pszPath, LPCWSTR pszResModule, int idsRes);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall          SHEnumerateUnreadMailAccountsA(HKEY hKeyUser, DWORD dwIndex, LPSTR pszMailAddress, int cchMailAddress);
-extern "C" HRESULT __stdcall          SHEnumerateUnreadMailAccountsW(HKEY hKeyUser, DWORD dwIndex, LPWSTR pszMailAddress, int cchMailAddress);
-
-
-
-
-
-extern "C" HRESULT __stdcall          SHGetUnreadMailCountA(HKEY hKeyUser, LPCSTR pszMailAddress, DWORD *pdwCount, FILETIME *pFileTime, LPSTR pszShellExecuteCommand, int cchShellExecuteCommand);
-extern "C" HRESULT __stdcall          SHGetUnreadMailCountW(HKEY hKeyUser, LPCWSTR pszMailAddress, DWORD *pdwCount, FILETIME *pFileTime, LPWSTR pszShellExecuteCommand, int cchShellExecuteCommand);
-
-
-
-
-
-extern "C" HRESULT __stdcall          SHSetUnreadMailCountA(LPCSTR pszMailAddress, DWORD dwCount, LPCSTR pszShellExecuteCommand);
-extern "C" HRESULT __stdcall          SHSetUnreadMailCountW(LPCWSTR pszMailAddress, DWORD dwCount, LPCWSTR pszShellExecuteCommand);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall SHGetImageList(int iImageList, const IID & riid, void **ppvObj);
-
-
-
-
-
-
-
-
-
-
-typedef HRESULT (__stdcall *PFNCANSHAREFOLDERW)( LPCWSTR pszPath);
-typedef HRESULT (__stdcall *PFNSHOWSHAREFOLDERUIW)( HWND hwndParent,  LPCWSTR pszPath);
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_DATA_BLOCK {
-    WCHAR           Signature[4];       
-    DWORD           LittleEndian;       
-    DWORD           Version;            
-                                        
-    DWORD           Revision;           
-                                        
-    DWORD           TotalByteLength;    
-    DWORD           HeaderLength;       
-    DWORD           NumObjectTypes;     
-                                        
-    LONG            DefaultObject;      
-                                        
-                                        
-                                        
-                                        
-    SYSTEMTIME      SystemTime;         
-                                        
-    LARGE_INTEGER   PerfTime;           
-                                        
-    LARGE_INTEGER   PerfFreq;           
-                                        
-    LARGE_INTEGER   PerfTime100nSec;    
-                                        
-    DWORD           SystemNameLength;   
-    DWORD           SystemNameOffset;   
-                                        
-                                        
-} PERF_DATA_BLOCK, *PPERF_DATA_BLOCK;
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_OBJECT_TYPE {
-    DWORD           TotalByteLength;    
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-    DWORD           DefinitionLength;   
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-    DWORD           HeaderLength;       
-                                        
-                                        
-                                        
-    DWORD           ObjectNameTitleIndex;
-                                        
-
-
-
-    LPWSTR          ObjectNameTitle;    
-                                        
-                                        
-
-    DWORD           ObjectHelpTitleIndex;
-                                        
-
-
-
-    LPWSTR          ObjectHelpTitle;    
-                                        
-                                        
-
-    DWORD           DetailLevel;        
-                                        
-                                        
-                                        
-    DWORD           NumCounters;        
-                                        
-                                        
-    LONG            DefaultCounter;     
-                                        
-                                        
-                                        
-    LONG            NumInstances;       
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-    DWORD           CodePage;           
-                                        
-                                        
-    LARGE_INTEGER   PerfTime;           
-                                        
-    LARGE_INTEGER   PerfFreq;           
-                                        
-} PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_COUNTER_DEFINITION {
-    DWORD           ByteLength;         
-    DWORD           CounterNameTitleIndex;
-                                        
-                                        
-
-
-
-    LPWSTR          CounterNameTitle;   
-                                        
-                                        
-
-    DWORD           CounterHelpTitleIndex;
-                                        
-                                        
-
-
-
-    LPWSTR          CounterHelpTitle;   
-                                        
-                                        
-
-    LONG            DefaultScale;       
-                                        
-                                        
-    DWORD           DetailLevel;        
-                                        
-    DWORD           CounterType;        
-    DWORD           CounterSize;        
-    DWORD           CounterOffset;      
-                                        
-                                        
-} PERF_COUNTER_DEFINITION, *PPERF_COUNTER_DEFINITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_INSTANCE_DEFINITION {
-    DWORD           ByteLength;         
-                                        
-    DWORD           ParentObjectTitleIndex;
-                                        
-                                        
-                                        
-                                        
-                                        
-    DWORD           ParentObjectInstance;
-                                        
-                                        
-                                        
-    LONG            UniqueID;           
-                                        
-                                        
-    DWORD           NameOffset;         
-                                        
-                                        
-    DWORD           NameLength;         
-                                        
-                                        
-                                        
-                                        
-                                        
-} PERF_INSTANCE_DEFINITION, *PPERF_INSTANCE_DEFINITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_COUNTER_BLOCK {
-    DWORD           ByteLength;         
-                                        
-} PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD (__stdcall PM_OPEN_PROC) (LPWSTR);
-typedef DWORD (__stdcall PM_COLLECT_PROC) (LPWSTR, LPVOID *, LPDWORD, LPDWORD);
-typedef DWORD (__stdcall PM_CLOSE_PROC) (void);
-typedef DWORD (__stdcall PM_QUERY_PROC) (LPDWORD, LPVOID *, LPDWORD, LPDWORD);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)    
-
-
-
-#pragma once
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned int ALG_ID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ULONG_PTR HCRYPTPROV;
-typedef ULONG_PTR HCRYPTKEY;
-typedef ULONG_PTR HCRYPTHASH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                            
-                                            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMS_KEY_INFO {
-    DWORD       dwVersion;                      
-    ALG_ID  Algid;                              
-    BYTE    *pbOID;                             
-    DWORD   cbOID;                              
-} CMS_KEY_INFO, *PCMS_KEY_INFO;
-
-
-typedef struct _HMAC_Info {
-    ALG_ID  HashAlgid;
-    BYTE    *pbInnerString;
-    DWORD   cbInnerString;
-    BYTE    *pbOuterString;
-    DWORD   cbOuterString;
-} HMAC_INFO, *PHMAC_INFO;
-
-
-typedef struct _SCHANNEL_ALG {
-    DWORD   dwUse;
-    ALG_ID  Algid;
-    DWORD   cBits;
-    DWORD   dwFlags;
-    DWORD   dwReserved;
-} SCHANNEL_ALG, *PSCHANNEL_ALG;
-
-
-
-
-
-
-
-
-typedef struct _PROV_ENUMALGS {
-    ALG_ID    aiAlgid;
-    DWORD     dwBitLen;
-    DWORD     dwNameLen;
-    CHAR      szName[20];
-} PROV_ENUMALGS;
-
-typedef struct _PROV_ENUMALGS_EX {
-    ALG_ID    aiAlgid;
-    DWORD     dwDefaultLen;
-    DWORD     dwMinLen;
-    DWORD     dwMaxLen;
-    DWORD     dwProtocols;
-    DWORD     dwNameLen;
-    CHAR      szName[20];
-    DWORD     dwLongNameLen;
-    CHAR      szLongName[40];
-} PROV_ENUMALGS_EX;
-
-typedef struct _PUBLICKEYSTRUC {
-        BYTE    bType;
-        BYTE    bVersion;
-        WORD    reserved;
-        ALG_ID  aiKeyAlg;
-} BLOBHEADER, PUBLICKEYSTRUC;
-
-typedef struct _RSAPUBKEY {
-        DWORD   magic;                  
-        DWORD   bitlen;                 
-        DWORD   pubexp;                 
-                                        
-} RSAPUBKEY;
-
-typedef struct _PUBKEY {
-        DWORD   magic;
-        DWORD   bitlen;                 
-} DHPUBKEY, DSSPUBKEY, KEAPUBKEY, TEKPUBKEY;
-
-typedef struct _DSSSEED {
-        DWORD   counter;
-        BYTE    seed[20];
-} DSSSEED;
-
-typedef struct _PUBKEYVER3 {
-        DWORD   magic;
-        DWORD   bitlenP;                
-        DWORD   bitlenQ;                
-        DWORD   bitlenJ;                
-        DSSSEED DSSSeed;
-} DHPUBKEY_VER3, DSSPUBKEY_VER3;
-
-typedef struct _PRIVKEYVER3 {
-        DWORD   magic;
-        DWORD   bitlenP;                
-        DWORD   bitlenQ;                
-        DWORD   bitlenJ;                
-        DWORD   bitlenX;                
-        DSSSEED DSSSeed;
-} DHPRIVKEY_VER3, DSSPRIVKEY_VER3;
-
-typedef struct _KEY_TYPE_SUBTYPE {
-        DWORD   dwKeySpec;
-        GUID    Type;
-        GUID    Subtype;
-} KEY_TYPE_SUBTYPE, *PKEY_TYPE_SUBTYPE;
-
-typedef struct _CERT_FORTEZZA_DATA_PROP {
-    unsigned char   SerialNumber[8];
-    int             CertIndex;
-    unsigned char   CertLabel[36];
-} CERT_FORTEZZA_DATA_PROP;
-
-typedef struct _CRYPT_RC4_KEY_STATE {
-    unsigned char Key[16];
-    unsigned char SBox[256];
-    unsigned char i;
-    unsigned char j;
-} CRYPT_RC4_KEY_STATE, *PCRYPT_RC4_KEY_STATE;
-
-typedef struct _CRYPT_DES_KEY_STATE {
-    unsigned char Key[8];
-    unsigned char IV[8];
-    unsigned char Feedback[8];
-} CRYPT_DES_KEY_STATE, *PCRYPT_DES_KEY_STATE;
-
-typedef struct _CRYPT_3DES_KEY_STATE {
-    unsigned char Key[24];
-    unsigned char IV[8];
-    unsigned char Feedback[8];
-} CRYPT_3DES_KEY_STATE, *PCRYPT_3DES_KEY_STATE;
-
-
-
-
-
-typedef struct _CRYPTOAPI_BLOB {
-    DWORD   cbData;
-    BYTE    *pbData;
-} CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB,
-CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB,
-CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB,
-CERT_NAME_BLOB, *PCERT_NAME_BLOB,
-CERT_RDN_VALUE_BLOB, *PCERT_RDN_VALUE_BLOB,
-CERT_BLOB, *PCERT_BLOB,
-CRL_BLOB, *PCRL_BLOB,
-DATA_BLOB, *PDATA_BLOB,
-CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB,
-CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB,
-CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB,
-CRYPT_DER_BLOB, *PCRYPT_DER_BLOB,
-CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB;
-
-
-typedef struct _CMS_DH_KEY_INFO {
-    DWORD               dwVersion;                      
-    ALG_ID          Algid;                              
-    LPSTR           pszContentEncObjId; 
-    CRYPT_DATA_BLOB PubInfo;            
-    void            *pReserved;         
-} CMS_DH_KEY_INFO, *PCMS_DH_KEY_INFO;
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptAcquireContextA(
-    HCRYPTPROV *phProv,
-    LPCSTR szContainer,
-    LPCSTR szProvider,
-    DWORD dwProvType,
-    DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptAcquireContextW(
-    HCRYPTPROV *phProv,
-    LPCWSTR szContainer,
-    LPCWSTR szProvider,
-    DWORD dwProvType,
-    DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptReleaseContext(
-    HCRYPTPROV hProv,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGenKey(
-    HCRYPTPROV hProv,
-    ALG_ID Algid,
-    DWORD dwFlags,
-    HCRYPTKEY *phKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDeriveKey(
-    HCRYPTPROV hProv,
-    ALG_ID Algid,
-    HCRYPTHASH hBaseData,
-    DWORD dwFlags,
-    HCRYPTKEY *phKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDestroyKey(
-    HCRYPTKEY hKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetKeyParam(
-    HCRYPTKEY hKey,
-    DWORD dwParam,
-    const BYTE *pbData,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetKeyParam(
-    HCRYPTKEY hKey,
-    DWORD dwParam,
-    BYTE *pbData,
-    DWORD *pdwDataLen,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetHashParam(
-    HCRYPTHASH hHash,
-    DWORD dwParam,
-    const BYTE *pbData,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetHashParam(
-    HCRYPTHASH hHash,
-    DWORD dwParam,
-    BYTE *pbData,
-    DWORD *pdwDataLen,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProvParam(
-    HCRYPTPROV hProv,
-    DWORD dwParam,
-    const BYTE *pbData,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetProvParam(
-    HCRYPTPROV hProv,
-    DWORD dwParam,
-    BYTE *pbData,
-    DWORD *pdwDataLen,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGenRandom(
-    HCRYPTPROV hProv,
-    DWORD dwLen,
-    BYTE *pbBuffer
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetUserKey(
-    HCRYPTPROV hProv,
-    DWORD dwKeySpec,
-    HCRYPTKEY *phUserKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportKey(
-    HCRYPTKEY hKey,
-    HCRYPTKEY hExpKey,
-    DWORD dwBlobType,
-    DWORD dwFlags,
-    BYTE *pbData,
-    DWORD *pdwDataLen
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptImportKey(
-    HCRYPTPROV hProv,
-    const BYTE *pbData,
-    DWORD dwDataLen,
-    HCRYPTKEY hPubKey,
-    DWORD dwFlags,
-    HCRYPTKEY *phKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEncrypt(
-    HCRYPTKEY hKey,
-    HCRYPTHASH hHash,
-    BOOL Final,
-    DWORD dwFlags,
-    BYTE *pbData,
-    DWORD *pdwDataLen,
-    DWORD dwBufLen
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecrypt(
-    HCRYPTKEY hKey,
-    HCRYPTHASH hHash,
-    BOOL Final,
-    DWORD dwFlags,
-    BYTE *pbData,
-    DWORD *pdwDataLen
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCreateHash(
-    HCRYPTPROV hProv,
-    ALG_ID Algid,
-    HCRYPTKEY hKey,
-    DWORD dwFlags,
-    HCRYPTHASH *phHash
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashData(
-    HCRYPTHASH hHash,
-    const BYTE *pbData,
-    DWORD dwDataLen,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashSessionKey(
-    HCRYPTHASH hHash,
-    HCRYPTKEY hKey,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDestroyHash(
-    HCRYPTHASH hHash
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignHashA(
-    HCRYPTHASH hHash,
-    DWORD dwKeySpec,
-    LPCSTR szDescription,
-    DWORD dwFlags,
-    BYTE *pbSignature,
-    DWORD *pdwSigLen
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignHashW(
-    HCRYPTHASH hHash,
-    DWORD dwKeySpec,
-    LPCWSTR szDescription,
-    DWORD dwFlags,
-    BYTE *pbSignature,
-    DWORD *pdwSigLen
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifySignatureA(
-    HCRYPTHASH hHash,
-    const BYTE *pbSignature,
-    DWORD dwSigLen,
-    HCRYPTKEY hPubKey,
-    LPCSTR szDescription,
-    DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifySignatureW(
-    HCRYPTHASH hHash,
-    const BYTE *pbSignature,
-    DWORD dwSigLen,
-    HCRYPTKEY hPubKey,
-    LPCWSTR szDescription,
-    DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProviderA(
-    LPCSTR pszProvName,
-    DWORD dwProvType
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProviderW(
-    LPCWSTR pszProvName,
-    DWORD dwProvType
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProviderExA(
-    LPCSTR pszProvName,
-    DWORD dwProvType,
-    DWORD *pdwReserved,
-    DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProviderExW(
-    LPCWSTR pszProvName,
-    DWORD dwProvType,
-    DWORD *pdwReserved,
-    DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetDefaultProviderA(
-    DWORD dwProvType,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    LPSTR pszProvName,
-    DWORD *pcbProvName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetDefaultProviderW(
-    DWORD dwProvType,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    LPWSTR pszProvName,
-    DWORD *pcbProvName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumProviderTypesA(
-    DWORD dwIndex,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    DWORD *pdwProvType,
-    LPSTR szTypeName,
-    DWORD *pcbTypeName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumProviderTypesW(
-    DWORD dwIndex,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    DWORD *pdwProvType,
-    LPWSTR szTypeName,
-    DWORD *pcbTypeName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumProvidersA(
-    DWORD dwIndex,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    DWORD *pdwProvType,
-    LPSTR szProvName,
-    DWORD *pcbProvName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumProvidersW(
-    DWORD dwIndex,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    DWORD *pdwProvType,
-    LPWSTR szProvName,
-    DWORD *pcbProvName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptContextAddRef(
-    HCRYPTPROV hProv,
-    DWORD *pdwReserved,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDuplicateKey(
-    HCRYPTKEY hKey,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    HCRYPTKEY *phKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDuplicateHash(
-    HCRYPTHASH hHash,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    HCRYPTHASH *phHash
-    );
-
-
-
-
-
-
-
-BOOL 
-__cdecl 
-GetEncSChannel(
-    BYTE **pData, 
-    DWORD *dwDecSize
-    );
-
-
-
-
-
-typedef struct _CRYPT_BIT_BLOB {
-    DWORD   cbData;
-    BYTE    *pbData;
-    DWORD   cUnusedBits;
-} CRYPT_BIT_BLOB, *PCRYPT_BIT_BLOB;
-
-
-
-
-
-
-
-typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Parameters;
-} CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_OBJID_TABLE {
-    DWORD   dwAlgId;
-    LPCSTR  pszObjId;
-} CRYPT_OBJID_TABLE, *PCRYPT_OBJID_TABLE;
-
-
-
-
-
-typedef struct _CRYPT_HASH_INFO {
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    CRYPT_HASH_BLOB             Hash;
-} CRYPT_HASH_INFO, *PCRYPT_HASH_INFO;
-
-
-
-
-
-
-typedef struct _CERT_EXTENSION {
-    LPSTR               pszObjId;
-    BOOL                fCritical;
-    CRYPT_OBJID_BLOB    Value;
-} CERT_EXTENSION, *PCERT_EXTENSION;
-
-
-
-
-
-
-typedef struct _CRYPT_ATTRIBUTE_TYPE_VALUE {
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Value;
-} CRYPT_ATTRIBUTE_TYPE_VALUE, *PCRYPT_ATTRIBUTE_TYPE_VALUE;
-
-
-
-
-
-
-typedef struct _CRYPT_ATTRIBUTE {
-    LPSTR               pszObjId;
-    DWORD               cValue;
-    PCRYPT_ATTR_BLOB    rgValue;
-} CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE;
-
-typedef struct _CRYPT_ATTRIBUTES {
-     DWORD                cAttr;
-     PCRYPT_ATTRIBUTE     rgAttr;
-} CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;
-
-
-
-
-
-
-
-typedef struct _CERT_RDN_ATTR {
-    LPSTR                   pszObjId;
-    DWORD                   dwValueType;
-    CERT_RDN_VALUE_BLOB     Value;
-} CERT_RDN_ATTR, *PCERT_RDN_ATTR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_RDN {
-    DWORD           cRDNAttr;
-    PCERT_RDN_ATTR  rgRDNAttr;
-} CERT_RDN, *PCERT_RDN;
-
-
-
-
-
-typedef struct _CERT_NAME_INFO {
-    DWORD       cRDN;
-    PCERT_RDN   rgRDN;
-} CERT_NAME_INFO, *PCERT_NAME_INFO;
-
-
-
-
-
-
-
-typedef struct _CERT_NAME_VALUE {
-    DWORD               dwValueType;
-    CERT_RDN_VALUE_BLOB Value;
-} CERT_NAME_VALUE, *PCERT_NAME_VALUE;
-
-
-
-
-
-
-
-typedef struct _CERT_PUBLIC_KEY_INFO {
-    CRYPT_ALGORITHM_IDENTIFIER    Algorithm;
-    CRYPT_BIT_BLOB                PublicKey;
-} CERT_PUBLIC_KEY_INFO, *PCERT_PUBLIC_KEY_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_PRIVATE_KEY_INFO{
-    DWORD                       Version;
-    CRYPT_ALGORITHM_IDENTIFIER  Algorithm;
-    CRYPT_DER_BLOB              PrivateKey;
-    PCRYPT_ATTRIBUTES           pAttributes;
-}  CRYPT_PRIVATE_KEY_INFO, *PCRYPT_PRIVATE_KEY_INFO;
-
-
-
-
-
-typedef struct _CRYPT_ENCRYPTED_PRIVATE_KEY_INFO{
-    CRYPT_ALGORITHM_IDENTIFIER  EncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedPrivateKey;
-} CRYPT_ENCRYPTED_PRIVATE_KEY_INFO, *PCRYPT_ENCRYPTED_PRIVATE_KEY_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PCRYPT_DECRYPT_PRIVATE_KEY_FUNC)(
-                                                        CRYPT_ALGORITHM_IDENTIFIER  Algorithm,
-                                                        CRYPT_DATA_BLOB             EncryptedPrivateKey,
-                                                        BYTE                        *pbClearTextKey,
-                                                        DWORD                       *pcbClearTextKey,
-                                                        LPVOID                      pVoidDecryptFunc);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC)(
-                                                        CRYPT_ALGORITHM_IDENTIFIER* pAlgorithm,
-                                                        CRYPT_DATA_BLOB*            pClearTextPrivateKey,
-                                                        BYTE                        *pbEncryptedKey,
-                                                        DWORD                       *pcbEncryptedKey,
-                                                        LPVOID                      pVoidEncryptFunc);
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PCRYPT_RESOLVE_HCRYPTPROV_FUNC)(
-                                                       CRYPT_PRIVATE_KEY_INFO      *pPrivateKeyInfo,
-                                                       HCRYPTPROV                  *phCryptProv,
-                                                       LPVOID                      pVoidResolveFunc);
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_PKCS8_IMPORT_PARAMS{
-    CRYPT_DIGEST_BLOB               PrivateKey;             
-    PCRYPT_RESOLVE_HCRYPTPROV_FUNC  pResolvehCryptProvFunc; 
-    LPVOID                          pVoidResolveFunc;       
-    PCRYPT_DECRYPT_PRIVATE_KEY_FUNC pDecryptPrivateKeyFunc;
-    LPVOID                          pVoidDecryptFunc;
-} CRYPT_PKCS8_IMPORT_PARAMS, *PCRYPT_PKCS8_IMPORT_PARAMS, CRYPT_PRIVATE_KEY_BLOB_AND_PARAMS, *PCRYPT_PRIVATE_KEY_BLOB_AND_PARAMS;
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_PKCS8_EXPORT_PARAMS{
-    HCRYPTPROV                      hCryptProv;
-    DWORD                           dwKeySpec;
-    LPSTR                           pszPrivateKeyObjId;
-
-    PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC pEncryptPrivateKeyFunc;
-    LPVOID                          pVoidEncryptFunc;
-} CRYPT_PKCS8_EXPORT_PARAMS, *PCRYPT_PKCS8_EXPORT_PARAMS;
-
-
-
-
-
-
-
-typedef struct _CERT_INFO {
-    DWORD                       dwVersion;
-    CRYPT_INTEGER_BLOB          SerialNumber;
-    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
-    CERT_NAME_BLOB              Issuer;
-    FILETIME                    NotBefore;
-    FILETIME                    NotAfter;
-    CERT_NAME_BLOB              Subject;
-    CERT_PUBLIC_KEY_INFO        SubjectPublicKeyInfo;
-    CRYPT_BIT_BLOB              IssuerUniqueId;
-    CRYPT_BIT_BLOB              SubjectUniqueId;
-    DWORD                       cExtension;
-    PCERT_EXTENSION             rgExtension;
-} CERT_INFO, *PCERT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_ENTRY {
-    CRYPT_INTEGER_BLOB  SerialNumber;
-    FILETIME            RevocationDate;
-    DWORD               cExtension;
-    PCERT_EXTENSION     rgExtension;
-} CRL_ENTRY, *PCRL_ENTRY;
-
-
-
-
-
-
-
-typedef struct _CRL_INFO {
-    DWORD                       dwVersion;
-    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
-    CERT_NAME_BLOB              Issuer;
-    FILETIME                    ThisUpdate;
-    FILETIME                    NextUpdate;
-    DWORD                       cCRLEntry;
-    PCRL_ENTRY                  rgCRLEntry;
-    DWORD                       cExtension;
-    PCERT_EXTENSION             rgExtension;
-} CRL_INFO, *PCRL_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REQUEST_INFO {
-    DWORD                   dwVersion;
-    CERT_NAME_BLOB          Subject;
-    CERT_PUBLIC_KEY_INFO    SubjectPublicKeyInfo;
-    DWORD                   cAttribute;
-    PCRYPT_ATTRIBUTE        rgAttribute;
-} CERT_REQUEST_INFO, *PCERT_REQUEST_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_KEYGEN_REQUEST_INFO {
-    DWORD                   dwVersion;
-    CERT_PUBLIC_KEY_INFO    SubjectPublicKeyInfo;
-    LPWSTR                  pwszChallengeString;        
-} CERT_KEYGEN_REQUEST_INFO, *PCERT_KEYGEN_REQUEST_INFO;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_SIGNED_CONTENT_INFO {
-    CRYPT_DER_BLOB              ToBeSigned;
-    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
-    CRYPT_BIT_BLOB              Signature;
-} CERT_SIGNED_CONTENT_INFO, *PCERT_SIGNED_CONTENT_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CTL_USAGE {
-    DWORD               cUsageIdentifier;
-    LPSTR               *rgpszUsageIdentifier;      
-} CTL_USAGE, *PCTL_USAGE,
-CERT_ENHKEY_USAGE, *PCERT_ENHKEY_USAGE;
-
-
-
-
-
-typedef struct _CTL_ENTRY {
-    CRYPT_DATA_BLOB     SubjectIdentifier;          
-    DWORD               cAttribute;
-    PCRYPT_ATTRIBUTE    rgAttribute;                
-} CTL_ENTRY, *PCTL_ENTRY;
-
-
-
-
-typedef struct _CTL_INFO {
-    DWORD                       dwVersion;
-    CTL_USAGE                   SubjectUsage;
-    CRYPT_DATA_BLOB             ListIdentifier;     
-    CRYPT_INTEGER_BLOB          SequenceNumber;     
-    FILETIME                    ThisUpdate;
-    FILETIME                    NextUpdate;         
-    CRYPT_ALGORITHM_IDENTIFIER  SubjectAlgorithm;
-    DWORD                       cCTLEntry;
-    PCTL_ENTRY                  rgCTLEntry;         
-    DWORD                       cExtension;
-    PCERT_EXTENSION             rgExtension;        
-} CTL_INFO, *PCTL_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_TIME_STAMP_REQUEST_INFO {
-    LPSTR                   pszTimeStampAlgorithm;   
-    LPSTR                   pszContentType;          
-    CRYPT_OBJID_BLOB        Content;
-    DWORD                   cAttribute;
-    PCRYPT_ATTRIBUTE        rgAttribute;
-} CRYPT_TIME_STAMP_REQUEST_INFO, *PCRYPT_TIME_STAMP_REQUEST_INFO;
-
-
-
-
-typedef struct _CRYPT_ENROLLMENT_NAME_VALUE_PAIR {
-    LPWSTR      pwszName;
-    LPWSTR      pwszValue;
-} CRYPT_ENROLLMENT_NAME_VALUE_PAIR, * PCRYPT_ENROLLMENT_NAME_VALUE_PAIR;
-
-
-
-
-typedef struct _CRYPT_CSP_PROVIDER {
-    DWORD           dwKeySpec;
-    LPWSTR          pwszProviderName;
-    CRYPT_BIT_BLOB  Signature;
-} CRYPT_CSP_PROVIDER, * PCRYPT_CSP_PROVIDER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptFormatObject(
-     DWORD dwCertEncodingType,
-     DWORD dwFormatType,
-     DWORD dwFormatStrType,
-     void  *pFormatStruct,
-     LPCSTR lpszStructType,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     void *pbFormat,
-      DWORD *pcbFormat
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LPVOID (__stdcall *PFN_CRYPT_ALLOC)(
-     size_t cbSize
-    );
-
-typedef void (__stdcall *PFN_CRYPT_FREE)(
-     LPVOID pv
-    );
-
-
-typedef struct _CRYPT_ENCODE_PARA {
-    DWORD                   cbSize;
-    PFN_CRYPT_ALLOC         pfnAlloc;           
-    PFN_CRYPT_FREE          pfnFree;            
-} CRYPT_ENCODE_PARA, *PCRYPT_ENCODE_PARA;
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEncodeObjectEx(
-     DWORD dwCertEncodingType,
-     LPCSTR lpszStructType,
-     const void *pvStructInfo,
-     DWORD dwFlags,
-      PCRYPT_ENCODE_PARA pEncodePara,
-     void *pvEncoded,
-      DWORD *pcbEncoded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEncodeObject(
-     DWORD        dwCertEncodingType,
-     LPCSTR       lpszStructType,
-     const void   *pvStructInfo,
-     BYTE        *pbEncoded,
-      DWORD    *pcbEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_DECODE_PARA {
-    DWORD                   cbSize;
-    PFN_CRYPT_ALLOC         pfnAlloc;           
-    PFN_CRYPT_FREE          pfnFree;            
-} CRYPT_DECODE_PARA, *PCRYPT_DECODE_PARA;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecodeObjectEx(
-     DWORD dwCertEncodingType,
-     LPCSTR lpszStructType,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     DWORD dwFlags,
-      PCRYPT_DECODE_PARA pDecodePara,
-      void *pvStructInfo,
-      DWORD *pcbStructInfo
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecodeObject(
-     DWORD        dwCertEncodingType,
-     LPCSTR       lpszStructType,
-     const BYTE   *pbEncoded,
-     DWORD        cbEncoded,
-     DWORD        dwFlags,
-     void        *pvStructInfo,
-      DWORD    *pcbStructInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_EXTENSIONS {
-    DWORD           cExtension;
-    PCERT_EXTENSION rgExtension;
-} CERT_EXTENSIONS, *PCERT_EXTENSIONS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_AUTHORITY_KEY_ID_INFO {
-    CRYPT_DATA_BLOB     KeyId;
-    CERT_NAME_BLOB      CertIssuer;
-    CRYPT_INTEGER_BLOB  CertSerialNumber;
-} CERT_AUTHORITY_KEY_ID_INFO, *PCERT_AUTHORITY_KEY_ID_INFO;
-
-
-
-
-
-
-
-typedef struct _CERT_PRIVATE_KEY_VALIDITY {
-    FILETIME            NotBefore;
-    FILETIME            NotAfter;
-} CERT_PRIVATE_KEY_VALIDITY, *PCERT_PRIVATE_KEY_VALIDITY;
-
-typedef struct _CERT_KEY_ATTRIBUTES_INFO {
-    CRYPT_DATA_BLOB             KeyId;
-    CRYPT_BIT_BLOB              IntendedKeyUsage;
-    PCERT_PRIVATE_KEY_VALIDITY  pPrivateKeyUsagePeriod;     
-} CERT_KEY_ATTRIBUTES_INFO, *PCERT_KEY_ATTRIBUTES_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_ID {
-    DWORD                   cCertPolicyElementId;
-    LPSTR                   *rgpszCertPolicyElementId;  
-} CERT_POLICY_ID, *PCERT_POLICY_ID;
-
-typedef struct _CERT_KEY_USAGE_RESTRICTION_INFO {
-    DWORD                   cCertPolicyId;
-    PCERT_POLICY_ID         rgCertPolicyId;
-    CRYPT_BIT_BLOB          RestrictedKeyUsage;
-} CERT_KEY_USAGE_RESTRICTION_INFO, *PCERT_KEY_USAGE_RESTRICTION_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_OTHER_NAME {
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Value;
-} CERT_OTHER_NAME, *PCERT_OTHER_NAME;
-
-typedef struct _CERT_ALT_NAME_ENTRY {
-    DWORD   dwAltNameChoice;
-    union {
-        PCERT_OTHER_NAME            pOtherName;         
-        LPWSTR                      pwszRfc822Name;     
-        LPWSTR                      pwszDNSName;        
-        
-        CERT_NAME_BLOB              DirectoryName;      
-        
-        LPWSTR                      pwszURL;            
-        CRYPT_DATA_BLOB             IPAddress;          
-        LPSTR                       pszRegisteredID;    
-    };
-} CERT_ALT_NAME_ENTRY, *PCERT_ALT_NAME_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_ALT_NAME_INFO {
-    DWORD                   cAltEntry;
-    PCERT_ALT_NAME_ENTRY    rgAltEntry;
-} CERT_ALT_NAME_INFO, *PCERT_ALT_NAME_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_BASIC_CONSTRAINTS_INFO {
-    CRYPT_BIT_BLOB          SubjectType;
-    BOOL                    fPathLenConstraint;
-    DWORD                   dwPathLenConstraint;
-    DWORD                   cSubtreesConstraint;
-    CERT_NAME_BLOB          *rgSubtreesConstraint;
-} CERT_BASIC_CONSTRAINTS_INFO, *PCERT_BASIC_CONSTRAINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_BASIC_CONSTRAINTS2_INFO {
-    BOOL                    fCA;
-    BOOL                    fPathLenConstraint;
-    DWORD                   dwPathLenConstraint;
-} CERT_BASIC_CONSTRAINTS2_INFO, *PCERT_BASIC_CONSTRAINTS2_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_QUALIFIER_INFO {
-    LPSTR                       pszPolicyQualifierId;   
-    CRYPT_OBJID_BLOB            Qualifier;              
-} CERT_POLICY_QUALIFIER_INFO, *PCERT_POLICY_QUALIFIER_INFO;
-
-typedef struct _CERT_POLICY_INFO {
-    LPSTR                       pszPolicyIdentifier;    
-    DWORD                       cPolicyQualifier;       
-    CERT_POLICY_QUALIFIER_INFO  *rgPolicyQualifier;
-} CERT_POLICY_INFO, *PCERT_POLICY_INFO;
-
-typedef struct _CERT_POLICIES_INFO {
-    DWORD                       cPolicyInfo;
-    CERT_POLICY_INFO            *rgPolicyInfo;
-} CERT_POLICIES_INFO, *PCERT_POLICIES_INFO;
-
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_QUALIFIER_NOTICE_REFERENCE {
-    LPSTR   pszOrganization;
-    DWORD   cNoticeNumbers;
-    int     *rgNoticeNumbers;
-} CERT_POLICY_QUALIFIER_NOTICE_REFERENCE, *PCERT_POLICY_QUALIFIER_NOTICE_REFERENCE;
-
-typedef struct _CERT_POLICY_QUALIFIER_USER_NOTICE {
-    CERT_POLICY_QUALIFIER_NOTICE_REFERENCE  *pNoticeReference;  
-    LPWSTR                                  pszDisplayText;     
-} CERT_POLICY_QUALIFIER_USER_NOTICE, *PCERT_POLICY_QUALIFIER_USER_NOTICE;
-
-
-
-
-
-
-
-typedef struct _CPS_URLS {
-    LPWSTR                      pszURL;
-    CRYPT_ALGORITHM_IDENTIFIER  *pAlgorithm; 
-    CRYPT_DATA_BLOB             *pDigest;    
-} CPS_URLS, *PCPS_URLS;
-
-typedef struct _CERT_POLICY95_QUALIFIER1 {
-    LPWSTR      pszPracticesReference;      
-    LPSTR       pszNoticeIdentifier;        
-    LPSTR       pszNSINoticeIdentifier;     
-    DWORD       cCPSURLs;
-    CPS_URLS    *rgCPSURLs;                 
-} CERT_POLICY95_QUALIFIER1, *PCERT_POLICY95_QUALIFIER1;
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_MAPPING {
-    LPSTR                       pszIssuerDomainPolicy;      
-    LPSTR                       pszSubjectDomainPolicy;     
-} CERT_POLICY_MAPPING, *PCERT_POLICY_MAPPING;
-
-typedef struct _CERT_POLICY_MAPPINGS_INFO {
-    DWORD                       cPolicyMapping;
-    PCERT_POLICY_MAPPING        rgPolicyMapping;
-} CERT_POLICY_MAPPINGS_INFO, *PCERT_POLICY_MAPPINGS_INFO;
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_CONSTRAINTS_INFO {
-    BOOL                        fRequireExplicitPolicy;
-    DWORD                       dwRequireExplicitPolicySkipCerts;
-
-    BOOL                        fInhibitPolicyMapping;
-    DWORD                       dwInhibitPolicyMappingSkipCerts;
-} CERT_POLICY_CONSTRAINTS_INFO, *PCERT_POLICY_CONSTRAINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY {
-    LPSTR               pszObjId;
-    DWORD               cValue;
-    PCRYPT_DER_BLOB     rgValue;
-} CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY, *PCRYPT_CONTENT_INFO_SEQUENCE_OF_ANY;
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_CONTENT_INFO {
-    LPSTR               pszObjId;
-    CRYPT_DER_BLOB      Content;
-} CRYPT_CONTENT_INFO, *PCRYPT_CONTENT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_SEQUENCE_OF_ANY {
-    DWORD               cValue;
-    PCRYPT_DER_BLOB     rgValue;
-} CRYPT_SEQUENCE_OF_ANY, *PCRYPT_SEQUENCE_OF_ANY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_AUTHORITY_KEY_ID2_INFO {
-    CRYPT_DATA_BLOB     KeyId;
-    CERT_ALT_NAME_INFO  AuthorityCertIssuer;    
-                                                
-    CRYPT_INTEGER_BLOB  AuthorityCertSerialNumber;
-} CERT_AUTHORITY_KEY_ID2_INFO, *PCERT_AUTHORITY_KEY_ID2_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_ACCESS_DESCRIPTION {
-    LPSTR               pszAccessMethod;        
-    CERT_ALT_NAME_ENTRY AccessLocation;
-} CERT_ACCESS_DESCRIPTION, *PCERT_ACCESS_DESCRIPTION;
-
-
-typedef struct _CERT_AUTHORITY_INFO_ACCESS {
-    DWORD                       cAccDescr;
-    PCERT_ACCESS_DESCRIPTION    rgAccDescr;
-} CERT_AUTHORITY_INFO_ACCESS, *PCERT_AUTHORITY_INFO_ACCESS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_DIST_POINT_NAME {
-    DWORD   dwDistPointNameChoice;
-    union {
-        CERT_ALT_NAME_INFO      FullName;       
-        
-    };
-} CRL_DIST_POINT_NAME, *PCRL_DIST_POINT_NAME;
-
-
-
-
-
-typedef struct _CRL_DIST_POINT {
-    CRL_DIST_POINT_NAME     DistPointName;      
-    CRYPT_BIT_BLOB          ReasonFlags;        
-    CERT_ALT_NAME_INFO      CRLIssuer;          
-} CRL_DIST_POINT, *PCRL_DIST_POINT;
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_DIST_POINTS_INFO {
-    DWORD                   cDistPoint;
-    PCRL_DIST_POINT         rgDistPoint;
-} CRL_DIST_POINTS_INFO, *PCRL_DIST_POINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CROSS_CERT_DIST_POINTS_INFO {
-    
-    DWORD                   dwSyncDeltaTime;
-
-    DWORD                   cDistPoint;
-    PCERT_ALT_NAME_INFO     rgDistPoint;
-} CROSS_CERT_DIST_POINTS_INFO, *PCROSS_CERT_DIST_POINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_PAIR {
-   CERT_BLOB    Forward;        
-   CERT_BLOB    Reverse;        
-} CERT_PAIR, *PCERT_PAIR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_ISSUING_DIST_POINT {
-    CRL_DIST_POINT_NAME     DistPointName;              
-    BOOL                    fOnlyContainsUserCerts;
-    BOOL                    fOnlyContainsCACerts;
-    CRYPT_BIT_BLOB          OnlySomeReasonFlags;        
-    BOOL                    fIndirectCRL;
-} CRL_ISSUING_DIST_POINT, *PCRL_ISSUING_DIST_POINT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_GENERAL_SUBTREE {
-    CERT_ALT_NAME_ENTRY     Base;
-    DWORD                   dwMinimum;
-    BOOL                    fMaximum;
-    DWORD                   dwMaximum;
-} CERT_GENERAL_SUBTREE, *PCERT_GENERAL_SUBTREE;
-
-typedef struct _CERT_NAME_CONSTRAINTS_INFO {
-    DWORD                   cPermittedSubtree;
-    PCERT_GENERAL_SUBTREE   rgPermittedSubtree;
-    DWORD                   cExcludedSubtree;
-    PCERT_GENERAL_SUBTREE   rgExcludedSubtree;
-} CERT_NAME_CONSTRAINTS_INFO, *PCERT_NAME_CONSTRAINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_DSS_PARAMETERS {
-    CRYPT_UINT_BLOB     p;
-    CRYPT_UINT_BLOB     q;
-    CRYPT_UINT_BLOB     g;
-} CERT_DSS_PARAMETERS, *PCERT_DSS_PARAMETERS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_DH_PARAMETERS {
-    CRYPT_UINT_BLOB     p;
-    CRYPT_UINT_BLOB     g;
-} CERT_DH_PARAMETERS, *PCERT_DH_PARAMETERS;
-
-
-
-
-
-
-
-
-typedef struct _CERT_X942_DH_VALIDATION_PARAMS {
-    CRYPT_BIT_BLOB      seed;
-    DWORD               pgenCounter;
-} CERT_X942_DH_VALIDATION_PARAMS, *PCERT_X942_DH_VALIDATION_PARAMS;
-
-typedef struct _CERT_X942_DH_PARAMETERS {
-    CRYPT_UINT_BLOB     p;          
-    CRYPT_UINT_BLOB     g;          
-    CRYPT_UINT_BLOB     q;          
-    CRYPT_UINT_BLOB     j;          
-    PCERT_X942_DH_VALIDATION_PARAMS pValidationParams;  
-} CERT_X942_DH_PARAMETERS, *PCERT_X942_DH_PARAMETERS;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_X942_OTHER_INFO {
-    LPSTR               pszContentEncryptionObjId;
-    BYTE                rgbCounter[4];
-    BYTE                rgbKeyLength[4];
-    CRYPT_DATA_BLOB     PubInfo;    
-} CRYPT_X942_OTHER_INFO, *PCRYPT_X942_OTHER_INFO;
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_RC2_CBC_PARAMETERS {
-    DWORD               dwVersion;
-    BOOL                fIV;            
-    BYTE                rgbIV[8];
-} CRYPT_RC2_CBC_PARAMETERS, *PCRYPT_RC2_CBC_PARAMETERS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_SMIME_CAPABILITY {
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Parameters;
-} CRYPT_SMIME_CAPABILITY, *PCRYPT_SMIME_CAPABILITY;
-
-typedef struct _CRYPT_SMIME_CAPABILITIES {
-    DWORD                   cCapability;
-    PCRYPT_SMIME_CAPABILITY rgCapability;
-} CRYPT_SMIME_CAPABILITIES, *PCRYPT_SMIME_CAPABILITIES;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMC_TAGGED_ATTRIBUTE {
-    DWORD               dwBodyPartID;
-    CRYPT_ATTRIBUTE     Attribute;
-} CMC_TAGGED_ATTRIBUTE, *PCMC_TAGGED_ATTRIBUTE;
-
-typedef struct _CMC_TAGGED_CERT_REQUEST {
-    DWORD               dwBodyPartID;
-    CRYPT_DER_BLOB      SignedCertRequest;
-} CMC_TAGGED_CERT_REQUEST, *PCMC_TAGGED_CERT_REQUEST;
-
-typedef struct _CMC_TAGGED_REQUEST {
-    DWORD               dwTaggedRequestChoice;
-    union {
-        
-        PCMC_TAGGED_CERT_REQUEST   pTaggedCertRequest;
-    };
-} CMC_TAGGED_REQUEST, *PCMC_TAGGED_REQUEST;
-
-
-
-typedef struct _CMC_TAGGED_CONTENT_INFO {
-    DWORD               dwBodyPartID;
-    CRYPT_DER_BLOB      EncodedContentInfo;
-} CMC_TAGGED_CONTENT_INFO, *PCMC_TAGGED_CONTENT_INFO;
-
-typedef struct _CMC_TAGGED_OTHER_MSG {
-    DWORD               dwBodyPartID;
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Value;
-} CMC_TAGGED_OTHER_MSG, *PCMC_TAGGED_OTHER_MSG;
-
-
-
-typedef struct _CMC_DATA_INFO {
-    DWORD                       cTaggedAttribute;
-    PCMC_TAGGED_ATTRIBUTE       rgTaggedAttribute;
-    DWORD                       cTaggedRequest;
-    PCMC_TAGGED_REQUEST         rgTaggedRequest;
-    DWORD                       cTaggedContentInfo;
-    PCMC_TAGGED_CONTENT_INFO    rgTaggedContentInfo;
-    DWORD                       cTaggedOtherMsg;
-    PCMC_TAGGED_OTHER_MSG       rgTaggedOtherMsg;
-} CMC_DATA_INFO, *PCMC_DATA_INFO;
-
-
-
-typedef struct _CMC_RESPONSE_INFO {
-    DWORD                       cTaggedAttribute;
-    PCMC_TAGGED_ATTRIBUTE       rgTaggedAttribute;
-    DWORD                       cTaggedContentInfo;
-    PCMC_TAGGED_CONTENT_INFO    rgTaggedContentInfo;
-    DWORD                       cTaggedOtherMsg;
-    PCMC_TAGGED_OTHER_MSG       rgTaggedOtherMsg;
-} CMC_RESPONSE_INFO, *PCMC_RESPONSE_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CMC_PEND_INFO {
-    CRYPT_DATA_BLOB             PendToken;
-    FILETIME                    PendTime;
-} CMC_PEND_INFO, *PCMC_PEND_INFO;
-
-typedef struct _CMC_STATUS_INFO {
-    DWORD                       dwStatus;
-    DWORD                       cBodyList;
-    DWORD                       *rgdwBodyList;
-    LPWSTR                      pwszStatusString;   
-    DWORD                       dwOtherInfoChoice;
-    union  {
-        
-        
-        
-        DWORD                       dwFailInfo;
-        
-        PCMC_PEND_INFO              pPendInfo;
-    };
-} CMC_STATUS_INFO, *PCMC_STATUS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMC_ADD_EXTENSIONS_INFO {
-    DWORD                       dwCmcDataReference;
-    DWORD                       cCertReference;
-    DWORD                       *rgdwCertReference;
-    DWORD                       cExtension;
-    PCERT_EXTENSION             rgExtension;
-} CMC_ADD_EXTENSIONS_INFO, *PCMC_ADD_EXTENSIONS_INFO;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMC_ADD_ATTRIBUTES_INFO {
-    DWORD                       dwCmcDataReference;
-    DWORD                       cCertReference;
-    DWORD                       *rgdwCertReference;
-    DWORD                       cAttribute;
-    PCRYPT_ATTRIBUTE            rgAttribute;
-} CMC_ADD_ATTRIBUTES_INFO, *PCMC_ADD_ATTRIBUTES_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_TEMPLATE_EXT {
-    LPSTR               pszObjId;
-    DWORD               dwMajorVersion;
-    BOOL                fMinorVersion;      
-    DWORD               dwMinorVersion;
-} CERT_TEMPLATE_EXT, *PCERT_TEMPLATE_EXT;
-
-
-
-
-
-
-typedef void *HCRYPTOIDFUNCSET;
-typedef void *HCRYPTOIDFUNCADDR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_OID_FUNC_ENTRY {
-    LPCSTR  pszOID;
-    void    *pvFuncAddr;
-} CRYPT_OID_FUNC_ENTRY, *PCRYPT_OID_FUNC_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptInstallOIDFunctionAddress(
-     HMODULE hModule,         
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     DWORD cFuncEntry,
-     const CRYPT_OID_FUNC_ENTRY rgFuncEntry[],
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCRYPTOIDFUNCSET
-__stdcall
-CryptInitOIDFunctionSet(
-     LPCSTR pszFuncName,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetOIDFunctionAddress(
-     HCRYPTOIDFUNCSET hFuncSet,
-     DWORD dwEncodingType,
-     LPCSTR pszOID,
-     DWORD dwFlags,
-     void **ppvFuncAddr,
-     HCRYPTOIDFUNCADDR *phFuncAddr
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetDefaultOIDDllList(
-     HCRYPTOIDFUNCSET hFuncSet,
-     DWORD dwEncodingType,
-     LPWSTR pwszDllList,
-      DWORD *pcchDllList
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetDefaultOIDFunctionAddress(
-     HCRYPTOIDFUNCSET hFuncSet,
-     DWORD dwEncodingType,
-      LPCWSTR pwszDll,
-     DWORD dwFlags,
-     void **ppvFuncAddr,
-      HCRYPTOIDFUNCADDR *phFuncAddr
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptFreeOIDFunctionAddress(
-     HCRYPTOIDFUNCADDR hFuncAddr,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRegisterOIDFunction(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID,
-      LPCWSTR pwszDll,
-      LPCSTR pszOverrideFuncName
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnregisterOIDFunction(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRegisterDefaultOIDFunction(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     DWORD dwIndex,
-     LPCWSTR pwszDll
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnregisterDefaultOIDFunction(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCWSTR pwszDll
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetOIDFunctionValue(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID,
-     LPCWSTR pwszValueName,
-     DWORD dwValueType,
-     const BYTE *pbValueData,
-     DWORD cbValueData
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetOIDFunctionValue(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID,
-     LPCWSTR pwszValueName,
-     DWORD *pdwValueType,
-     BYTE *pbValueData,
-      DWORD *pcbValueData
-    );
-
-typedef BOOL (__stdcall *PFN_CRYPT_ENUM_OID_FUNC)(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID,
-     DWORD cValue,
-     const DWORD rgdwValueType[],
-     LPCWSTR const rgpwszValueName[],
-     const BYTE * const rgpbValueData[],
-     const DWORD rgcbValueData[],
-     void *pvArg
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumOIDFunction(
-     DWORD dwEncodingType,
-      LPCSTR pszFuncName,
-      LPCSTR pszOID,
-     DWORD dwFlags,
-     void *pvArg,
-     PFN_CRYPT_ENUM_OID_FUNC pfnEnumOIDFunc
-    );
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_OID_INFO {
-    DWORD           cbSize;
-    LPCSTR          pszOID;
-    LPCWSTR         pwszName;
-    DWORD           dwGroupId;
-    union {
-        DWORD       dwValue;
-        ALG_ID      Algid;
-        DWORD       dwLength;
-    };
-    CRYPT_DATA_BLOB ExtraInfo;
-} CRYPT_OID_INFO, *PCRYPT_OID_INFO;
-typedef const CRYPT_OID_INFO CCRYPT_OID_INFO, *PCCRYPT_OID_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRYPT_OID_INFO
-__stdcall
-CryptFindOIDInfo(
-     DWORD dwKeyType,
-     void *pvKey,
-     DWORD dwGroupId
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRegisterOIDInfo(
-     PCCRYPT_OID_INFO pInfo,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnregisterOIDInfo(
-     PCCRYPT_OID_INFO pInfo
-    );
-
-
-typedef BOOL (__stdcall *PFN_CRYPT_ENUM_OID_INFO)(
-     PCCRYPT_OID_INFO pInfo,
-     void *pvArg
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumOIDInfo(
-     DWORD dwGroupId,
-     DWORD dwFlags,
-     void *pvArg,
-     PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LPCWSTR
-__stdcall
-CryptFindLocalizedName(
-     LPCWSTR pwszCryptName
-    );
-
-
-
-
-
-
-
-
-typedef void *HCRYPTMSG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_ISSUER_SERIAL_NUMBER {
-    CERT_NAME_BLOB      Issuer;
-    CRYPT_INTEGER_BLOB  SerialNumber;
-} CERT_ISSUER_SERIAL_NUMBER, *PCERT_ISSUER_SERIAL_NUMBER;
-
-
-
-
-typedef struct _CERT_ID {
-    DWORD   dwIdChoice;
-    union {
-        
-        CERT_ISSUER_SERIAL_NUMBER   IssuerSerialNumber;
-        
-        CRYPT_HASH_BLOB             KeyId;
-        
-        CRYPT_HASH_BLOB             HashId;
-    };
-} CERT_ID, *PCERT_ID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_SIGNER_ENCODE_INFO {
-    DWORD                       cbSize;
-    PCERT_INFO                  pCertInfo;
-    HCRYPTPROV                  hCryptProv;
-    DWORD                       dwKeySpec;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-    DWORD                       cAuthAttr;
-    PCRYPT_ATTRIBUTE            rgAuthAttr;
-    DWORD                       cUnauthAttr;
-    PCRYPT_ATTRIBUTE            rgUnauthAttr;
-
-
-
-
-
-
-} CMSG_SIGNER_ENCODE_INFO, *PCMSG_SIGNER_ENCODE_INFO;
-
-typedef struct _CMSG_SIGNED_ENCODE_INFO {
-    DWORD                       cbSize;
-    DWORD                       cSigners;
-    PCMSG_SIGNER_ENCODE_INFO    rgSigners;
-    DWORD                       cCertEncoded;
-    PCERT_BLOB                  rgCertEncoded;
-    DWORD                       cCrlEncoded;
-    PCRL_BLOB                   rgCrlEncoded;
-
-
-
-
-
-} CMSG_SIGNED_ENCODE_INFO, *PCMSG_SIGNED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_RECIPIENT_ENCODE_INFO CMSG_RECIPIENT_ENCODE_INFO,
-    *PCMSG_RECIPIENT_ENCODE_INFO;
-
-typedef struct _CMSG_ENVELOPED_ENCODE_INFO {
-    DWORD                       cbSize;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
-    void                        *pvEncryptionAuxInfo;
-    DWORD                       cRecipients;
-
-    
-    
-    
-    PCERT_INFO                  *rgpRecipients;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} CMSG_ENVELOPED_ENCODE_INFO, *PCMSG_ENVELOPED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    void                        *pvKeyEncryptionAuxInfo;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_BIT_BLOB              RecipientPublicKey;
-    CERT_ID                     RecipientId;
-} CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_BIT_BLOB              RecipientPublicKey;
-    CERT_ID                     RecipientId;
-
-    
-    
-    FILETIME                    Date;
-    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
-} CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO,
-    *PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO;
-
-typedef struct _CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    void                        *pvKeyEncryptionAuxInfo;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyWrapAlgorithm;
-    void                        *pvKeyWrapAuxInfo;
-
-    
-    
-    
-    
-    
-    HCRYPTPROV                  hCryptProv;
-    DWORD                       dwKeySpec;
-
-    DWORD                       dwKeyChoice;
-    union {
-        
-        
-        
-        PCRYPT_ALGORITHM_IDENTIFIER pEphemeralAlgorithm;
-
-        
-        
-        
-        PCERT_ID                    pSenderId;
-    };
-    CRYPT_DATA_BLOB             UserKeyingMaterial;     
-
-    DWORD                                       cRecipientEncryptedKeys;
-    PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO   *rgpRecipientEncryptedKeys;
-} CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    void                        *pvKeyEncryptionAuxInfo;
-    HCRYPTPROV                  hCryptProv;
-    DWORD                       dwKeyChoice;
-    union {
-        
-        HCRYPTKEY                   hKeyEncryptionKey;
-        
-        void                        *pvKeyEncryptionKey;
-    };
-    CRYPT_DATA_BLOB             KeyId;
-
-    
-    FILETIME                    Date;
-    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
-} CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO, *PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO;
-
-
-
-
-
-
-
-
-struct _CMSG_RECIPIENT_ENCODE_INFO {
-    DWORD   dwRecipientChoice;
-    union {
-        
-        PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO   pKeyTrans;
-        
-        PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO   pKeyAgree;
-        
-        PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO   pMailList;
-    };
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_RC2_AUX_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwBitLen;
-} CMSG_RC2_AUX_INFO, *PCMSG_RC2_AUX_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_SP3_COMPATIBLE_AUX_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwFlags;
-} CMSG_SP3_COMPATIBLE_AUX_INFO, *PCMSG_SP3_COMPATIBLE_AUX_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_RC4_AUX_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwBitLen;
-} CMSG_RC4_AUX_INFO, *PCMSG_RC4_AUX_INFO;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO {
-    DWORD                       cbSize;
-    CMSG_SIGNED_ENCODE_INFO     SignedInfo;
-    CMSG_ENVELOPED_ENCODE_INFO  EnvelopedInfo;
-} CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO, *PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_HASHED_ENCODE_INFO {
-    DWORD                       cbSize;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-} CMSG_HASHED_ENCODE_INFO, *PCMSG_HASHED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_ENCRYPTED_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
-    void                        *pvEncryptionAuxInfo;
-} CMSG_ENCRYPTED_ENCODE_INFO, *PCMSG_ENCRYPTED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_STREAM_OUTPUT)(
-     const void *pvArg,
-     BYTE *pbData,
-     DWORD cbData,
-     BOOL fFinal
-    );
-
-
-
-typedef struct _CMSG_STREAM_INFO {
-    DWORD                   cbContent;
-    PFN_CMSG_STREAM_OUTPUT  pfnStreamOutput;
-    void                    *pvArg;
-} CMSG_STREAM_INFO, *PCMSG_STREAM_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCRYPTMSG
-__stdcall
-CryptMsgOpenToEncode(
-     DWORD dwMsgEncodingType,
-     DWORD dwFlags,
-     DWORD dwMsgType,
-     void const *pvMsgEncodeInfo,
-      LPSTR pszInnerContentObjID,
-      PCMSG_STREAM_INFO pStreamInfo
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CryptMsgCalculateEncodedLength(
-     DWORD dwMsgEncodingType,
-     DWORD dwFlags,
-     DWORD dwMsgType,
-     void const *pvMsgEncodeInfo,
-      LPSTR pszInnerContentObjID,
-     DWORD cbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCRYPTMSG
-__stdcall
-CryptMsgOpenToDecode(
-     DWORD dwMsgEncodingType,
-     DWORD dwFlags,
-     DWORD dwMsgType,
-     HCRYPTPROV hCryptProv,
-      PCERT_INFO pRecipientInfo,
-      PCMSG_STREAM_INFO pStreamInfo
-    );
-
-
-
-
-__declspec(dllimport)
-HCRYPTMSG
-__stdcall
-CryptMsgDuplicate(
-     HCRYPTMSG hCryptMsg
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgClose(
-     HCRYPTMSG hCryptMsg
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgUpdate(
-     HCRYPTMSG hCryptMsg,
-     const BYTE *pbData,
-     DWORD cbData,
-     BOOL fFinal
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgGetParam(
-     HCRYPTMSG hCryptMsg,
-     DWORD dwParamType,
-     DWORD dwIndex,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_SIGNER_INFO {
-    DWORD                       dwVersion;
-    CERT_NAME_BLOB              Issuer;
-    CRYPT_INTEGER_BLOB          SerialNumber;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedHash;
-    CRYPT_ATTRIBUTES            AuthAttrs;
-    CRYPT_ATTRIBUTES            UnauthAttrs;
-} CMSG_SIGNER_INFO, *PCMSG_SIGNER_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CMS_SIGNER_INFO {
-    DWORD                       dwVersion;
-    CERT_ID                     SignerId;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedHash;
-    CRYPT_ATTRIBUTES            AuthAttrs;
-    CRYPT_ATTRIBUTES            UnauthAttrs;
-} CMSG_CMS_SIGNER_INFO, *PCMSG_CMS_SIGNER_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef CRYPT_ATTRIBUTES CMSG_ATTR;
-typedef CRYPT_ATTRIBUTES *PCMSG_ATTR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_TRANS_RECIPIENT_INFO {
-    DWORD                       dwVersion;
-
-    
-    CERT_ID                     RecipientId;
-
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedKey;
-} CMSG_KEY_TRANS_RECIPIENT_INFO, *PCMSG_KEY_TRANS_RECIPIENT_INFO;
-
-typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_INFO {
-    
-    CERT_ID                     RecipientId;
-
-    CRYPT_DATA_BLOB             EncryptedKey;
-
-    
-    FILETIME                    Date;
-    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
-} CMSG_RECIPIENT_ENCRYPTED_KEY_INFO, *PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO;
-
-typedef struct _CMSG_KEY_AGREE_RECIPIENT_INFO {
-    DWORD                       dwVersion;
-    DWORD                       dwOriginatorChoice;
-    union {
-        
-        CERT_ID                     OriginatorCertId;
-        
-        CERT_PUBLIC_KEY_INFO        OriginatorPublicKeyInfo;
-    };
-    CRYPT_DATA_BLOB             UserKeyingMaterial;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-
-    DWORD                                cRecipientEncryptedKeys;
-    PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO   *rgpRecipientEncryptedKeys;
-} CMSG_KEY_AGREE_RECIPIENT_INFO, *PCMSG_KEY_AGREE_RECIPIENT_INFO;
-
-
-
-
-
-typedef struct _CMSG_MAIL_LIST_RECIPIENT_INFO {
-    DWORD                       dwVersion;
-    CRYPT_DATA_BLOB             KeyId;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedKey;
-
-    
-    FILETIME                    Date;
-    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
-} CMSG_MAIL_LIST_RECIPIENT_INFO, *PCMSG_MAIL_LIST_RECIPIENT_INFO;
-
-typedef struct _CMSG_CMS_RECIPIENT_INFO {
-    DWORD   dwRecipientChoice;
-    union {
-        
-        PCMSG_KEY_TRANS_RECIPIENT_INFO   pKeyTrans;
-        
-        PCMSG_KEY_AGREE_RECIPIENT_INFO   pKeyAgree;
-        
-        PCMSG_MAIL_LIST_RECIPIENT_INFO   pMailList;
-    };
-} CMSG_CMS_RECIPIENT_INFO, *PCMSG_CMS_RECIPIENT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgControl(
-     HCRYPTMSG hCryptMsg,
-     DWORD dwFlags,
-     DWORD dwCtrlType,
-     void const *pvCtrlPara
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA {
-    DWORD               cbSize;
-    HCRYPTPROV          hCryptProv;
-    DWORD               dwSignerIndex;
-    DWORD               dwSignerType;
-    void                *pvSigner;
-} CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA, *PCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA;
-
-
-
-    
-
-    
-
-    
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_DECRYPT_PARA {
-    DWORD       cbSize;
-    HCRYPTPROV  hCryptProv;
-    DWORD       dwKeySpec;
-    DWORD       dwRecipientIndex;
-} CMSG_CTRL_DECRYPT_PARA, *PCMSG_CTRL_DECRYPT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA {
-    DWORD                           cbSize;
-    HCRYPTPROV                      hCryptProv;
-    DWORD                           dwKeySpec;
-    PCMSG_KEY_TRANS_RECIPIENT_INFO  pKeyTrans;
-    DWORD                           dwRecipientIndex;
-} CMSG_CTRL_KEY_TRANS_DECRYPT_PARA, *PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA {
-    DWORD                           cbSize;
-    HCRYPTPROV                      hCryptProv;
-    DWORD                           dwKeySpec;
-    PCMSG_KEY_AGREE_RECIPIENT_INFO  pKeyAgree;
-    DWORD                           dwRecipientIndex;
-    DWORD                           dwRecipientEncryptedKeyIndex;
-    CRYPT_BIT_BLOB                  OriginatorPublicKey;
-} CMSG_CTRL_KEY_AGREE_DECRYPT_PARA, *PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA {
-    DWORD                           cbSize;
-    HCRYPTPROV                      hCryptProv;
-    PCMSG_MAIL_LIST_RECIPIENT_INFO  pMailList;
-    DWORD                           dwRecipientIndex;
-    DWORD                           dwKeyChoice;
-    union {
-        
-        HCRYPTKEY                       hKeyEncryptionKey;
-        
-        void                            *pvKeyEncryptionKey;
-    };
-} CMSG_CTRL_MAIL_LIST_DECRYPT_PARA, *PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA {
-    DWORD               cbSize;
-    DWORD               dwSignerIndex;
-    CRYPT_DATA_BLOB     blob;
-} CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA, *PCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA {
-    DWORD               cbSize;
-    DWORD               dwSignerIndex;
-    DWORD               dwUnauthAttrIndex;
-} CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA, *PCMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CryptMsgVerifyCountersignatureEncoded(
-     HCRYPTPROV   hCryptProv,
-     DWORD        dwEncodingType,
-     PBYTE        pbSignerInfo,
-     DWORD        cbSignerInfo,
-     PBYTE        pbSignerInfoCountersignature,
-     DWORD        cbSignerInfoCountersignature,
-     PCERT_INFO   pciCountersigner
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CryptMsgVerifyCountersignatureEncodedEx(
-     HCRYPTPROV   hCryptProv,
-     DWORD        dwEncodingType,
-     PBYTE        pbSignerInfo,
-     DWORD        cbSignerInfo,
-     PBYTE        pbSignerInfoCountersignature,
-     DWORD        cbSignerInfoCountersignature,
-     DWORD        dwSignerType,
-     void         *pvSigner,
-     DWORD        dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CryptMsgCountersign(
-      HCRYPTMSG            hCryptMsg,
-     DWORD                    dwIndex,
-     DWORD                    cCountersigners,
-     PCMSG_SIGNER_ENCODE_INFO rgCountersigners
-    );
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CryptMsgCountersignEncoded(
-     DWORD                    dwEncodingType,
-     PBYTE                    pbSignerInfo,
-     DWORD                    cbSignerInfo,
-     DWORD                    cCountersigners,
-     PCMSG_SIGNER_ENCODE_INFO rgCountersigners,
-     PBYTE                   pbCountersignature,
-      PDWORD               pcbCountersignature
-    );
-
-
-
-
-
-
-
-
-typedef void * (__stdcall *PFN_CMSG_ALLOC) (
-     size_t cb
-    );
-
-typedef void (__stdcall *PFN_CMSG_FREE)(
-     void *pv
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_GEN_ENCRYPT_KEY) (
-      HCRYPTPROV               *phCryptProv,
-     PCRYPT_ALGORITHM_IDENTIFIER  paiEncrypt,
-     PVOID                        pvEncryptAuxInfo,
-     PCERT_PUBLIC_KEY_INFO        pPublicKeyInfo,
-     PFN_CMSG_ALLOC               pfnAlloc,
-     HCRYPTKEY                   *phEncryptKey,
-     PBYTE                       *ppbEncryptParameters,
-     PDWORD                      pcbEncryptParameters
-    );
-
-
-typedef BOOL (__stdcall *PFN_CMSG_EXPORT_ENCRYPT_KEY) (
-     HCRYPTPROV                   hCryptProv,
-     HCRYPTKEY                    hEncryptKey,
-     PCERT_PUBLIC_KEY_INFO        pPublicKeyInfo,
-     PBYTE                       pbData,
-      PDWORD                   pcbData
-    );
-
-
-typedef BOOL (__stdcall *PFN_CMSG_IMPORT_ENCRYPT_KEY) (
-     HCRYPTPROV                   hCryptProv,
-     DWORD                        dwKeySpec,
-     PCRYPT_ALGORITHM_IDENTIFIER  paiEncrypt,
-     PCRYPT_ALGORITHM_IDENTIFIER  paiPubKey,
-     PBYTE                        pbEncodedKey,
-     DWORD                        cbEncodedKey,
-     HCRYPTKEY                   *phEncryptKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CONTENT_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
-    void                        *pvEncryptionAuxInfo;
-    DWORD                       cRecipients;
-    PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients;
-    PFN_CMSG_ALLOC              pfnAlloc;
-    PFN_CMSG_FREE               pfnFree;
-    DWORD                       dwEncryptFlags;
-    HCRYPTKEY                   hContentEncryptKey;
-    DWORD                       dwFlags;
-} CMSG_CONTENT_ENCRYPT_INFO, *PCMSG_CONTENT_ENCRYPT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY) (
-      PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_TRANS_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwRecipientIndex;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedKey;
-    DWORD                       dwFlags;
-} CMSG_KEY_TRANS_ENCRYPT_INFO, *PCMSG_KEY_TRANS_ENCRYPT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_EXPORT_KEY_TRANS) (
-     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
-     PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo,
-      PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    CRYPT_DATA_BLOB             EncryptedKey;
-} CMSG_KEY_AGREE_KEY_ENCRYPT_INFO, *PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO;
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_AGREE_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwRecipientIndex;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             UserKeyingMaterial;
-    DWORD                       dwOriginatorChoice;
-    union {
-        
-        CERT_ID                     OriginatorCertId;
-        
-        CERT_PUBLIC_KEY_INFO        OriginatorPublicKeyInfo;
-    };
-    DWORD                       cKeyAgreeKeyEncryptInfo;
-    PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO *rgpKeyAgreeKeyEncryptInfo;
-    DWORD                       dwFlags;
-} CMSG_KEY_AGREE_ENCRYPT_INFO, *PCMSG_KEY_AGREE_ENCRYPT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_EXPORT_KEY_AGREE) (
-     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
-     PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO pKeyAgreeEncodeInfo,
-      PCMSG_KEY_AGREE_ENCRYPT_INFO pKeyAgreeEncryptInfo,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-typedef struct _CMSG_MAIL_LIST_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwRecipientIndex;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedKey;
-    DWORD                       dwFlags;
-} CMSG_MAIL_LIST_ENCRYPT_INFO, *PCMSG_MAIL_LIST_ENCRYPT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_EXPORT_MAIL_LIST) (
-     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
-     PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO pMailListEncodeInfo,
-      PCMSG_MAIL_LIST_ENCRYPT_INFO pMailListEncryptInfo,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_IMPORT_KEY_TRANS) (
-     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
-     PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara,
-     DWORD dwFlags,
-      void *pvReserved,
-     HCRYPTKEY *phContentEncryptKey
-    );
-
-
-typedef BOOL (__stdcall *PFN_CMSG_IMPORT_KEY_AGREE) (
-     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
-     PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara,
-     DWORD dwFlags,
-      void *pvReserved,
-     HCRYPTKEY *phContentEncryptKey
-    );
-
-
-typedef BOOL (__stdcall *PFN_CMSG_IMPORT_MAIL_LIST) (
-     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
-     PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA pMailListDecryptPara,
-     DWORD dwFlags,
-      void *pvReserved,
-     HCRYPTKEY *phContentEncryptKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void *HCERTSTORE;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CONTEXT {
-    DWORD                   dwCertEncodingType;
-    BYTE                    *pbCertEncoded;
-    DWORD                   cbCertEncoded;
-    PCERT_INFO              pCertInfo;
-    HCERTSTORE              hCertStore;
-} CERT_CONTEXT, *PCERT_CONTEXT;
-typedef const CERT_CONTEXT *PCCERT_CONTEXT;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_CONTEXT {
-    DWORD                   dwCertEncodingType;
-    BYTE                    *pbCrlEncoded;
-    DWORD                   cbCrlEncoded;
-    PCRL_INFO               pCrlInfo;
-    HCERTSTORE              hCertStore;
-} CRL_CONTEXT, *PCRL_CONTEXT;
-typedef const CRL_CONTEXT *PCCRL_CONTEXT;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CTL_CONTEXT {
-    DWORD                   dwMsgAndCertEncodingType;
-    BYTE                    *pbCtlEncoded;
-    DWORD                   cbCtlEncoded;
-    PCTL_INFO               pCtlInfo;
-    HCERTSTORE              hCertStore;
-    HCRYPTMSG               hCryptMsg;
-    BYTE                    *pbCtlContent;
-    DWORD                   cbCtlContent;
-} CTL_CONTEXT, *PCTL_CONTEXT;
-typedef const CTL_CONTEXT *PCCTL_CONTEXT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_KEY_PROV_PARAM {
-    DWORD           dwParam;
-    BYTE            *pbData;
-    DWORD           cbData;
-    DWORD           dwFlags;
-} CRYPT_KEY_PROV_PARAM, *PCRYPT_KEY_PROV_PARAM;
-
-typedef struct _CRYPT_KEY_PROV_INFO {
-    LPWSTR                  pwszContainerName;
-    LPWSTR                  pwszProvName;
-    DWORD                   dwProvType;
-    DWORD                   dwFlags;
-    DWORD                   cProvParam;
-    PCRYPT_KEY_PROV_PARAM   rgProvParam;
-    DWORD                   dwKeySpec;
-} CRYPT_KEY_PROV_INFO, *PCRYPT_KEY_PROV_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_KEY_CONTEXT {
-    DWORD           cbSize;           
-    HCRYPTPROV      hCryptProv;
-    DWORD           dwKeySpec;
-} CERT_KEY_CONTEXT, *PCERT_KEY_CONTEXT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_SYSTEM_STORE_RELOCATE_PARA {
-    union {
-        HKEY                hKeyBase;
-        void                *pvBase;
-    };
-    union {
-        void                *pvSystemStore;
-        LPCSTR              pszSystemStore;
-        LPCWSTR             pwszSystemStore;
-    };
-} CERT_SYSTEM_STORE_RELOCATE_PARA, *PCERT_SYSTEM_STORE_RELOCATE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REGISTRY_STORE_CLIENT_GPT_PARA {
-    HKEY                hKeyBase;
-    LPWSTR              pwszRegPath;
-} CERT_REGISTRY_STORE_CLIENT_GPT_PARA, *PCERT_REGISTRY_STORE_CLIENT_GPT_PARA;
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REGISTRY_STORE_ROAMING_PARA {
-    HKEY                hKey;
-    LPWSTR              pwszStoreDirectory;
-} CERT_REGISTRY_STORE_ROAMING_PARA, *PCERT_REGISTRY_STORE_ROAMING_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_LDAP_STORE_OPENED_PARA {
-    void        *pvLdapSessionHandle;   
-                                        
-    LPCWSTR     pwszLdapUrl;
-} CERT_LDAP_STORE_OPENED_PARA, *PCERT_LDAP_STORE_OPENED_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CertOpenStore(
-     LPCSTR lpszStoreProvider,
-     DWORD dwEncodingType,
-     HCRYPTPROV hCryptProv,
-     DWORD dwFlags,
-     const void *pvPara
-    );
-
-
-
-
-
-
-
-typedef void *HCERTSTOREPROV;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_STORE_PROV_INFO {
-    DWORD               cbSize;
-    DWORD               cStoreProvFunc;
-    void                **rgpvStoreProvFunc;
-    HCERTSTOREPROV      hStoreProv;
-    DWORD               dwStoreProvFlags;
-    HCRYPTOIDFUNCADDR   hStoreProvFuncAddr2;
-} CERT_STORE_PROV_INFO, *PCERT_STORE_PROV_INFO;
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_DLL_OPEN_STORE_PROV_FUNC)(
-     LPCSTR lpszStoreProvider,
-     DWORD dwEncodingType,
-     HCRYPTPROV hCryptProv,
-     DWORD dwFlags,
-     const void *pvPara,
-     HCERTSTORE hCertStore,
-      PCERT_STORE_PROV_INFO pStoreProvInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *PFN_CERT_STORE_PROV_CLOSE)(
-     HCERTSTOREPROV hStoreProv,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pStoreCertContext,
-     DWORD dwFlags,
-     PCCERT_CONTEXT *ppProvCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwFlags
-    );
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CERT_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pStoreCrlContext,
-     DWORD dwFlags,
-     PCCRL_CONTEXT *ppProvCrlContext
-    );
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwFlags
-    );
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CRL_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pStoreCtlContext,
-     DWORD dwFlags,
-     PCCTL_CONTEXT *ppProvCtlContext
-    );
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags
-    );
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags
-                                                     );
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CTL_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_CONTROL)(
-     HCERTSTOREPROV hStoreProv,
-     DWORD dwFlags,
-     DWORD dwCtrlType,
-     void const *pvCtrlPara
-    );
-
-typedef struct _CERT_STORE_PROV_FIND_INFO {
-    DWORD               cbSize;
-    DWORD               dwMsgAndCertEncodingType;
-    DWORD               dwFindFlags;
-    DWORD               dwFindType;
-    const void          *pvFindPara;
-} CERT_STORE_PROV_FIND_INFO, *PCERT_STORE_PROV_FIND_INFO;
-typedef const CERT_STORE_PROV_FIND_INFO CCERT_STORE_PROV_FIND_INFO,
-*PCCERT_STORE_PROV_FIND_INFO;
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
-     PCCERT_CONTEXT pPrevCertContext,
-     DWORD dwFlags,
-      void **ppvStoreProvFindInfo,
-     PCCERT_CONTEXT *ppProvCertContext
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     void *pvStoreProvFindInfo,
-     DWORD dwFlags
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CERT_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
-     PCCRL_CONTEXT pPrevCrlContext,
-     DWORD dwFlags,
-      void **ppvStoreProvFindInfo,
-     PCCRL_CONTEXT *ppProvCrlContext
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     void *pvStoreProvFindInfo,
-     DWORD dwFlags
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CRL_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
-     PCCTL_CONTEXT pPrevCtlContext,
-     DWORD dwFlags,
-      void **ppvStoreProvFindInfo,
-     PCCTL_CONTEXT *ppProvCtlContext
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     void *pvStoreProvFindInfo,
-     DWORD dwFlags
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CTL_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CertDuplicateStore(
-     HCERTSTORE hCertStore
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSaveStore(
-     HCERTSTORE hCertStore,
-     DWORD dwEncodingType,
-     DWORD dwSaveAs,
-     DWORD dwSaveTo,
-      void *pvSaveToPara,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCloseStore(
-     HCERTSTORE hCertStore,
-    DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertGetSubjectCertificateFromStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     PCERT_INFO pCertId           
-    
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertEnumCertificatesInStore(
-     HCERTSTORE hCertStore,
-     PCCERT_CONTEXT pPrevCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertFindCertificateInStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     DWORD dwFindFlags,
-     DWORD dwFindType,
-     const void *pvFindPara,
-     PCCERT_CONTEXT pPrevCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertGetIssuerCertificateFromStore(
-     HCERTSTORE hCertStore,
-     PCCERT_CONTEXT pSubjectContext,
-      PCCERT_CONTEXT pPrevIssuerContext,
-      DWORD *pdwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifySubjectCertificateContext(
-     PCCERT_CONTEXT pSubject,
-      PCCERT_CONTEXT pIssuer,
-      DWORD *pdwFlags
-    );
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertDuplicateCertificateContext(
-     PCCERT_CONTEXT pCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertCreateCertificateContext(
-     DWORD dwCertEncodingType,
-     const BYTE *pbCertEncoded,
-     DWORD cbCertEncoded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFreeCertificateContext(
-     PCCERT_CONTEXT pCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetCertificateContextProperty(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetCertificateContextProperty(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertEnumCertificateContextProperties(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCreateCTLEntryFromCertificateContextProperties(
-     PCCERT_CONTEXT pCertContext,
-     DWORD cOptAttr,
-      PCRYPT_ATTRIBUTE rgOptAttr,
-     DWORD dwFlags,
-      void *pvReserved,
-      PCTL_ENTRY pCtlEntry,
-      DWORD *pcbCtlEntry
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetCertificateContextPropertiesFromCTLEntry(
-     PCCERT_CONTEXT pCertContext,
-     PCTL_ENTRY pCtlEntry,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertGetCRLFromStore(
-     HCERTSTORE hCertStore,
-      PCCERT_CONTEXT pIssuerContext,
-     PCCRL_CONTEXT pPrevCrlContext,
-      DWORD *pdwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertEnumCRLsInStore(
-     HCERTSTORE hCertStore,
-     PCCRL_CONTEXT pPrevCrlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertFindCRLInStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     DWORD dwFindFlags,
-     DWORD dwFindType,
-     const void *pvFindPara,
-     PCCRL_CONTEXT pPrevCrlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_FIND_ISSUED_FOR_PARA {
-    PCCERT_CONTEXT              pSubjectCert;
-    PCCERT_CONTEXT              pIssuerCert;
-} CRL_FIND_ISSUED_FOR_PARA, *PCRL_FIND_ISSUED_FOR_PARA;
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertDuplicateCRLContext(
-     PCCRL_CONTEXT pCrlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertCreateCRLContext(
-     DWORD dwCertEncodingType,
-     const BYTE *pbCrlEncoded,
-     DWORD cbCrlEncoded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFreeCRLContext(
-     PCCRL_CONTEXT pCrlContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetCRLContextProperty(
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetCRLContextProperty(
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertEnumCRLContextProperties(
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFindCertificateInCRL(
-     PCCERT_CONTEXT pCert,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwFlags,
-      void *pvReserved,
-     PCRL_ENTRY *ppCrlEntry
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertIsValidCRLForCertificate(
-     PCCERT_CONTEXT pCert,
-     PCCRL_CONTEXT pCrl,
-     DWORD dwFlags,
-     void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCertificateToStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     const BYTE *pbCertEncoded,
-     DWORD cbCertEncoded,
-     DWORD dwAddDisposition,
-      PCCERT_CONTEXT *ppCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCertificateContextToStore(
-     HCERTSTORE hCertStore,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwAddDisposition,
-      PCCERT_CONTEXT *ppStoreContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddSerializedElementToStore(
-     HCERTSTORE hCertStore,
-     const BYTE *pbElement,
-     DWORD cbElement,
-     DWORD dwAddDisposition,
-     DWORD dwFlags,
-     DWORD dwContextTypeFlags,
-      DWORD *pdwContextType,
-      const void **ppvContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertDeleteCertificateFromStore(
-     PCCERT_CONTEXT pCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCRLToStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     const BYTE *pbCrlEncoded,
-     DWORD cbCrlEncoded,
-     DWORD dwAddDisposition,
-      PCCRL_CONTEXT *ppCrlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCRLContextToStore(
-     HCERTSTORE hCertStore,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwAddDisposition,
-      PCCRL_CONTEXT *ppStoreContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertDeleteCRLFromStore(
-     PCCRL_CONTEXT pCrlContext
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSerializeCertificateStoreElement(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwFlags,
-     BYTE *pbElement,
-      DWORD *pcbElement
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSerializeCRLStoreElement(
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwFlags,
-     BYTE *pbElement,
-      DWORD *pcbElement
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCTL_CONTEXT
-__stdcall
-CertDuplicateCTLContext(
-     PCCTL_CONTEXT pCtlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCTL_CONTEXT
-__stdcall
-CertCreateCTLContext(
-     DWORD dwMsgAndCertEncodingType,
-     const BYTE *pbCtlEncoded,
-     DWORD cbCtlEncoded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFreeCTLContext(
-     PCCTL_CONTEXT pCtlContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetCTLContextProperty(
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetCTLContextProperty(
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertEnumCTLContextProperties(
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCTL_CONTEXT
-__stdcall
-CertEnumCTLsInStore(
-     HCERTSTORE hCertStore,
-     PCCTL_CONTEXT pPrevCtlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCTL_ENTRY
-__stdcall
-CertFindSubjectInCTL(
-     DWORD dwEncodingType,
-     DWORD dwSubjectType,
-     void *pvSubject,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-typedef struct _CTL_ANY_SUBJECT_INFO {
-    CRYPT_ALGORITHM_IDENTIFIER  SubjectAlgorithm;
-    CRYPT_DATA_BLOB             SubjectIdentifier;
-} CTL_ANY_SUBJECT_INFO, *PCTL_ANY_SUBJECT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCTL_CONTEXT
-__stdcall
-CertFindCTLInStore(
-     HCERTSTORE hCertStore,
-     DWORD dwMsgAndCertEncodingType,
-     DWORD dwFindFlags,
-     DWORD dwFindType,
-     const void *pvFindPara,
-     PCCTL_CONTEXT pPrevCtlContext
-    );
-
-
-
-
-
-
-
-
-typedef struct _CTL_FIND_USAGE_PARA {
-    DWORD               cbSize;
-    CTL_USAGE           SubjectUsage;   
-    CRYPT_DATA_BLOB     ListIdentifier; 
-    PCERT_INFO          pSigner;        
-} CTL_FIND_USAGE_PARA, *PCTL_FIND_USAGE_PARA;
-
-
-
-
-
-
-
-typedef struct _CTL_FIND_SUBJECT_PARA {
-    DWORD                   cbSize;
-    PCTL_FIND_USAGE_PARA    pUsagePara; 
-    DWORD                   dwSubjectType;
-    void                    *pvSubject;
-} CTL_FIND_SUBJECT_PARA, *PCTL_FIND_SUBJECT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCTLToStore(
-     HCERTSTORE hCertStore,
-     DWORD dwMsgAndCertEncodingType,
-     const BYTE *pbCtlEncoded,
-     DWORD cbCtlEncoded,
-     DWORD dwAddDisposition,
-      PCCTL_CONTEXT *ppCtlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCTLContextToStore(
-     HCERTSTORE hCertStore,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwAddDisposition,
-      PCCTL_CONTEXT *ppStoreContext
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSerializeCTLStoreElement(
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags,
-     BYTE *pbElement,
-      DWORD *pcbElement
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertDeleteCTLFromStore(
-     PCCTL_CONTEXT pCtlContext
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCertificateLinkToStore(
-     HCERTSTORE hCertStore,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwAddDisposition,
-      PCCERT_CONTEXT *ppStoreContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCRLLinkToStore(
-     HCERTSTORE hCertStore,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwAddDisposition,
-      PCCRL_CONTEXT *ppStoreContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCTLLinkToStore(
-     HCERTSTORE hCertStore,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwAddDisposition,
-      PCCTL_CONTEXT *ppStoreContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddStoreToCollection(
-     HCERTSTORE hCollectionStore,
-      HCERTSTORE hSiblingStore,
-     DWORD dwUpdateFlags,
-     DWORD dwPriority
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-CertRemoveStoreFromCollection(
-     HCERTSTORE hCollectionStore,
-     HCERTSTORE hSiblingStore
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertControlStore(
-     HCERTSTORE hCertStore,
-     DWORD dwFlags,
-     DWORD dwCtrlType,
-     void const *pvCtrlPara
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetStoreProperty(
-     HCERTSTORE hCertStore,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetStoreProperty(
-     HCERTSTORE hCertStore,
-     DWORD dwPropId,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-typedef struct _CERT_CREATE_CONTEXT_PARA {
-    DWORD                   cbSize;
-    PFN_CRYPT_FREE          pfnFree;            
-    void                    *pvFree;            
-} CERT_CREATE_CONTEXT_PARA, *PCERT_CREATE_CONTEXT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-const void *
-__stdcall
-CertCreateContext(
-     DWORD dwContextType,
-     DWORD dwEncodingType,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     DWORD dwFlags,
-      PCERT_CREATE_CONTEXT_PARA pCreatePara
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_SYSTEM_STORE_INFO {
-    DWORD   cbSize;
-} CERT_SYSTEM_STORE_INFO, *PCERT_SYSTEM_STORE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_PHYSICAL_STORE_INFO {
-    DWORD               cbSize;
-    LPSTR               pszOpenStoreProvider;   
-    DWORD               dwOpenEncodingType;     
-    DWORD               dwOpenFlags;            
-    CRYPT_DATA_BLOB     OpenParameters;         
-    DWORD               dwFlags;                
-    DWORD               dwPriority;             
-} CERT_PHYSICAL_STORE_INFO, *PCERT_PHYSICAL_STORE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertRegisterSystemStore(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     PCERT_SYSTEM_STORE_INFO pStoreInfo,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertRegisterPhysicalStore(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     LPCWSTR pwszStoreName,
-     PCERT_PHYSICAL_STORE_INFO pStoreInfo,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertUnregisterSystemStore(
-     const void *pvSystemStore,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertUnregisterPhysicalStore(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     LPCWSTR pwszStoreName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_ENUM_SYSTEM_STORE_LOCATION)(
-     LPCWSTR pwszStoreLocation,
-     DWORD dwFlags,
-      void *pvReserved,
-      void *pvArg
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_ENUM_SYSTEM_STORE)(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     PCERT_SYSTEM_STORE_INFO pStoreInfo,
-      void *pvReserved,
-      void *pvArg
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_ENUM_PHYSICAL_STORE)(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     LPCWSTR pwszStoreName,
-     PCERT_PHYSICAL_STORE_INFO pStoreInfo,
-      void *pvReserved,
-      void *pvArg
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertEnumSystemStoreLocation(
-     DWORD dwFlags,
-     void *pvArg,
-     PFN_CERT_ENUM_SYSTEM_STORE_LOCATION pfnEnum
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertEnumSystemStore(
-     DWORD dwFlags,
-      void *pvSystemStoreLocationPara,
-     void *pvArg,
-     PFN_CERT_ENUM_SYSTEM_STORE pfnEnum
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertEnumPhysicalStore(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     void *pvArg,
-     PFN_CERT_ENUM_PHYSICAL_STORE pfnEnum
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetEnhancedKeyUsage(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwFlags,
-     PCERT_ENHKEY_USAGE pUsage,
-      DWORD *pcbUsage
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetEnhancedKeyUsage(
-     PCCERT_CONTEXT pCertContext,
-     PCERT_ENHKEY_USAGE pUsage
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEnhancedKeyUsageIdentifier(
-     PCCERT_CONTEXT pCertContext,
-     LPCSTR pszUsageIdentifier
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertRemoveEnhancedKeyUsageIdentifier(
-     PCCERT_CONTEXT pCertContext,
-     LPCSTR pszUsageIdentifier
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetValidUsages(
-          DWORD           cCerts,
-          PCCERT_CONTEXT  *rghCerts,
-         int             *cNumOIDs,
-         LPSTR           *rghOIDs,
-       DWORD           *pcbOIDs);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgGetAndVerifySigner(
-     HCRYPTMSG hCryptMsg,
-     DWORD cSignerStore,
-      HCERTSTORE *rghSignerStore,
-     DWORD dwFlags,
-      PCCERT_CONTEXT *ppSigner,
-       DWORD *pdwSignerIndex
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgSignCTL(
-     DWORD dwMsgEncodingType,
-     BYTE *pbCtlContent,
-     DWORD cbCtlContent,
-     PCMSG_SIGNED_ENCODE_INFO pSignInfo,
-     DWORD dwFlags,
-     BYTE *pbEncoded,
-      DWORD *pcbEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgEncodeAndSignCTL(
-     DWORD dwMsgEncodingType,
-     PCTL_INFO pCtlInfo,
-     PCMSG_SIGNED_ENCODE_INFO pSignInfo,
-     DWORD dwFlags,
-     BYTE *pbEncoded,
-      DWORD *pcbEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFindSubjectInSortedCTL(
-     PCRYPT_DATA_BLOB pSubjectIdentifier,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags,
-     void *pvReserved,
-      PCRYPT_DER_BLOB pEncodedAttributes
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertEnumSubjectInSortedCTL(
-     PCCTL_CONTEXT pCtlContext,
-      void **ppvNextSubject,
-      PCRYPT_DER_BLOB pSubjectIdentifier,
-      PCRYPT_DER_BLOB pEncodedAttributes
-    );
-
-
-
-
-
-
-typedef struct _CTL_VERIFY_USAGE_PARA {
-    DWORD                   cbSize;
-    CRYPT_DATA_BLOB         ListIdentifier;     
-    DWORD                   cCtlStore;
-    HCERTSTORE              *rghCtlStore;       
-    DWORD                   cSignerStore;
-    HCERTSTORE              *rghSignerStore;    
-} CTL_VERIFY_USAGE_PARA, *PCTL_VERIFY_USAGE_PARA;
-
-typedef struct _CTL_VERIFY_USAGE_STATUS {
-    DWORD                   cbSize;
-    DWORD                   dwError;
-    DWORD                   dwFlags;
-    PCCTL_CONTEXT           *ppCtl;             
-    DWORD                   dwCtlEntryIndex;
-    PCCERT_CONTEXT          *ppSigner;          
-    DWORD                   dwSignerIndex;
-} CTL_VERIFY_USAGE_STATUS, *PCTL_VERIFY_USAGE_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyCTLUsage(
-     DWORD dwEncodingType,
-     DWORD dwSubjectType,
-     void *pvSubject,
-     PCTL_USAGE pSubjectUsage,
-     DWORD dwFlags,
-      PCTL_VERIFY_USAGE_PARA pVerifyUsagePara,
-      PCTL_VERIFY_USAGE_STATUS pVerifyUsageStatus
-    );
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REVOCATION_CRL_INFO {
-    DWORD                   cbSize;
-    PCCRL_CONTEXT           pBaseCrlContext;
-    PCCRL_CONTEXT           pDeltaCrlContext;
-
-    
-    
-    PCRL_ENTRY              pCrlEntry;
-    BOOL                    fDeltaCrlEntry; 
-} CERT_REVOCATION_CRL_INFO, *PCERT_REVOCATION_CRL_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REVOCATION_PARA {
-    DWORD                       cbSize;
-    PCCERT_CONTEXT              pIssuerCert;
-    DWORD                       cCertStore;
-    HCERTSTORE                  *rgCertStore;
-    HCERTSTORE                  hCrlStore;
-    LPFILETIME                  pftTimeToUse;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} CERT_REVOCATION_PARA, *PCERT_REVOCATION_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REVOCATION_STATUS {
-    DWORD                   cbSize;
-    DWORD                   dwIndex;
-    DWORD                   dwError;
-    DWORD                   dwReason;
-
-    
-
-    
-    
-    
-    
-    
-    
-    BOOL                    fHasFreshnessTime;
-    DWORD                   dwFreshnessTime;    
-} CERT_REVOCATION_STATUS, *PCERT_REVOCATION_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyRevocation(
-     DWORD dwEncodingType,
-     DWORD dwRevType,
-     DWORD cContext,
-     PVOID rgpvContext[],
-     DWORD dwFlags,
-      PCERT_REVOCATION_PARA pRevPara,
-      PCERT_REVOCATION_STATUS pRevStatus
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CertCompareIntegerBlob(
-     PCRYPT_INTEGER_BLOB pInt1,
-     PCRYPT_INTEGER_BLOB pInt2
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCompareCertificate(
-     DWORD dwCertEncodingType,
-     PCERT_INFO pCertId1,
-     PCERT_INFO pCertId2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCompareCertificateName(
-     DWORD dwCertEncodingType,
-     PCERT_NAME_BLOB pCertName1,
-     PCERT_NAME_BLOB pCertName2
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertIsRDNAttrsInCertificateName(
-     DWORD dwCertEncodingType,
-     DWORD dwFlags,
-     PCERT_NAME_BLOB pCertName,
-     PCERT_RDN pRDN
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertComparePublicKeyInfo(
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pPublicKey1,
-     PCERT_PUBLIC_KEY_INFO pPublicKey2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertGetPublicKeyLength(
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pPublicKey
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyCertificateSignature(
-     HCRYPTPROV               hCryptProv,
-     DWORD                    dwCertEncodingType,
-     const BYTE *             pbEncoded,
-     DWORD                    cbEncoded,
-     PCERT_PUBLIC_KEY_INFO    pPublicKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyCertificateSignatureEx(
-      HCRYPTPROV hCryptProv,
-     DWORD dwCertEncodingType,
-     DWORD dwSubjectType,
-     void *pvSubject,
-     DWORD dwIssuerType,
-     void *pvIssuer,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-    
-
-    
-
-    
-
-
-
-    
-
-    
-
-    
-
-    
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashToBeSigned(
-     HCRYPTPROV hCryptProv,
-     DWORD dwCertEncodingType,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     BYTE *pbComputedHash,
-      DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashCertificate(
-     HCRYPTPROV hCryptProv,
-     ALG_ID Algid,
-     DWORD dwFlags,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     BYTE *pbComputedHash,
-      DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignCertificate(
-     HCRYPTPROV hCryptProv,
-     DWORD dwKeySpec,
-     DWORD dwCertEncodingType,
-     const BYTE *pbEncodedToBeSigned,
-     DWORD cbEncodedToBeSigned,
-     PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
-      const void *pvHashAuxInfo,
-     BYTE *pbSignature,
-      DWORD *pcbSignature
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignAndEncodeCertificate(
-     HCRYPTPROV hCryptProv,
-     DWORD dwKeySpec,
-     DWORD dwCertEncodingType,
-     LPCSTR lpszStructType,       
-     const void *pvStructInfo,
-     PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
-      const void *pvHashAuxInfo,
-     PBYTE pbEncoded,
-      DWORD *pcbEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-CertVerifyTimeValidity(
-     LPFILETIME pTimeToVerify,
-     PCERT_INFO pCertInfo
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-CertVerifyCRLTimeValidity(
-     LPFILETIME pTimeToVerify,
-     PCRL_INFO pCrlInfo
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyValidityNesting(
-     PCERT_INFO pSubjectInfo,
-     PCERT_INFO pIssuerInfo
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyCRLRevocation(
-     DWORD dwCertEncodingType,
-     PCERT_INFO pCertId,          
-    
-     DWORD cCrlInfo,
-     PCRL_INFO rgpCrlInfo[]
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LPCSTR
-__stdcall
-CertAlgIdToOID(
-     DWORD dwAlgId
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertOIDToAlgId(
-     LPCSTR pszObjId
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-PCERT_EXTENSION
-__stdcall
-CertFindExtension(
-     LPCSTR pszObjId,
-     DWORD cExtensions,
-     CERT_EXTENSION rgExtensions[]
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-PCRYPT_ATTRIBUTE
-__stdcall
-CertFindAttribute(
-     LPCSTR pszObjId,
-     DWORD cAttr,
-     CRYPT_ATTRIBUTE rgAttr[]
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCERT_RDN_ATTR
-__stdcall
-CertFindRDNAttr(
-     LPCSTR pszObjId,
-     PCERT_NAME_INFO pName
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetIntendedKeyUsage(
-     DWORD dwCertEncodingType,
-     PCERT_INFO pCertInfo,
-     BYTE *pbKeyUsage,
-     DWORD cbKeyUsage
-    );
-
-typedef void *HCRYPTDEFAULTCONTEXT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptInstallDefaultContext(
-     HCRYPTPROV hCryptProv,
-     DWORD dwDefaultType,
-     const void *pvDefaultPara,
-     DWORD dwFlags,
-     void *pvReserved,
-     HCRYPTDEFAULTCONTEXT *phDefaultContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA {
-    DWORD               cOID;
-    LPSTR               *rgpszOID;
-} CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA, *PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUninstallDefaultContext(
-    HCRYPTDEFAULTCONTEXT hDefaultContext,
-     DWORD dwFlags,
-     void *pvReserved
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportPublicKeyInfo(
-     HCRYPTPROV hCryptProv,
-     DWORD dwKeySpec,
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-      DWORD *pcbInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportPublicKeyInfoEx(
-     HCRYPTPROV hCryptProv,
-     DWORD dwKeySpec,
-     DWORD dwCertEncodingType,
-     LPSTR pszPublicKeyObjId,
-     DWORD dwFlags,
-      void *pvAuxInfo,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-      DWORD *pcbInfo
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptImportPublicKeyInfo(
-     HCRYPTPROV hCryptProv,
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-     HCRYPTKEY *phKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptImportPublicKeyInfoEx(
-     HCRYPTPROV hCryptProv,
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-     ALG_ID aiKeyAlg,
-     DWORD dwFlags,
-      void *pvAuxInfo,
-     HCRYPTKEY *phKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptAcquireCertificatePrivateKey(
-     PCCERT_CONTEXT pCert,
-     DWORD dwFlags,
-     void *pvReserved,
-     HCRYPTPROV *phCryptProv,
-      DWORD *pdwKeySpec,
-      BOOL *pfCallerFreeProv
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptFindCertificateKeyProvInfo(
-     PCCERT_CONTEXT pCert,
-     DWORD dwFlags,
-     void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_IMPORT_PRIV_KEY_FUNC) (
-    HCRYPTPROV              hCryptProv,         
-    CRYPT_PRIVATE_KEY_INFO  *pPrivateKeyInfo,   
-    DWORD                   dwFlags,            
-    void                    *pvAuxInfo          
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptImportPKCS8(
-    CRYPT_PKCS8_IMPORT_PARAMS           sImportParams,          
-    DWORD                               dwFlags,                
-    HCRYPTPROV                          *phCryptProv,           
-    void                                *pvAuxInfo              
-    );
-
-
-
-
-typedef BOOL (__stdcall *PFN_EXPORT_PRIV_KEY_FUNC) (
-    HCRYPTPROV              hCryptProv,         
-    DWORD                   dwKeySpec,          
-    LPSTR                   pszPrivateKeyObjId, 
-    DWORD                   dwFlags,            
-    void                    *pvAuxInfo,         
-    CRYPT_PRIVATE_KEY_INFO  *pPrivateKeyInfo,   
-    DWORD                   *pcbPrivateKeyBlob  
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportPKCS8(
-    HCRYPTPROV  hCryptProv,         
-    DWORD       dwKeySpec,          
-    LPSTR       pszPrivateKeyObjId, 
-    DWORD       dwFlags,            
-    void        *pvAuxInfo,         
-    BYTE        *pbPrivateKeyBlob,  
-    DWORD       *pcbPrivateKeyBlob  
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportPKCS8Ex(
-    CRYPT_PKCS8_EXPORT_PARAMS* psExportParams, 
-    DWORD       dwFlags,            
-    void        *pvAuxInfo,         
-    BYTE        *pbPrivateKeyBlob,  
-    DWORD       *pcbPrivateKeyBlob  
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashPublicKeyInfo(
-     HCRYPTPROV hCryptProv,
-     ALG_ID Algid,
-     DWORD dwFlags,
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-     BYTE *pbComputedHash,
-      DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertRDNValueToStrA(
-     DWORD dwValueType,
-     PCERT_RDN_VALUE_BLOB pValue,
-      LPSTR psz,
-     DWORD csz
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertRDNValueToStrW(
-     DWORD dwValueType,
-     PCERT_RDN_VALUE_BLOB pValue,
-      LPWSTR psz,
-     DWORD csz
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertNameToStrA(
-     DWORD dwCertEncodingType,
-     PCERT_NAME_BLOB pName,
-     DWORD dwStrType,
-      LPSTR psz,
-     DWORD csz
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertNameToStrW(
-     DWORD dwCertEncodingType,
-     PCERT_NAME_BLOB pName,
-     DWORD dwStrType,
-      LPWSTR psz,
-     DWORD csz
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertStrToNameA(
-     DWORD dwCertEncodingType,
-     LPCSTR pszX500,
-     DWORD dwStrType,
-      void *pvReserved,
-     BYTE *pbEncoded,
-      DWORD *pcbEncoded,
-      LPCSTR *ppszError
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertStrToNameW(
-     DWORD dwCertEncodingType,
-     LPCWSTR pszX500,
-     DWORD dwStrType,
-      void *pvReserved,
-     BYTE *pbEncoded,
-      DWORD *pcbEncoded,
-      LPCWSTR *ppszError
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertGetNameStringA(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwType,
-     DWORD dwFlags,
-     void *pvTypePara,
-      LPSTR pszNameString,
-     DWORD cchNameString
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertGetNameStringW(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwType,
-     DWORD dwFlags,
-     void *pvTypePara,
-      LPWSTR pszNameString,
-     DWORD cchNameString
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef PCCERT_CONTEXT (__stdcall *PFN_CRYPT_GET_SIGNER_CERTIFICATE)(
-     void *pvGetArg,
-     DWORD dwCertEncodingType,
-     PCERT_INFO pSignerId,    
-                                
-     HCERTSTORE hMsgCertStore
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_SIGN_MESSAGE_PARA {
-    DWORD                       cbSize;
-    DWORD                       dwMsgEncodingType;
-    PCCERT_CONTEXT              pSigningCert;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-    DWORD                       cMsgCert;
-    PCCERT_CONTEXT              *rgpMsgCert;
-    DWORD                       cMsgCrl;
-    PCCRL_CONTEXT               *rgpMsgCrl;
-    DWORD                       cAuthAttr;
-    PCRYPT_ATTRIBUTE            rgAuthAttr;
-    DWORD                       cUnauthAttr;
-    PCRYPT_ATTRIBUTE            rgUnauthAttr;
-    DWORD                       dwFlags;
-    DWORD                       dwInnerContentType;
-
-
-
-
-
-} CRYPT_SIGN_MESSAGE_PARA, *PCRYPT_SIGN_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_VERIFY_MESSAGE_PARA {
-    DWORD                               cbSize;
-    DWORD                               dwMsgAndCertEncodingType;
-    HCRYPTPROV                          hCryptProv;
-    PFN_CRYPT_GET_SIGNER_CERTIFICATE    pfnGetSignerCertificate;
-    void                                *pvGetArg;
-} CRYPT_VERIFY_MESSAGE_PARA, *PCRYPT_VERIFY_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_ENCRYPT_MESSAGE_PARA {
-    DWORD                       cbSize;
-    DWORD                       dwMsgEncodingType;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
-    void                        *pvEncryptionAuxInfo;
-    DWORD                       dwFlags;
-    DWORD                       dwInnerContentType;
-} CRYPT_ENCRYPT_MESSAGE_PARA, *PCRYPT_ENCRYPT_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_DECRYPT_MESSAGE_PARA {
-    DWORD                   cbSize;
-    DWORD                   dwMsgAndCertEncodingType;
-    DWORD                   cCertStore;
-    HCERTSTORE              *rghCertStore;
-
-
-
-
-
-
-
-
-
-} CRYPT_DECRYPT_MESSAGE_PARA, *PCRYPT_DECRYPT_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_HASH_MESSAGE_PARA {
-    DWORD                       cbSize;
-    DWORD                       dwMsgEncodingType;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-} CRYPT_HASH_MESSAGE_PARA, *PCRYPT_HASH_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_KEY_SIGN_MESSAGE_PARA {
-    DWORD                       cbSize;
-    DWORD                       dwMsgAndCertEncodingType;
-    HCRYPTPROV                  hCryptProv;
-    DWORD                       dwKeySpec;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-    CRYPT_ALGORITHM_IDENTIFIER  PubKeyAlgorithm;
-} CRYPT_KEY_SIGN_MESSAGE_PARA, *PCRYPT_KEY_SIGN_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_KEY_VERIFY_MESSAGE_PARA {
-    DWORD                   cbSize;
-    DWORD                   dwMsgEncodingType;
-    HCRYPTPROV              hCryptProv;
-} CRYPT_KEY_VERIFY_MESSAGE_PARA, *PCRYPT_KEY_VERIFY_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignMessage(
-     PCRYPT_SIGN_MESSAGE_PARA pSignPara,
-     BOOL fDetachedSignature,
-     DWORD cToBeSigned,
-     const BYTE *rgpbToBeSigned[],
-     DWORD rgcbToBeSigned[],
-     BYTE *pbSignedBlob,
-      DWORD *pcbSignedBlob
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyMessageSignature(
-     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
-     DWORD dwSignerIndex,
-     const BYTE *pbSignedBlob,
-     DWORD cbSignedBlob,
-     BYTE  *pbDecoded,
-       DWORD *pcbDecoded,
-      PCCERT_CONTEXT *ppSignerCert
-    );
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-CryptGetMessageSignerCount(
-     DWORD dwMsgEncodingType,
-     const BYTE *pbSignedBlob,
-     DWORD cbSignedBlob
-    );
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CryptGetMessageCertificates(
-     DWORD dwMsgAndCertEncodingType,
-     HCRYPTPROV hCryptProv,           
-     DWORD dwFlags,                   
-     const BYTE *pbSignedBlob,
-     DWORD cbSignedBlob
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyDetachedMessageSignature(
-     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
-     DWORD dwSignerIndex,
-     const BYTE *pbDetachedSignBlob,
-     DWORD cbDetachedSignBlob,
-     DWORD cToBeSigned,
-     const BYTE *rgpbToBeSigned[],
-     DWORD rgcbToBeSigned[],
-      PCCERT_CONTEXT *ppSignerCert
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEncryptMessage(
-     PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
-     DWORD cRecipientCert,
-     PCCERT_CONTEXT rgpRecipientCert[],
-     const BYTE *pbToBeEncrypted,
-     DWORD cbToBeEncrypted,
-     BYTE *pbEncryptedBlob,
-      DWORD *pcbEncryptedBlob
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecryptMessage(
-     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
-     const BYTE *pbEncryptedBlob,
-     DWORD cbEncryptedBlob,
-      BYTE *pbDecrypted,
-       DWORD *pcbDecrypted,
-      PCCERT_CONTEXT *ppXchgCert
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignAndEncryptMessage(
-     PCRYPT_SIGN_MESSAGE_PARA pSignPara,
-     PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
-     DWORD cRecipientCert,
-     PCCERT_CONTEXT rgpRecipientCert[],
-     const BYTE *pbToBeSignedAndEncrypted,
-     DWORD cbToBeSignedAndEncrypted,
-     BYTE *pbSignedAndEncryptedBlob,
-      DWORD *pcbSignedAndEncryptedBlob
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecryptAndVerifyMessageSignature(
-     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
-     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
-     DWORD dwSignerIndex,
-     const BYTE *pbEncryptedBlob,
-     DWORD cbEncryptedBlob,
-      BYTE *pbDecrypted,
-       DWORD *pcbDecrypted,
-      PCCERT_CONTEXT *ppXchgCert,
-      PCCERT_CONTEXT *ppSignerCert
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecodeMessage(
-     DWORD dwMsgTypeFlags,
-     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
-     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
-     DWORD dwSignerIndex,
-     const BYTE *pbEncodedBlob,
-     DWORD cbEncodedBlob,
-     DWORD dwPrevInnerContentType,
-      DWORD *pdwMsgType,
-      DWORD *pdwInnerContentType,
-      BYTE *pbDecoded,
-       DWORD *pcbDecoded,
-      PCCERT_CONTEXT *ppXchgCert,
-      PCCERT_CONTEXT *ppSignerCert
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashMessage(
-     PCRYPT_HASH_MESSAGE_PARA pHashPara,
-     BOOL fDetachedHash,
-     DWORD cToBeHashed,
-     const BYTE *rgpbToBeHashed[],
-     DWORD rgcbToBeHashed[],
-      BYTE *pbHashedBlob,
-       DWORD *pcbHashedBlob,
-      BYTE *pbComputedHash,
-       DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyMessageHash(
-     PCRYPT_HASH_MESSAGE_PARA pHashPara,
-     BYTE *pbHashedBlob,
-     DWORD cbHashedBlob,
-      BYTE *pbToBeHashed,
-       DWORD *pcbToBeHashed,
-      BYTE *pbComputedHash,
-       DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyDetachedMessageHash(
-     PCRYPT_HASH_MESSAGE_PARA pHashPara,
-     BYTE *pbDetachedHashBlob,
-     DWORD cbDetachedHashBlob,
-     DWORD cToBeHashed,
-     const BYTE *rgpbToBeHashed[],
-     DWORD rgcbToBeHashed[],
-      BYTE *pbComputedHash,
-       DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignMessageWithKey(
-     PCRYPT_KEY_SIGN_MESSAGE_PARA pSignPara,
-     const BYTE *pbToBeSigned,
-     DWORD cbToBeSigned,
-     BYTE *pbSignedBlob,
-      DWORD *pcbSignedBlob
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyMessageSignatureWithKey(
-     PCRYPT_KEY_VERIFY_MESSAGE_PARA pVerifyPara,
-      PCERT_PUBLIC_KEY_INFO pPublicKeyInfo,
-     const BYTE *pbSignedBlob,
-     DWORD cbSignedBlob,
-      BYTE *pbDecoded,
-       DWORD *pcbDecoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CertOpenSystemStoreA(
-    HCRYPTPROV      hProv,
-    LPCSTR            szSubsystemProtocol
-    );
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CertOpenSystemStoreW(
-    HCRYPTPROV      hProv,
-    LPCWSTR            szSubsystemProtocol
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCertificateToSystemStoreA(
-    LPCSTR            szCertStoreName,
-    const BYTE *    pbCertEncoded,
-    DWORD           cbCertEncoded
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCertificateToSystemStoreW(
-    LPCWSTR            szCertStoreName,
-    const BYTE *    pbCertEncoded,
-    DWORD           cbCertEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CHAIN {
-    DWORD                   cCerts;     
-    PCERT_BLOB              certs;      
-                                        
-    CRYPT_KEY_PROV_INFO     keyLocatorInfo; 
-} CERT_CHAIN, *PCERT_CHAIN;
-
-
-
-HRESULT
-__stdcall
-FindCertsByIssuer(
-     PCERT_CHAIN pCertChains,
-      DWORD *pcbCertChains,
-     DWORD *pcCertChains,        
-     BYTE* pbEncodedIssuerName,   
-     DWORD cbEncodedIssuerName,   
-     LPCWSTR pwszPurpose,         
-     DWORD dwKeySpec              
-    
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptQueryObject(
-    DWORD            dwObjectType,
-    const void       *pvObject,
-    DWORD            dwExpectedContentTypeFlags,
-    DWORD            dwExpectedFormatTypeFlags,
-    DWORD            dwFlags,
-    DWORD            *pdwMsgAndCertEncodingType,
-    DWORD            *pdwContentType,
-    DWORD            *pdwFormatType,
-    HCERTSTORE       *phCertStore,
-    HCRYPTMSG        *phMsg,
-    const void       **ppvContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LPVOID
-__stdcall
-CryptMemAlloc (
-     ULONG cbSize
-    );
-
-__declspec(dllimport)
-LPVOID
-__stdcall
-CryptMemRealloc (
-     LPVOID pv,
-     ULONG cbSize
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-CryptMemFree (
-     LPVOID pv
-    );
-
-
-
-
-
-
-
-
-typedef HANDLE HCRYPTASYNC, *PHCRYPTASYNC;
-
-typedef void (__stdcall *PFN_CRYPT_ASYNC_PARAM_FREE_FUNC) (
-    LPSTR pszParamOid,
-    LPVOID pvParam
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCreateAsyncHandle (
-     DWORD dwFlags,
-     PHCRYPTASYNC phAsync
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetAsyncParam (
-     HCRYPTASYNC hAsync,
-     LPSTR pszParamOid,
-     LPVOID pvParam,
-      PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetAsyncParam (
-     HCRYPTASYNC hAsync,
-     LPSTR pszParamOid,
-     LPVOID* ppvParam,
-      PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCloseAsyncHandle (
-     HCRYPTASYNC hAsync
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_BLOB_ARRAY {
-    DWORD            cBlob;
-    PCRYPT_DATA_BLOB rgBlob;
-} CRYPT_BLOB_ARRAY, *PCRYPT_BLOB_ARRAY;
-
-typedef struct _CRYPT_CREDENTIALS {
-    DWORD  cbSize;
-    LPCSTR pszCredentialsOid;
-    LPVOID pvCredentials;
-} CRYPT_CREDENTIALS, *PCRYPT_CREDENTIALS;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_PASSWORD_CREDENTIALSA {
-    DWORD   cbSize;
-    LPSTR   pszUsername;
-    LPSTR   pszPassword;
-} CRYPT_PASSWORD_CREDENTIALSA, *PCRYPT_PASSWORD_CREDENTIALSA;
-typedef struct _CRYPT_PASSWORD_CREDENTIALSW {
-    DWORD   cbSize;
-    LPWSTR  pszUsername;
-    LPWSTR  pszPassword;
-} CRYPT_PASSWORD_CREDENTIALSW, *PCRYPT_PASSWORD_CREDENTIALSW;
-
-typedef CRYPT_PASSWORD_CREDENTIALSW CRYPT_PASSWORD_CREDENTIALS;
-typedef PCRYPT_PASSWORD_CREDENTIALSW PCRYPT_PASSWORD_CREDENTIALS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *PFN_FREE_ENCODED_OBJECT_FUNC) (
-    LPCSTR pszObjectOid,
-    PCRYPT_BLOB_ARRAY pObject,
-    LPVOID pvFreeContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_RETRIEVE_AUX_INFO {
-    DWORD       cbSize;
-    FILETIME    *pLastSyncTime;
-    DWORD       dwMaxUrlRetrievalByteCount;     
-} CRYPT_RETRIEVE_AUX_INFO, *PCRYPT_RETRIEVE_AUX_INFO;
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRetrieveObjectByUrlA (
-     LPCSTR pszUrl,
-     LPCSTR pszObjectOid,
-     DWORD dwRetrievalFlags,
-     DWORD dwTimeout,                     
-     LPVOID* ppvObject,
-     HCRYPTASYNC hAsyncRetrieve,
-      PCRYPT_CREDENTIALS pCredentials,
-      LPVOID pvVerify,
-      PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRetrieveObjectByUrlW (
-     LPCWSTR pszUrl,
-     LPCSTR pszObjectOid,
-     DWORD dwRetrievalFlags,
-     DWORD dwTimeout,                     
-     LPVOID* ppvObject,
-     HCRYPTASYNC hAsyncRetrieve,
-      PCRYPT_CREDENTIALS pCredentials,
-      LPVOID pvVerify,
-      PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CRYPT_CANCEL_RETRIEVAL)(
-     DWORD dwFlags,
-     void  *pvArg
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptInstallCancelRetrieval(
-     PFN_CRYPT_CANCEL_RETRIEVAL pfnCancel,
-     const void *pvArg,
-     DWORD dwFlags,
-     void *pvReserved
-);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUninstallCancelRetrieval(
-         DWORD dwFlags,
-         void  *pvReserved
-        );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCancelAsyncRetrieval (
-    HCRYPTASYNC hAsyncRetrieval
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC) (
-     LPVOID pvCompletion,
-     DWORD dwCompletionCode,
-     LPCSTR pszUrl,
-     LPSTR pszObjectOid,
-     LPVOID pvObject
-    );
-
-typedef struct _CRYPT_ASYNC_RETRIEVAL_COMPLETION {
-    PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC pfnCompletion;
-    LPVOID pvCompletion;
-} CRYPT_ASYNC_RETRIEVAL_COMPLETION, *PCRYPT_ASYNC_RETRIEVAL_COMPLETION;
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CANCEL_ASYNC_RETRIEVAL_FUNC) (
-    HCRYPTASYNC hAsyncRetrieve
-    );
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_URL_ARRAY {
-    DWORD   cUrl;
-    LPWSTR* rgwszUrl;
-} CRYPT_URL_ARRAY, *PCRYPT_URL_ARRAY;
-
-typedef struct _CRYPT_URL_INFO {
-    DWORD   cbSize;
-
-    
-    DWORD   dwSyncDeltaTime;
-
-    
-    
-    
-    DWORD   cGroup;
-    DWORD   *rgcGroupEntry;
-} CRYPT_URL_INFO, *PCRYPT_URL_INFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetObjectUrl (
-     LPCSTR pszUrlOid,
-     LPVOID pvPara,
-     DWORD dwFlags,
-      PCRYPT_URL_ARRAY pUrlArray,
-      DWORD* pcbUrlArray,
-      PCRYPT_URL_INFO pUrlInfo,
-       DWORD* pcbUrlInfo,
-      LPVOID pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CRL_CONTEXT_PAIR {
-    PCCERT_CONTEXT          pCertContext;
-    PCCRL_CONTEXT           pCrlContext;
-} CERT_CRL_CONTEXT_PAIR, *PCERT_CRL_CONTEXT_PAIR;
-typedef const CERT_CRL_CONTEXT_PAIR *PCCERT_CRL_CONTEXT_PAIR;
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetTimeValidObject (
-     LPCSTR pszTimeValidOid,
-     LPVOID pvPara,
-     PCCERT_CONTEXT pIssuer,
-      LPFILETIME pftValidFor,
-     DWORD dwFlags,
-     DWORD dwTimeout,                         
-      LPVOID* ppvObject,
-      PCRYPT_CREDENTIALS pCredentials,
-      LPVOID pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptFlushTimeValidObject (
-      LPCSTR pszFlushTimeValidOid,
-      LPVOID pvPara,
-      PCCERT_CONTEXT pIssuer,
-      DWORD dwFlags,
-      LPVOID pvReserved
-     );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  _CRYPTPROTECT_PROMPTSTRUCT
-{
-    DWORD cbSize;
-    DWORD dwPromptFlags;
-    HWND  hwndApp;
-    LPCWSTR szPrompt;
-} CRYPTPROTECT_PROMPTSTRUCT, *PCRYPTPROTECT_PROMPTSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptProtectData(
-                  DATA_BLOB*      pDataIn,
-                  LPCWSTR         szDataDescr,
-          DATA_BLOB*      pOptionalEntropy,
-                  PVOID           pvReserved,
-          CRYPTPROTECT_PROMPTSTRUCT*  pPromptStruct,
-                  DWORD           dwFlags,
-                 DATA_BLOB*      pDataOut            
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnprotectData(
-                  DATA_BLOB*      pDataIn,             
-         LPWSTR*         ppszDataDescr,       
-          DATA_BLOB*      pOptionalEntropy,
-                  PVOID           pvReserved,
-          CRYPTPROTECT_PROMPTSTRUCT*  pPromptStruct,
-                  DWORD           dwFlags,
-                 DATA_BLOB*      pDataOut
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptProtectMemory(
-               LPVOID          pDataIn,             
-                  DWORD           cbDataIn,            
-                  DWORD           dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnprotectMemory(
-               LPVOID          pDataIn,             
-                  DWORD           cbDataIn,            
-                  DWORD           dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertCreateSelfSignCertificate(
-              HCRYPTPROV                  hProv,
-              PCERT_NAME_BLOB             pSubjectIssuerBlob,
-              DWORD                       dwFlags,
-        PCRYPT_KEY_PROV_INFO        pKeyProvInfo,
-        PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
-        PSYSTEMTIME                 pStartTime,
-        PSYSTEMTIME                 pEndTime,
-        PCERT_EXTENSIONS            pExtensions
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetKeyIdentifierProperty(
-     const CRYPT_HASH_BLOB *pKeyIdentifier,
-     DWORD dwPropId,
-     DWORD dwFlags,
-      LPCWSTR pwszComputerName,
-      void *pvReserved,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetKeyIdentifierProperty(
-     const CRYPT_HASH_BLOB *pKeyIdentifier,
-     DWORD dwPropId,
-     DWORD dwFlags,
-      LPCWSTR pwszComputerName,
-      void *pvReserved,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CRYPT_ENUM_KEYID_PROP)(
-     const CRYPT_HASH_BLOB *pKeyIdentifier,
-     DWORD dwFlags,
-     void *pvReserved,
-     void *pvArg,
-     DWORD cProp,
-     DWORD *rgdwPropId,
-     void **rgpvData,
-     DWORD *rgcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumKeyIdentifierProperties(
-      const CRYPT_HASH_BLOB *pKeyIdentifier,
-     DWORD dwPropId,
-     DWORD dwFlags,
-      LPCWSTR pwszComputerName,
-      void *pvReserved,
-      void *pvArg,
-     PFN_CRYPT_ENUM_KEYID_PROP pfnEnum
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCreateKeyIdentifierFromCSP(
-     DWORD dwCertEncodingType,
-      LPCSTR pszPubKeyOID,
-     const PUBLICKEYSTRUC *pPubKeyStruc,
-     DWORD cbPubKeyStruc,
-     DWORD dwFlags,
-      void *pvReserved,
-     BYTE *pbHash,
-      DWORD *pcbHash
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef HANDLE HCERTCHAINENGINE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CHAIN_ENGINE_CONFIG {
-
-    DWORD       cbSize;
-    HCERTSTORE  hRestrictedRoot;
-    HCERTSTORE  hRestrictedTrust;
-    HCERTSTORE  hRestrictedOther;
-    DWORD       cAdditionalStore;
-    HCERTSTORE* rghAdditionalStore;
-    DWORD       dwFlags;
-    DWORD       dwUrlRetrievalTimeout;      
-    DWORD       MaximumCachedCertificates;
-    DWORD       CycleDetectionModulus;
-
-} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCreateCertificateChainEngine (
-     PCERT_CHAIN_ENGINE_CONFIG pConfig,
-     HCERTCHAINENGINE* phChainEngine
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-CertFreeCertificateChainEngine (
-     HCERTCHAINENGINE hChainEngine
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertResyncCertificateChainEngine (
-     HCERTCHAINENGINE hChainEngine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_TRUST_STATUS {
-
-    DWORD dwErrorStatus;
-    DWORD dwInfoStatus;
-
-} CERT_TRUST_STATUS, *PCERT_TRUST_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REVOCATION_INFO {
-
-    DWORD                       cbSize;
-    DWORD                       dwRevocationResult;
-    LPCSTR                      pszRevocationOid;
-    LPVOID                      pvOidSpecificInfo;
-
-    
-    
-    BOOL                        fHasFreshnessTime;
-    DWORD                       dwFreshnessTime;    
-
-    
-    PCERT_REVOCATION_CRL_INFO   pCrlInfo;
-
-} CERT_REVOCATION_INFO, *PCERT_REVOCATION_INFO;
-
-
-
-
-
-typedef struct _CERT_TRUST_LIST_INFO {
-
-    DWORD         cbSize;
-    PCTL_ENTRY    pCtlEntry;
-    PCCTL_CONTEXT pCtlContext;
-
-} CERT_TRUST_LIST_INFO, *PCERT_TRUST_LIST_INFO;
-
-
-
-
-
-typedef struct _CERT_CHAIN_ELEMENT {
-
-    DWORD                 cbSize;
-    PCCERT_CONTEXT        pCertContext;
-    CERT_TRUST_STATUS     TrustStatus;
-    PCERT_REVOCATION_INFO pRevocationInfo;
-
-    PCERT_ENHKEY_USAGE    pIssuanceUsage;       
-    PCERT_ENHKEY_USAGE    pApplicationUsage;    
-
-    LPCWSTR               pwszExtendedErrorInfo;    
-
-} CERT_CHAIN_ELEMENT, *PCERT_CHAIN_ELEMENT;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_SIMPLE_CHAIN {
-
-    DWORD                 cbSize;
-    CERT_TRUST_STATUS     TrustStatus;
-    DWORD                 cElement;
-    PCERT_CHAIN_ELEMENT*  rgpElement;
-    PCERT_TRUST_LIST_INFO pTrustListInfo;
-
-    
-    
-    
-    
-    
-    
-    BOOL                   fHasRevocationFreshnessTime;
-    DWORD                  dwRevocationFreshnessTime;    
-
-} CERT_SIMPLE_CHAIN, *PCERT_SIMPLE_CHAIN;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CHAIN_CONTEXT CERT_CHAIN_CONTEXT, *PCERT_CHAIN_CONTEXT;
-typedef const CERT_CHAIN_CONTEXT *PCCERT_CHAIN_CONTEXT;
-
-struct _CERT_CHAIN_CONTEXT {
-    DWORD                   cbSize;
-    CERT_TRUST_STATUS       TrustStatus;
-    DWORD                   cChain;
-    PCERT_SIMPLE_CHAIN*     rgpChain;
-
-    
-    
-    DWORD                   cLowerQualityChainContext;
-    PCCERT_CHAIN_CONTEXT*   rgpLowerQualityChainContext;
-
-    
-    
-    
-    
-    
-    
-    BOOL                    fHasRevocationFreshnessTime;
-    DWORD                   dwRevocationFreshnessTime;    
-};
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_USAGE_MATCH {
-
-    DWORD             dwType;
-    CERT_ENHKEY_USAGE Usage;
-
-} CERT_USAGE_MATCH, *PCERT_USAGE_MATCH;
-
-typedef struct _CTL_USAGE_MATCH {
-
-    DWORD     dwType;
-    CTL_USAGE Usage;
-
-} CTL_USAGE_MATCH, *PCTL_USAGE_MATCH;
-
-typedef struct _CERT_CHAIN_PARA {
-
-    DWORD            cbSize;
-    CERT_USAGE_MATCH RequestedUsage;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} CERT_CHAIN_PARA, *PCERT_CHAIN_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetCertificateChain (
-      HCERTCHAINENGINE hChainEngine,
-     PCCERT_CONTEXT pCertContext,
-      LPFILETIME pTime,
-      HCERTSTORE hAdditionalStore,
-     PCERT_CHAIN_PARA pChainPara,
-     DWORD dwFlags,
-     LPVOID pvReserved,
-     PCCERT_CHAIN_CONTEXT* ppChainContext
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-CertFreeCertificateChain (
-     PCCERT_CHAIN_CONTEXT pChainContext
-    );
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CHAIN_CONTEXT
-__stdcall
-CertDuplicateCertificateChain (
-     PCCERT_CHAIN_CONTEXT pChainContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_REVOCATION_INFO {
-
-    PCRL_ENTRY           pCrlEntry;
-    PCCRL_CONTEXT        pCrlContext;
-    PCCERT_CHAIN_CONTEXT pCrlIssuerChain;
-
-} CRL_REVOCATION_INFO, *PCRL_REVOCATION_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CHAIN_CONTEXT
-__stdcall
-CertFindChainInStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     DWORD dwFindFlags,
-     DWORD dwFindType,
-     const void *pvFindPara,
-     PCCERT_CHAIN_CONTEXT pPrevChainContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK)(
-     PCCERT_CONTEXT pCert,
-     void *pvFindArg
-    );
-
-typedef struct _CERT_CHAIN_FIND_BY_ISSUER_PARA {
-    DWORD                                   cbSize;
-
-    
-    LPCSTR                                  pszUsageIdentifier;
-
-    
-    DWORD                                   dwKeySpec;
-
-    
-    
-    
-    
-    
-    DWORD                                   dwAcquirePrivateKeyFlags;
-
-    
-    
-    DWORD                                   cIssuer;
-    CERT_NAME_BLOB                          *rgIssuer;
-
-    
-    
-    
-    PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK pfnFindCallback;
-    void                                    *pvFindArg;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} CERT_CHAIN_FIND_ISSUER_PARA, *PCERT_CHAIN_FIND_ISSUER_PARA,
-    CERT_CHAIN_FIND_BY_ISSUER_PARA, *PCERT_CHAIN_FIND_BY_ISSUER_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CHAIN_POLICY_PARA {
-    DWORD                   cbSize;
-    DWORD                   dwFlags;
-    void                    *pvExtraPolicyPara;     
-} CERT_CHAIN_POLICY_PARA, *PCERT_CHAIN_POLICY_PARA;
-
-
-
-
-
-
-typedef struct _CERT_CHAIN_POLICY_STATUS {
-    DWORD                   cbSize;
-    DWORD                   dwError;
-    LONG                    lChainIndex;
-    LONG                    lElementIndex;
-    void                    *pvExtraPolicyStatus;   
-} CERT_CHAIN_POLICY_STATUS, *PCERT_CHAIN_POLICY_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyCertificateChainPolicy(
-     LPCSTR pszPolicyOID,
-     PCCERT_CHAIN_CONTEXT pChainContext,
-     PCERT_CHAIN_POLICY_PARA pPolicyPara,
-      PCERT_CHAIN_POLICY_STATUS pPolicyStatus
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA {
-    DWORD               cbSize;
-    DWORD               dwRegPolicySettings;
-    PCMSG_SIGNER_INFO   pSignerInfo;                
-} AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA,
-    *PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA;
-
-typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS {
-    DWORD               cbSize;
-    BOOL                fCommercial;        
-} AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS,
-    *PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA {
-    DWORD               cbSize;
-    DWORD               dwRegPolicySettings;
-    BOOL                fCommercial;
-} AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA,
-    *PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _HTTPSPolicyCallbackData
-{
-    union {
-        DWORD           cbStruct;       
-        DWORD           cbSize;         
-    };
-
-    DWORD           dwAuthType;
-
-
-
-    DWORD           fdwChecks;
-
-    WCHAR           *pwszServerName; 
-
-} HTTPSPolicyCallbackData, *PHTTPSPolicyCallbackData,
-    SSL_EXTRA_CERT_CHAIN_POLICY_PARA, *PSSL_EXTRA_CERT_CHAIN_POLICY_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptStringToBinaryA(
-         LPCSTR  pszString,
-         DWORD     cchString,
-         DWORD     dwFlags,
-         BYTE     *pbBinary,
-      DWORD    *pcbBinary,
-        DWORD    *pdwSkip,    
-        DWORD    *pdwFlags    
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptStringToBinaryW(
-         LPCWSTR  pszString,
-         DWORD     cchString,
-         DWORD     dwFlags,
-         BYTE     *pbBinary,
-      DWORD    *pcbBinary,
-        DWORD    *pdwSkip,    
-        DWORD    *pdwFlags    
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptBinaryToStringA(
-         const BYTE  *pbBinary,
-         DWORD        cbBinary,
-         DWORD        dwFlags,
-         LPSTR      pszString,
-      DWORD       *pcchString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptBinaryToStringW(
-         const BYTE  *pbBinary,
-         DWORD        cbBinary,
-         DWORD        dwFlags,
-         LPWSTR      pszString,
-      DWORD       *pcchString
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-PFXImportCertStore(
-     CRYPT_DATA_BLOB* pPFX,
-     LPCWSTR szPassword,
-     DWORD   dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PFXIsPFXBlob(
-     CRYPT_DATA_BLOB* pPFX);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL 
-__stdcall
-PFXVerifyPassword(
-     CRYPT_DATA_BLOB* pPFX,
-     LPCWSTR szPassword,
-     DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PFXExportCertStoreEx(
-     HCERTSTORE hStore,
-      CRYPT_DATA_BLOB* pPFX,
-     LPCWSTR szPassword,
-     void*   pvReserved,
-     DWORD   dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PFXExportCertStore(
-     HCERTSTORE hStore,
-      CRYPT_DATA_BLOB* pPFX,
-     LPCWSTR szPassword,
-     DWORD   dwFlags);
-
-
-
-
-
-}       
-
-
-
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERTIFICATE_BLOB {
-
-    DWORD   dwCertEncodingType;
-
-
-
-
-
-    DWORD   cbData;
-
-
-
-
-    PBYTE    pbData;
-
-} EFS_CERTIFICATE_BLOB, *PEFS_CERTIFICATE_BLOB;
-
-
-
-
-
-
-typedef struct _EFS_HASH_BLOB {
-
-
-
-
-    DWORD   cbData;
-
-
-
-
-    PBYTE    pbData;
-
-} EFS_HASH_BLOB, *PEFS_HASH_BLOB;
-
-
-
-
-
-
-typedef struct _EFS_RPC_BLOB {
-
-
-
-
-    DWORD   cbData;
-
-
-
-
-    PBYTE    pbData;
-
-} EFS_RPC_BLOB, *PEFS_RPC_BLOB;
-
-typedef struct _EFS_KEY_INFO {
-
-    DWORD   dwVersion;
-    ULONG   Entropy;
-    ALG_ID  Algorithm;
-    ULONG   KeyLength;
-    
-} EFS_KEY_INFO, *PEFS_KEY_INFO;
-
-
-
-
-
-
-
-typedef struct _ENCRYPTION_CERTIFICATE {
-    DWORD cbTotalLength;
-    SID * pUserSid;
-    PEFS_CERTIFICATE_BLOB pCertBlob;
-} ENCRYPTION_CERTIFICATE, *PENCRYPTION_CERTIFICATE;
-
-
-
-
-typedef struct _ENCRYPTION_CERTIFICATE_HASH {
-    DWORD cbTotalLength;
-    SID * pUserSid;
-    PEFS_HASH_BLOB  pHash;
-
-
-
-
-    LPWSTR lpDisplayInformation;
-
-} ENCRYPTION_CERTIFICATE_HASH, *PENCRYPTION_CERTIFICATE_HASH;
-
-
-
-
-
-
-
-typedef struct _ENCRYPTION_CERTIFICATE_HASH_LIST {
-
-
-
-    DWORD nCert_Hash;
-
-
-
-     PENCRYPTION_CERTIFICATE_HASH * pUsers;
-} ENCRYPTION_CERTIFICATE_HASH_LIST, *PENCRYPTION_CERTIFICATE_HASH_LIST;
-
-
-
-typedef struct _ENCRYPTION_CERTIFICATE_LIST {    
-
-
-
-    DWORD nUsers;
-
-
-
-     PENCRYPTION_CERTIFICATE * pUsers;
-} ENCRYPTION_CERTIFICATE_LIST, *PENCRYPTION_CERTIFICATE_LIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-QueryUsersOnEncryptedFile(
-          LPCWSTR lpFileName,
-          PENCRYPTION_CERTIFICATE_HASH_LIST * pUsers
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-QueryRecoveryAgentsOnEncryptedFile(
-          LPCWSTR lpFileName,
-          PENCRYPTION_CERTIFICATE_HASH_LIST * pRecoveryAgents
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-RemoveUsersFromEncryptedFile(
-          LPCWSTR lpFileName,
-          PENCRYPTION_CERTIFICATE_HASH_LIST pHashes
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-AddUsersToEncryptedFile(
-          LPCWSTR lpFileName,
-          PENCRYPTION_CERTIFICATE_LIST pUsers
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetUserFileEncryptionKey(
-           PENCRYPTION_CERTIFICATE pEncryptionCertificate
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-FreeEncryptionCertificateHashList(
-           PENCRYPTION_CERTIFICATE_HASH_LIST pHashes
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EncryptionDisable(
-         LPCWSTR DirPath,
-         BOOL Disable
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-DuplicateEncryptionInfoFile(
-          LPCWSTR SrcFileName,
-          LPCWSTR DstFileName, 
-          DWORD dwCreationDistribution, 
-          DWORD dwAttributes, 
-          const LPSECURITY_ATTRIBUTES lpSecurityAttributes
-     );
-
-
-}       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-typedef struct
-{
-   RPC_NS_HANDLE        LookupContext;
-   RPC_BINDING_HANDLE   ProposedHandle;
-   RPC_BINDING_VECTOR * Bindings;
-
-} RPC_IMPORT_CONTEXT_P, * PRPC_IMPORT_CONTEXT_P;
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsGetBuffer(
-     PRPC_MESSAGE Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsSendReceive(
-     PRPC_MESSAGE Message,
-     RPC_BINDING_HANDLE  * Handle
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcNsRaiseException(
-     PRPC_MESSAGE Message,
-     RPC_STATUS Status
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcReBindBuffer(
-     PRPC_MESSAGE Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_NsServerBindSearch(
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_NsClientBindSearch(
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_NsClientBindDone(
-    );
-
-
-}
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned char byte;
-typedef byte cs_byte;
-typedef unsigned char boolean;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void  * __stdcall MIDL_user_allocate(size_t);
-void             __stdcall MIDL_user_free( void  * );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void  * NDR_CCONTEXT;
-
-typedef struct
-    {
-    void  * pad[2];
-    void  * userContext;
-    }  * NDR_SCONTEXT;
-
-
-
-
-
-typedef void (__stdcall  * NDR_RUNDOWN)(void  * context);
-
-typedef void (__stdcall  * NDR_NOTIFY_ROUTINE)(void);
-typedef void (__stdcall  * NDR_NOTIFY2_ROUTINE)(boolean flag);
-
-typedef struct _SCONTEXT_QUEUE {
-    unsigned long   NumberOfObjects;
-    NDR_SCONTEXT  * ArrayOfObjects;
-    } SCONTEXT_QUEUE,  * PSCONTEXT_QUEUE;
-
-__declspec(dllimport)
-RPC_BINDING_HANDLE
-__stdcall
-NDRCContextBinding (
-     NDR_CCONTEXT     CContext
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRCContextMarshall (
-      NDR_CCONTEXT    CContext,
-     void  *pBuff
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRCContextUnmarshall (
-     NDR_CCONTEXT        *   pCContext,
-      RPC_BINDING_HANDLE      hBinding,
-      void                *   pBuff,
-      unsigned long           DataRepresentation
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRSContextMarshall (
-      NDR_SCONTEXT    CContext,
-     void          * pBuff,
-      NDR_RUNDOWN     userRunDownIn
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NDRSContextUnmarshall (
-      void          * pBuff,
-      unsigned long   DataRepresentation
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRSContextMarshallEx (
-      RPC_BINDING_HANDLE  BindingHandle,
-      NDR_SCONTEXT        CContext,
-     void              * pBuff,
-      NDR_RUNDOWN         userRunDownIn
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRSContextMarshall2 (
-      RPC_BINDING_HANDLE  BindingHandle,
-      NDR_SCONTEXT        CContext,
-     void              * pBuff,
-      NDR_RUNDOWN         userRunDownIn,
-      void              * CtxGuard,
-     unsigned long        Flags
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NDRSContextUnmarshallEx (
-      RPC_BINDING_HANDLE  BindingHandle,
-      void              * pBuff,
-      unsigned long       DataRepresentation
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NDRSContextUnmarshall2(
-      RPC_BINDING_HANDLE  BindingHandle,
-      void              * pBuff,
-      unsigned long       DataRepresentation,
-      void              * CtxGuard,
-     unsigned long        Flags
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsDestroyClientContext (
-     void  *  * ContextHandle
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long error_status_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _MIDL_STUB_MESSAGE;
-struct _MIDL_STUB_DESC;
-struct _FULL_PTR_XLAT_TABLES;
-
-typedef unsigned char  *    RPC_BUFPTR;
-typedef unsigned long       RPC_LENGTH;
-
-
-typedef void (__stdcall  * EXPR_EVAL)( struct _MIDL_STUB_MESSAGE  * );
-
-typedef const unsigned char  * PFORMAT_STRING;
-
-
-
-
-typedef struct
-    {
-    long              Dimension;
-
-    
-    unsigned long  *  BufferConformanceMark;
-    unsigned long  *  BufferVarianceMark;
-
-    
-    unsigned long  *  MaxCountArray;
-    unsigned long  *  OffsetArray;
-    unsigned long  *  ActualCountArray;
-    } ARRAY_INFO,  *PARRAY_INFO;
-
-
-typedef struct _NDR_ASYNC_MESSAGE *   PNDR_ASYNC_MESSAGE;
-typedef struct _NDR_CORRELATION_INFO *PNDR_CORRELATION_INFO;
-
-
-
-
-
-typedef struct
-    {
-    unsigned long   WireCodeset;
-    unsigned long   DesiredReceivingCodeset;
-    void           *CSArrayInfo;
-    } CS_STUB_INFO;
-
-
-
-
-
-typedef const unsigned char  * PFORMAT_STRING;
-typedef struct _MIDL_SYNTAX_INFO MIDL_SYNTAX_INFO, *PMIDL_SYNTAX_INFO;
-
-struct NDR_ALLOC_ALL_NODES_CONTEXT;
-struct NDR_POINTER_QUEUE_STATE;
-struct _NDR_PROC_CONTEXT;
-
-typedef struct _MIDL_STUB_MESSAGE
-    {
-    
-    PRPC_MESSAGE            RpcMsg;
-
-    
-    unsigned char       *   Buffer;
-
-    
-
-
-
-    unsigned char       *   BufferStart;
-    unsigned char       *   BufferEnd;
-
-    
-
-
-
-
-
-
-    unsigned char       *   BufferMark;
-
-    
-    unsigned long           BufferLength;
-
-    
-    unsigned long           MemorySize;
-
-    
-    unsigned char       *   Memory;
-
-    
-    unsigned char           IsClient;
-    unsigned char           Pad;
-    unsigned short          uFlags2;
-
-    
-    int                     ReuseBuffer;
-
-    
-    struct NDR_ALLOC_ALL_NODES_CONTEXT *pAllocAllNodesContext;
-    struct NDR_POINTER_QUEUE_STATE     *pPointerQueueState;
-
-    
-
-
-
-    
-    int                     IgnoreEmbeddedPointers;
-
-    
-
-
-
-    unsigned char       *   PointerBufferMark;
-
-    
-
-
-    unsigned char           fBufferValid;
-
-    unsigned char           uFlags;
-    unsigned short          UniquePtrCount;
-
-    
-
-
-
-    ULONG_PTR               MaxCount;
-
-    
-
-
-
-    unsigned long           Offset;
-
-    
-
-
-
-    unsigned long           ActualCount;
-
-    
-    void  *                 ( __stdcall * pfnAllocate)(size_t);
-    void                    ( __stdcall * pfnFree)(void  *);
-
-    
-
-
-
-
-
-    unsigned char       *   StackTop;
-
-    
-
-
-
-    unsigned char       *   pPresentedType;
-    unsigned char       *   pTransmitType;
-
-    
-
-
-
-
-
-
-
-    handle_t                SavedHandle;
-
-    
-
-
-    const struct _MIDL_STUB_DESC  * StubDesc;
-
-    
-
-
-    struct _FULL_PTR_XLAT_TABLES  * FullPtrXlatTables;
-    unsigned long                   FullPtrRefId;
-
-    unsigned long                   PointerLength;
-
-    int                             fInDontFree       :1;
-    int                             fDontCallFreeInst :1;
-    int                             fInOnlyParam      :1;
-    int                             fHasReturn        :1;
-    int                             fHasExtensions    :1;
-    int                             fHasNewCorrDesc   :1;
-    int                             fIsOicfServer    :1;
-    int                             fHasMemoryValidateCallback: 1;
-    int                             fUnused           :8;
-    int                             fUnused2          :16;
-
-
-    unsigned long                   dwDestContext;
-    void  *                         pvDestContext;
-
-    NDR_SCONTEXT *                  SavedContextHandles;
-
-    long                            ParamNumber;
-
-    struct IRpcChannelBuffer    *   pRpcChannelBuffer;
-
-    PARRAY_INFO                     pArrayInfo;
-    unsigned long           *       SizePtrCountArray;
-    unsigned long           *       SizePtrOffsetArray;
-    unsigned long           *       SizePtrLengthArray;
-
-    
-
-
-    void                    *       pArgQueue;
-
-    unsigned long                   dwStubPhase;
-
-    void                    *       LowStackMark;
-
-    
-
-
-    PNDR_ASYNC_MESSAGE              pAsyncMsg;
-    PNDR_CORRELATION_INFO           pCorrInfo;
-    unsigned char *                 pCorrMemory;
-
-    void *                          pMemoryList;
-
-    
-
-
-
-
-
-    
-
-
-
-    CS_STUB_INFO *                  pCSInfo;
-
-    unsigned char *                 ConformanceMark;
-    unsigned char *                 VarianceMark;
-
-
-
-
-    INT_PTR                         Unused;
-
-
-    struct _NDR_PROC_CONTEXT *      pContext;
-
-    
-
-
-
-
-    void *                             pUserMarshalList;
-    INT_PTR                         Reserved51_2;
-    INT_PTR                         Reserved51_3;
-    INT_PTR                         Reserved51_4;
-    INT_PTR                         Reserved51_5;
-
-
-    
-
-
-    } MIDL_STUB_MESSAGE,  *PMIDL_STUB_MESSAGE;
-
-
-typedef  struct _MIDL_STUB_MESSAGE MIDL_STUB_MESSAGE,   *PMIDL_STUB_MESSAGE;
-
-
-
-
-typedef void  *
-        ( __stdcall * GENERIC_BINDING_ROUTINE)
-        (void  *);
-typedef void
-        ( __stdcall * GENERIC_UNBIND_ROUTINE)
-        (void  *, unsigned char  *);
-
-typedef struct _GENERIC_BINDING_ROUTINE_PAIR
-    {
-    GENERIC_BINDING_ROUTINE     pfnBind;
-    GENERIC_UNBIND_ROUTINE      pfnUnbind;
-    } GENERIC_BINDING_ROUTINE_PAIR,  *PGENERIC_BINDING_ROUTINE_PAIR;
-
-typedef struct __GENERIC_BINDING_INFO
-    {
-    void  *            pObj;
-    unsigned int                Size;
-    GENERIC_BINDING_ROUTINE     pfnBind;
-    GENERIC_UNBIND_ROUTINE      pfnUnbind;
-    } GENERIC_BINDING_INFO,  *PGENERIC_BINDING_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void ( __stdcall * XMIT_HELPER_ROUTINE)
-    ( PMIDL_STUB_MESSAGE );
-
-typedef struct _XMIT_ROUTINE_QUINTUPLE
-    {
-    XMIT_HELPER_ROUTINE     pfnTranslateToXmit;
-    XMIT_HELPER_ROUTINE     pfnTranslateFromXmit;
-    XMIT_HELPER_ROUTINE     pfnFreeXmit;
-    XMIT_HELPER_ROUTINE     pfnFreeInst;
-    } XMIT_ROUTINE_QUINTUPLE,  *PXMIT_ROUTINE_QUINTUPLE;
-
-typedef unsigned long
-( __stdcall * USER_MARSHAL_SIZING_ROUTINE)
-    (unsigned long  *,
-     unsigned long,
-     void  * );
-
-typedef unsigned char  *
-( __stdcall * USER_MARSHAL_MARSHALLING_ROUTINE)
-    (unsigned long  *,
-     unsigned char  * ,
-     void  * );
-
-typedef unsigned char  *
-( __stdcall * USER_MARSHAL_UNMARSHALLING_ROUTINE)
-    (unsigned long  *,
-     unsigned char  *,
-     void  * );
-
-typedef void ( __stdcall * USER_MARSHAL_FREEING_ROUTINE)
-    (unsigned long  *,
-     void  * );
-
-typedef struct _USER_MARSHAL_ROUTINE_QUADRUPLE
-    {
-    USER_MARSHAL_SIZING_ROUTINE          pfnBufferSize;
-    USER_MARSHAL_MARSHALLING_ROUTINE     pfnMarshall;
-    USER_MARSHAL_UNMARSHALLING_ROUTINE   pfnUnmarshall;
-    USER_MARSHAL_FREEING_ROUTINE         pfnFree;
-    } USER_MARSHAL_ROUTINE_QUADRUPLE;
-
-
-
-typedef enum _USER_MARSHAL_CB_TYPE
-{
-    USER_MARSHAL_CB_BUFFER_SIZE,
-    USER_MARSHAL_CB_MARSHALL,
-    USER_MARSHAL_CB_UNMARSHALL,
-    USER_MARSHAL_CB_FREE
-} USER_MARSHAL_CB_TYPE;
-
-typedef struct _USER_MARSHAL_CB
-{
-    unsigned long           Flags;
-    PMIDL_STUB_MESSAGE      pStubMsg;
-    PFORMAT_STRING          pReserve;
-    unsigned long           Signature;
-    USER_MARSHAL_CB_TYPE    CBType;
-    PFORMAT_STRING          pFormat;
-    PFORMAT_STRING          pTypeFormat;
-} USER_MARSHAL_CB;
-
-
-
-
-
-
-
-
-
-typedef struct _MALLOC_FREE_STRUCT
-    {
-    void  *     ( __stdcall * pfnAllocate)(size_t);
-    void        ( __stdcall * pfnFree)(void  *);
-    } MALLOC_FREE_STRUCT;
-
-typedef struct _COMM_FAULT_OFFSETS
-    {
-    short       CommOffset;
-    short       FaultOffset;
-    } COMM_FAULT_OFFSETS;
-
-
-
-
-
-typedef enum _IDL_CS_CONVERT
-    {
-    IDL_CS_NO_CONVERT,
-    IDL_CS_IN_PLACE_CONVERT,
-    IDL_CS_NEW_BUFFER_CONVERT
-    } IDL_CS_CONVERT;
-
-typedef void
-( __stdcall * CS_TYPE_NET_SIZE_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     unsigned long          ulNetworkCodeSet,
-     unsigned long          ulLocalBufferSize,
-     IDL_CS_CONVERT     *   conversionType,
-     unsigned long      *   pulNetworkBufferSize,
-     error_status_t     *   pStatus);
-
-typedef void
-( __stdcall * CS_TYPE_LOCAL_SIZE_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     unsigned long          ulNetworkCodeSet,
-     unsigned long          ulNetworkBufferSize,
-     IDL_CS_CONVERT     *   conversionType,
-     unsigned long      *   pulLocalBufferSize,
-     error_status_t     *   pStatus);
-
-typedef void
-( __stdcall * CS_TYPE_TO_NETCS_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     unsigned long          ulNetworkCodeSet,
-     void               *   pLocalData,
-     unsigned long          ulLocalDataLength,
-     byte               *   pNetworkData,
-     unsigned long      *   pulNetworkDataLength,
-     error_status_t     *   pStatus);
-
-typedef void
-( __stdcall * CS_TYPE_FROM_NETCS_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     unsigned long          ulNetworkCodeSet,
-     byte               *   pNetworkData,
-     unsigned long          ulNetworkDataLength,
-     unsigned long          ulLocalBufferSize,
-     void               *   pLocalData,
-     unsigned long      *   pulLocalDataLength,
-     error_status_t     *   pStatus);
-
-typedef void
-( __stdcall * CS_TAG_GETTING_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     int                    fServerSide,
-     unsigned long      *   pulSendingTag,
-     unsigned long      *   pulDesiredReceivingTag,
-     unsigned long      *   pulReceivingTag,
-     error_status_t     *   pStatus);
-
-void __stdcall
-RpcCsGetTags(
-     RPC_BINDING_HANDLE     hBinding,
-     int                    fServerSide,
-     unsigned long      *   pulSendingTag,
-     unsigned long      *   pulDesiredReceivingTag,
-     unsigned long      *   pulReceivingTag,
-     error_status_t     *   pStatus);
-
-typedef struct _NDR_CS_SIZE_CONVERT_ROUTINES
-    {
-    CS_TYPE_NET_SIZE_ROUTINE    pfnNetSize;
-    CS_TYPE_TO_NETCS_ROUTINE    pfnToNetCs;
-    CS_TYPE_LOCAL_SIZE_ROUTINE  pfnLocalSize;
-    CS_TYPE_FROM_NETCS_ROUTINE  pfnFromNetCs;
-    } NDR_CS_SIZE_CONVERT_ROUTINES;
-
-typedef struct _NDR_CS_ROUTINES
-    {
-    NDR_CS_SIZE_CONVERT_ROUTINES   *pSizeConvertRoutines;
-    CS_TAG_GETTING_ROUTINE         *pTagGettingRoutines;
-    } NDR_CS_ROUTINES;
-
-
-
-
-
-typedef struct _MIDL_STUB_DESC
-    {
-    void  *    RpcInterfaceInformation;
-
-    void  *    ( __stdcall * pfnAllocate)(size_t);
-    void       ( __stdcall * pfnFree)(void  *);
-
-    union
-        {
-        handle_t  *             pAutoHandle;
-        handle_t  *             pPrimitiveHandle;
-        PGENERIC_BINDING_INFO   pGenericBindingInfo;
-        } IMPLICIT_HANDLE_INFO;
-
-    const NDR_RUNDOWN  *                    apfnNdrRundownRoutines;
-    const GENERIC_BINDING_ROUTINE_PAIR  *   aGenericBindingRoutinePairs;
-    const EXPR_EVAL  *                      apfnExprEval;
-    const XMIT_ROUTINE_QUINTUPLE  *         aXmitQuintuple;
-
-    const unsigned char  *                  pFormatTypes;
-
-    int                                     fCheckBounds;
-
-    
-    unsigned long                           Version;
-
-    MALLOC_FREE_STRUCT  *                   pMallocFreeStruct;
-
-    long                                    MIDLVersion;
-
-    const COMM_FAULT_OFFSETS  *    CommFaultOffsets;
-
-    
-    const USER_MARSHAL_ROUTINE_QUADRUPLE  * aUserMarshalQuadruple;
-
-    
-    const NDR_NOTIFY_ROUTINE  *             NotifyRoutineTable;
-
-    
-
-
-
-    ULONG_PTR                               mFlags;
-
-    
-    const NDR_CS_ROUTINES *                 CsRoutineTables;
-
-    void *                                  Reserved4;
-    ULONG_PTR                               Reserved5;
-
-    
-
-    } MIDL_STUB_DESC;
-
-
-typedef const MIDL_STUB_DESC  * PMIDL_STUB_DESC;
-
-typedef void  * PMIDL_XMIT_TYPE;
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning( disable:4200 )
-
-typedef struct _MIDL_FORMAT_STRING
-    {
-    short               Pad;
-    unsigned char       Format[];
-    } MIDL_FORMAT_STRING;
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-typedef void ( __stdcall * STUB_THUNK)( PMIDL_STUB_MESSAGE );
-
-typedef long ( __stdcall * SERVER_ROUTINE)();
-
-
-
-
-typedef struct  _MIDL_SERVER_INFO_
-    {
-    PMIDL_STUB_DESC                     pStubDesc;
-    const SERVER_ROUTINE     *          DispatchTable;
-    PFORMAT_STRING                      ProcString;
-    const unsigned short *              FmtStringOffset;
-    const STUB_THUNK *                  ThunkTable;
-    PRPC_SYNTAX_IDENTIFIER              pTransferSyntax;
-    ULONG_PTR                           nCount;
-    PMIDL_SYNTAX_INFO                   pSyntaxInfo;
-    } MIDL_SERVER_INFO, *PMIDL_SERVER_INFO;
-
-
-
-
-
-
-typedef struct _MIDL_STUBLESS_PROXY_INFO
-    {
-    PMIDL_STUB_DESC                     pStubDesc;
-    PFORMAT_STRING                      ProcFormatString;
-    const unsigned short            *   FormatStringOffset;
-    PRPC_SYNTAX_IDENTIFIER              pTransferSyntax;
-    ULONG_PTR                           nCount;
-    PMIDL_SYNTAX_INFO                   pSyntaxInfo;
-    } MIDL_STUBLESS_PROXY_INFO;
-
-typedef MIDL_STUBLESS_PROXY_INFO  * PMIDL_STUBLESS_PROXY_INFO;
-
-
-
-
-typedef struct _MIDL_SYNTAX_INFO
-{
-RPC_SYNTAX_IDENTIFIER               TransferSyntax;
-RPC_DISPATCH_TABLE *                DispatchTable;
-PFORMAT_STRING                      ProcString;
-const unsigned short *              FmtStringOffset;
-PFORMAT_STRING                      TypeString;
-const void           *              aUserMarshalQuadruple;
-ULONG_PTR                           pReserved1;
-ULONG_PTR                           pReserved2;
-} MIDL_SYNTAX_INFO, *PMIDL_SYNTAX_INFO;
-
-typedef unsigned short * PARAM_OFFSETTABLE, *PPARAM_OFFSETTABLE;
-
-
-
-
-typedef union _CLIENT_CALL_RETURN
-    {
-    void  *         Pointer;
-    LONG_PTR        Simple;
-    } CLIENT_CALL_RETURN;
-
-
-
-
-
-typedef enum
-        {
-        XLAT_SERVER = 1,
-        XLAT_CLIENT
-        } XLAT_SIDE;
-
-
-
-
-
-typedef struct _FULL_PTR_TO_REFID_ELEMENT
-    {
-    struct _FULL_PTR_TO_REFID_ELEMENT  *  Next;
-
-    void  *             Pointer;
-    unsigned long       RefId;
-    unsigned char       State;
-    } FULL_PTR_TO_REFID_ELEMENT,  *PFULL_PTR_TO_REFID_ELEMENT;
-
-
-
-
-typedef struct _FULL_PTR_XLAT_TABLES
-    {
-    
-
-
-    struct
-        {
-        void  * *           XlatTable;
-        unsigned char  *    StateTable;
-        unsigned long       NumberOfEntries;
-        } RefIdToPointer;
-
-    
-
-
-    struct
-        {
-        PFULL_PTR_TO_REFID_ELEMENT  *   XlatTable;
-        unsigned long                   NumberOfBuckets;
-        unsigned long                   HashMask;
-        } PointerToRefId;
-
-    
-
-
-    unsigned long           NextRefId;
-
-    
-
-
-
-
-
-
-    XLAT_SIDE               XlatSide;
-    } FULL_PTR_XLAT_TABLES,  *PFULL_PTR_XLAT_TABLES;
-
-
-
-
-
-RPC_STATUS __stdcall
-NdrClientGetSupportedSyntaxes(
-     RPC_CLIENT_INTERFACE * pInf,
-     unsigned long       * pCount,
-     MIDL_SYNTAX_INFO   ** pArr );
-
-
-RPC_STATUS __stdcall
-NdrServerGetSupportedSyntaxes(
-     RPC_SERVER_INTERFACE * pInf,
-     unsigned long       * pCount,
-     MIDL_SYNTAX_INFO   ** pArr,
-     unsigned long       * pPreferSyntaxIndex);
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSimpleTypeMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    unsigned char           FormatChar
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrPointerMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrCsArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrCsTagMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrSimpleStructMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantStructMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantVaryingStructMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrComplexStructMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrFixedArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantVaryingArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrVaryingArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrComplexArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNonConformantStringMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantStringMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrEncapsulatedUnionMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNonEncapsulatedUnionMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrByteCountPointerMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrXmitOrRepAsMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrUserMarshalMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrInterfacePointerMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClientContextMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    NDR_CCONTEXT            ContextHandle,
-    int                     fCheck
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerContextMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    NDR_SCONTEXT            ContextHandle,
-    NDR_RUNDOWN             RundownRoutine
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerContextNewMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    NDR_SCONTEXT            ContextHandle,
-    NDR_RUNDOWN             RundownRoutine,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSimpleTypeUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    unsigned char           FormatChar
-    );
-
-__declspec(dllimport)
-unsigned char * __stdcall
-__stdcall
-NdrCsArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char **        ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char * __stdcall
-__stdcall
-NdrCsTagUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char **        ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char * __stdcall
-NdrRangeUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char **        ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCorrelationInitialize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    void  *                 pMemory,
-    unsigned long           CacheSize,
-    unsigned long           flags
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCorrelationPass(
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCorrelationFree(
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrPointerUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrSimpleStructUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantStructUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantVaryingStructUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrComplexStructUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrFixedArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantVaryingArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrVaryingArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrComplexArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNonConformantStringUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantStringUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrEncapsulatedUnionUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNonEncapsulatedUnionUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrByteCountPointerUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrXmitOrRepAsUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrUserMarshalUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrInterfacePointerUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClientContextUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    NDR_CCONTEXT        *   pContextHandle,
-    RPC_BINDING_HANDLE      BindHandle
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NdrServerContextUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NdrContextHandleInitialize(
-      PMIDL_STUB_MESSAGE  pStubMsg,
-      PFORMAT_STRING      pFormat
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NdrServerContextNewUnmarshall(
-      PMIDL_STUB_MESSAGE  pStubMsg,
-      PFORMAT_STRING      pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPointerBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCsArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCsTagBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSimpleStructBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantStructBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantVaryingStructBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrComplexStructBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFixedArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantVaryingArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrVaryingArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrComplexArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantStringBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrNonConformantStringBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrEncapsulatedUnionBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrNonEncapsulatedUnionBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrByteCountPointerBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrXmitOrRepAsBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrUserMarshalBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrInterfacePointerBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrContextHandleSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrPointerMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrCsArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrCsTagMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrSimpleStructMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantStructMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantVaryingStructMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrComplexStructMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrFixedArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantVaryingArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrVaryingArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrComplexArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantStringMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrNonConformantStringMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrEncapsulatedUnionMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrNonEncapsulatedUnionMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrXmitOrRepAsMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrUserMarshalMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrInterfacePointerMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPointerFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCsArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSimpleStructFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantStructFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantVaryingStructFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrComplexStructFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFixedArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantVaryingArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrVaryingArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrComplexArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrEncapsulatedUnionFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrNonEncapsulatedUnionFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrByteCountPointerFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrXmitOrRepAsFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrUserMarshalFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrInterfacePointerFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConvert2(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat,
-    long                    NumberParams
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConvert(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrUserMarshalSimpleTypeConvert(
-    unsigned long *         pFlags,
-    unsigned char *         pBuffer,
-    unsigned char           FormatChar
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClientInitializeNew(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor,
-    unsigned int            ProcNum
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrServerInitializeNew(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerInitializePartial(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor,
-    unsigned long           RequestedBufferSize
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClientInitialize(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor,
-    unsigned int            ProcNum
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrServerInitialize(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrServerInitializeUnmarshall (
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PRPC_MESSAGE            pRpcMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerInitializeMarshall (
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrGetBuffer(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned long           BufferLength,
-    RPC_BINDING_HANDLE      Handle
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNsGetBuffer(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned long           BufferLength,
-    RPC_BINDING_HANDLE      Handle
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrSendReceive(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char *         pBufferEnd
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNsSendReceive(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pBufferEnd,
-    RPC_BINDING_HANDLE  *   pAutoHandle
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFreeBuffer(
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-NdrGetDcomProtocolVersion(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    RPC_VERSION *           pVersion );
-
-
-
-
-
-
-
-
-CLIENT_CALL_RETURN __cdecl
-NdrClientCall2(
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PFORMAT_STRING          pFormat,
-    ...
-    );
-
-
-
-extern "C"
-
-void * _AddressOfReturnAddress(void);
-
-
-
-CLIENT_CALL_RETURN __cdecl
-NdrClientCall(
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PFORMAT_STRING          pFormat,
-    ...
-    );
-
-CLIENT_CALL_RETURN __cdecl
-NdrAsyncClientCall(
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PFORMAT_STRING          pFormat,
-    ...
-    );
-
-CLIENT_CALL_RETURN __cdecl
-NdrDcomAsyncClientCall(
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PFORMAT_STRING          pFormat,
-    ...
-    );
-
-
-typedef enum {
-    STUB_UNMARSHAL,
-    STUB_CALL_SERVER,
-    STUB_MARSHAL,
-    STUB_CALL_SERVER_NO_HRESULT
-}STUB_PHASE;
-
-typedef enum {
-    PROXY_CALCSIZE,
-    PROXY_GETBUFFER,
-    PROXY_MARSHAL,
-    PROXY_SENDRECEIVE,
-    PROXY_UNMARSHAL
-}PROXY_PHASE;
-
-struct IRpcStubBuffer;      
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrAsyncServerCall(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-
-__declspec(dllimport)
-long
-__stdcall
-NdrAsyncStubCall(
-    struct IRpcStubBuffer *     pThis,
-    struct IRpcChannelBuffer *  pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long *             pdwStubPhase
-    );
-
-
-__declspec(dllimport)
-long
-__stdcall
-NdrDcomAsyncStubCall(
-    struct IRpcStubBuffer    *  pThis,
-    struct IRpcChannelBuffer *  pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long            *  pdwStubPhase
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-NdrStubCall2(
-    struct IRpcStubBuffer  *    pThis,
-    struct IRpcChannelBuffer  * pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long  *            pdwStubPhase
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCall2(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-NdrStubCall (
-    struct IRpcStubBuffer  *    pThis,
-    struct IRpcChannelBuffer  * pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long  *            pdwStubPhase
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCall(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrServerUnmarshall(
-    struct IRpcChannelBuffer  * pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    PMIDL_STUB_DESC             pStubDescriptor,
-    PFORMAT_STRING              pFormat,
-    void  *                     pParamList
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerMarshall(
-    struct IRpcStubBuffer  *    pThis,
-    struct IRpcChannelBuffer  * pChannel,
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    PFORMAT_STRING              pFormat
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-NdrMapCommAndFaultStatus(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned long  *            pCommStatus,
-    unsigned long  *            pFaultStatus,
-    RPC_STATUS                  Status
-    );
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_UPDecision(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    RPC_BUFPTR                  pBuffer
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_TLUPDecision(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_TLUPDecisionBuffer(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_IfAlloc(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_IfAllocRef(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_IfAllocSet(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-RPC_BUFPTR
-__stdcall
-NdrSH_IfCopy(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-RPC_BUFPTR
-__stdcall
-NdrSH_IfAllocCopy(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrSH_Copy(
-    unsigned char            *  pStubMsg,
-    unsigned char            *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSH_IfFree(
-    PMIDL_STUB_MESSAGE          pMessage,
-    unsigned char            *  pPtr );
-
-
-__declspec(dllimport)
-RPC_BUFPTR
-__stdcall
-NdrSH_StringMarshall(
-    PMIDL_STUB_MESSAGE          pMessage,
-    unsigned char            *  pMemory,
-    unsigned long               Count,
-    int                         Size );
-
-__declspec(dllimport)
-RPC_BUFPTR
-__stdcall
-NdrSH_StringUnMarshall(
-    PMIDL_STUB_MESSAGE          pMessage,
-    unsigned char          * *  pMemory,
-    int                         Size );
-
-
-
-
-
-typedef void  * RPC_SS_THREAD_HANDLE;
-
-typedef void  * __stdcall
-RPC_CLIENT_ALLOC (
-     size_t Size
-    );
-
-typedef void __stdcall
-RPC_CLIENT_FREE (
-     void  * Ptr
-    );
-
-
-
-
-
-__declspec(dllimport)
-void  *
-__stdcall
-RpcSsAllocate (
-     size_t Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsDisableAllocate (
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsEnableAllocate (
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsFree (
-     void  * NodeToFree
-    );
-
-__declspec(dllimport)
-RPC_SS_THREAD_HANDLE
-__stdcall
-RpcSsGetThreadHandle (
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsSetClientAllocFree (
-     RPC_CLIENT_ALLOC  * ClientAlloc,
-     RPC_CLIENT_FREE   * ClientFree
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsSetThreadHandle (
-     RPC_SS_THREAD_HANDLE Id
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsSwapClientAllocFree (
-     RPC_CLIENT_ALLOC     * ClientAlloc,
-     RPC_CLIENT_FREE      * ClientFree,
-     RPC_CLIENT_ALLOC *  * OldClientAlloc,
-     RPC_CLIENT_FREE  *  * OldClientFree
-    );
-
-
-
-
-
-__declspec(dllimport)
-void  *
-__stdcall
-RpcSmAllocate (
-      size_t          Size,
-     RPC_STATUS  *   pStatus
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmClientFree (
-      void        *   pNodeToFree
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmDestroyClientContext (
-     void         * * ContextHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmDisableAllocate (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmEnableAllocate (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmFree (
-     void         *   NodeToFree
-    );
-
-__declspec(dllimport)
-RPC_SS_THREAD_HANDLE
-__stdcall
-RpcSmGetThreadHandle (
-     RPC_STATUS  *   pStatus
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmSetClientAllocFree (
-     RPC_CLIENT_ALLOC * ClientAlloc,
-     RPC_CLIENT_FREE  * ClientFree
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmSetThreadHandle (
-     RPC_SS_THREAD_HANDLE Id
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmSwapClientAllocFree (
-     RPC_CLIENT_ALLOC     *   ClientAlloc,
-     RPC_CLIENT_FREE      *   ClientFree,
-     RPC_CLIENT_ALLOC    * * OldClientAlloc,
-     RPC_CLIENT_FREE     * * OldClientFree
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSsEnableAllocate(
-    PMIDL_STUB_MESSAGE      pMessage );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSsDisableAllocate(
-    PMIDL_STUB_MESSAGE      pMessage );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSmSetClientToOsf(
-    PMIDL_STUB_MESSAGE      pMessage );
-
-__declspec(dllimport)
-void  *
-__stdcall
-NdrRpcSmClientAllocate (
-     size_t Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSmClientFree (
-     void  * NodeToFree
-    );
-
-__declspec(dllimport)
-void  *
-__stdcall
-NdrRpcSsDefaultAllocate (
-     size_t Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSsDefaultFree (
-     void  * NodeToFree
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PFULL_PTR_XLAT_TABLES
-__stdcall
-NdrFullPointerXlatInit(
-    unsigned long           NumberOfPointers,
-    XLAT_SIDE               XlatSide
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFullPointerXlatFree(
-    PFULL_PTR_XLAT_TABLES   pXlatTables
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrFullPointerQueryPointer(
-    PFULL_PTR_XLAT_TABLES   pXlatTables,
-    void  *                 pPointer,
-    unsigned char           QueryType,
-    unsigned long  *        pRefId
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrFullPointerQueryRefId(
-    PFULL_PTR_XLAT_TABLES   pXlatTables,
-    unsigned long           RefId,
-    unsigned char           QueryType,
-    void  * *               ppPointer
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFullPointerInsertRefId(
-    PFULL_PTR_XLAT_TABLES   pXlatTables,
-    unsigned long           RefId,
-    void  *                 pPointer
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrFullPointerFree(
-    PFULL_PTR_XLAT_TABLES   pXlatTables,
-    void  *                 Pointer
-    );
-
-__declspec(dllimport)
-void  *
-__stdcall
-NdrAllocate(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    size_t                  Len
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClearOutParameters(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat,
-    void  *                 ArgAddr
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void  *
-__stdcall
-NdrOleAllocate (
-     size_t Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrOleFree (
-     void  * NodeToFree
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _NDR_USER_MARSHAL_INFO_LEVEL1
-{
-    void *                      Buffer;
-    unsigned long               BufferSize;
-    void *(__stdcall * pfnAllocate)(size_t);
-    void (__stdcall * pfnFree)(void *);
-    struct IRpcChannelBuffer *  pRpcChannelBuffer;
-    ULONG_PTR                   Reserved[5];
-} NDR_USER_MARSHAL_INFO_LEVEL1;
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)
-
-
-typedef struct _NDR_USER_MARSHAL_INFO
-{
-    unsigned long InformationLevel;
-    union {
-        NDR_USER_MARSHAL_INFO_LEVEL1 Level1;
-    };
-} NDR_USER_MARSHAL_INFO;
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-RPC_STATUS
-__stdcall
-NdrGetUserMarshalInfo (
-     unsigned long        *   pFlags,
-     unsigned long            InformationLevel,
-     NDR_USER_MARSHAL_INFO * pMarshalInfo
-    );
-
-
-
-
-RPC_STATUS __stdcall
-NdrCreateServerInterfaceFromStub(
-             struct IRpcStubBuffer* pStub,
-              RPC_SERVER_INTERFACE *pServerIf );
-
-
-
-
-CLIENT_CALL_RETURN __cdecl
-NdrClientCall3(
-    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
-    unsigned long               nProcNum,
-    void *                      pReturnValue,
-    ...
-    );
-
-CLIENT_CALL_RETURN __cdecl
-Ndr64AsyncClientCall(
-    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
-    unsigned long               nProcNum,
-    void *                      pReturnValue,
-    ...
-    );
-
-CLIENT_CALL_RETURN __cdecl
-Ndr64DcomAsyncClientCall(
-    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
-    unsigned long               nProcNum,
-    void *                      pReturnValue,
-    ...
-    );
-
-struct IRpcStubBuffer;      
-
-__declspec(dllimport)
-void
-__stdcall
-Ndr64AsyncServerCall(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-Ndr64AsyncServerCall64(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-Ndr64AsyncServerCallAll(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-Ndr64AsyncStubCall(
-    struct IRpcStubBuffer *     pThis,
-    struct IRpcChannelBuffer *  pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long *             pdwStubPhase
-    );
-
-
-__declspec(dllimport)
-long
-__stdcall
-Ndr64DcomAsyncStubCall(
-    struct IRpcStubBuffer    *  pThis,
-    struct IRpcChannelBuffer *  pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long            *  pdwStubPhase
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-NdrStubCall3 (
-    struct IRpcStubBuffer  *    pThis,
-    struct IRpcChannelBuffer  * pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long  *            pdwStubPhase
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCallAll(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCallNdr64(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCall3(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPartialIgnoreClientMarshall(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    void *                      pMemory
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPartialIgnoreServerUnmarshall(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    void **                     ppMemory
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPartialIgnoreClientBufferSize(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    void *                      pMemory
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPartialIgnoreServerInitialize(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    void **                     ppMemory,
-    PFORMAT_STRING              pFormat
-    );
-
-
-void __stdcall
-RpcUserFree( handle_t AsyncHandle, void * pBuffer );
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_wtypes_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_wtypes_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef struct tagRemHGLOBAL
-    {
-    long fNullHGlobal;
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHGLOBAL;
-
-typedef struct tagRemHMETAFILEPICT
-    {
-    long mm;
-    long xExt;
-    long yExt;
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHMETAFILEPICT;
-
-typedef struct tagRemHENHMETAFILE
-    {
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHENHMETAFILE;
-
-typedef struct tagRemHBITMAP
-    {
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHBITMAP;
-
-typedef struct tagRemHPALETTE
-    {
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHPALETTE;
-
-typedef struct tagRemBRUSH
-    {
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHBRUSH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef WCHAR OLECHAR;
-
-typedef  OLECHAR *LPOLESTR;
-
-typedef  const OLECHAR *LPCOLESTR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned char UCHAR;
-
-typedef short SHORT;
-
-typedef unsigned short USHORT;
-
-typedef DWORD ULONG;
-
-typedef double DOUBLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _COAUTHIDENTITY
-    {
-     USHORT *User;
-     ULONG UserLength;
-     USHORT *Domain;
-     ULONG DomainLength;
-     USHORT *Password;
-     ULONG PasswordLength;
-    ULONG Flags;
-    } 	COAUTHIDENTITY;
-
-typedef struct _COAUTHINFO
-    {
-    DWORD dwAuthnSvc;
-    DWORD dwAuthzSvc;
-    LPWSTR pwszServerPrincName;
-    DWORD dwAuthnLevel;
-    DWORD dwImpersonationLevel;
-    COAUTHIDENTITY *pAuthIdentityData;
-    DWORD dwCapabilities;
-    } 	COAUTHINFO;
-
-typedef LONG SCODE;
-
-
-
-
-
-
-typedef SCODE *PSCODE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagMEMCTX
-    {	MEMCTX_TASK	= 1,
-	MEMCTX_SHARED	= 2,
-	MEMCTX_MACSYSTEM	= 3,
-	MEMCTX_UNKNOWN	= -1,
-	MEMCTX_SAME	= -2
-    } 	MEMCTX;
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagCLSCTX
-    {	CLSCTX_INPROC_SERVER	= 0x1,
-	CLSCTX_INPROC_HANDLER	= 0x2,
-	CLSCTX_LOCAL_SERVER	= 0x4,
-	CLSCTX_INPROC_SERVER16	= 0x8,
-	CLSCTX_REMOTE_SERVER	= 0x10,
-	CLSCTX_INPROC_HANDLER16	= 0x20,
-	CLSCTX_RESERVED1	= 0x40,
-	CLSCTX_RESERVED2	= 0x80,
-	CLSCTX_RESERVED3	= 0x100,
-	CLSCTX_RESERVED4	= 0x200,
-	CLSCTX_NO_CODE_DOWNLOAD	= 0x400,
-	CLSCTX_RESERVED5	= 0x800,
-	CLSCTX_NO_CUSTOM_MARSHAL	= 0x1000,
-	CLSCTX_ENABLE_CODE_DOWNLOAD	= 0x2000,
-	CLSCTX_NO_FAILURE_LOG	= 0x4000,
-	CLSCTX_DISABLE_AAA	= 0x8000,
-	CLSCTX_ENABLE_AAA	= 0x10000,
-	CLSCTX_FROM_DEFAULT_CONTEXT	= 0x20000,
-	CLSCTX_ACTIVATE_32_BIT_SERVER	= 0x40000,
-	CLSCTX_ACTIVATE_64_BIT_SERVER	= 0x80000
-    } 	CLSCTX;
-
-typedef 
-enum tagMSHLFLAGS
-    {	MSHLFLAGS_NORMAL	= 0,
-	MSHLFLAGS_TABLESTRONG	= 1,
-	MSHLFLAGS_TABLEWEAK	= 2,
-	MSHLFLAGS_NOPING	= 4,
-	MSHLFLAGS_RESERVED1	= 8,
-	MSHLFLAGS_RESERVED2	= 16,
-	MSHLFLAGS_RESERVED3	= 32,
-	MSHLFLAGS_RESERVED4	= 64
-    } 	MSHLFLAGS;
-
-typedef 
-enum tagMSHCTX
-    {	MSHCTX_LOCAL	= 0,
-	MSHCTX_NOSHAREDMEM	= 1,
-	MSHCTX_DIFFERENTMACHINE	= 2,
-	MSHCTX_INPROC	= 3,
-	MSHCTX_CROSSCTX	= 4
-    } 	MSHCTX;
-
-typedef 
-enum tagDVASPECT
-    {	DVASPECT_CONTENT	= 1,
-	DVASPECT_THUMBNAIL	= 2,
-	DVASPECT_ICON	= 4,
-	DVASPECT_DOCPRINT	= 8
-    } 	DVASPECT;
-
-typedef 
-enum tagSTGC
-    {	STGC_DEFAULT	= 0,
-	STGC_OVERWRITE	= 1,
-	STGC_ONLYIFCURRENT	= 2,
-	STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE	= 4,
-	STGC_CONSOLIDATE	= 8
-    } 	STGC;
-
-typedef 
-enum tagSTGMOVE
-    {	STGMOVE_MOVE	= 0,
-	STGMOVE_COPY	= 1,
-	STGMOVE_SHALLOWCOPY	= 2
-    } 	STGMOVE;
-
-typedef 
-enum tagSTATFLAG
-    {	STATFLAG_DEFAULT	= 0,
-	STATFLAG_NONAME	= 1,
-	STATFLAG_NOOPEN	= 2
-    } 	STATFLAG;
-
-typedef  void *HCONTEXT;
-
-
-
-typedef DWORD LCID;
-
-
-
-
-typedef USHORT LANGID;
-
-
-typedef struct _BYTE_BLOB
-    {
-    unsigned long clSize;
-     byte abData[ 1 ];
-    } 	BYTE_BLOB;
-
-typedef  BYTE_BLOB *UP_BYTE_BLOB;
-
-typedef struct _WORD_BLOB
-    {
-    unsigned long clSize;
-     unsigned short asData[ 1 ];
-    } 	WORD_BLOB;
-
-typedef  WORD_BLOB *UP_WORD_BLOB;
-
-typedef struct _DWORD_BLOB
-    {
-    unsigned long clSize;
-     unsigned long alData[ 1 ];
-    } 	DWORD_BLOB;
-
-typedef  DWORD_BLOB *UP_DWORD_BLOB;
-
-typedef struct _FLAGGED_BYTE_BLOB
-    {
-    unsigned long fFlags;
-    unsigned long clSize;
-     byte abData[ 1 ];
-    } 	FLAGGED_BYTE_BLOB;
-
-typedef  FLAGGED_BYTE_BLOB *UP_FLAGGED_BYTE_BLOB;
-
-typedef struct _FLAGGED_WORD_BLOB
-    {
-    unsigned long fFlags;
-    unsigned long clSize;
-     unsigned short asData[ 1 ];
-    } 	FLAGGED_WORD_BLOB;
-
-typedef  FLAGGED_WORD_BLOB *UP_FLAGGED_WORD_BLOB;
-
-typedef struct _BYTE_SIZEDARR
-    {
-    unsigned long clSize;
-     byte *pData;
-    } 	BYTE_SIZEDARR;
-
-typedef struct _SHORT_SIZEDARR
-    {
-    unsigned long clSize;
-     unsigned short *pData;
-    } 	WORD_SIZEDARR;
-
-typedef struct _LONG_SIZEDARR
-    {
-    unsigned long clSize;
-     unsigned long *pData;
-    } 	DWORD_SIZEDARR;
-
-typedef struct _HYPER_SIZEDARR
-    {
-    unsigned long clSize;
-     __int64 *pData;
-    } 	HYPER_SIZEDARR;
-
-
-
-
-
-
-
-typedef struct _userCLIPFORMAT
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0001
-        {
-         DWORD dwValue;
-         wchar_t *pwszName;
-        } 	u;
-    } 	userCLIPFORMAT;
-
-typedef  userCLIPFORMAT *wireCLIPFORMAT;
-
-typedef  WORD CLIPFORMAT;
-
-typedef struct _GDI_NONREMOTE
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0002
-        {
-         long hInproc;
-         DWORD_BLOB *hRemote;
-        } 	u;
-    } 	GDI_NONREMOTE;
-
-typedef struct _userHGLOBAL
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0003
-        {
-         long hInproc;
-         FLAGGED_BYTE_BLOB *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHGLOBAL;
-
-typedef  userHGLOBAL *wireHGLOBAL;
-
-typedef struct _userHMETAFILE
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0004
-        {
-         long hInproc;
-         BYTE_BLOB *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHMETAFILE;
-
-typedef struct _remoteMETAFILEPICT
-    {
-    long mm;
-    long xExt;
-    long yExt;
-    userHMETAFILE *hMF;
-    } 	remoteMETAFILEPICT;
-
-typedef struct _userHMETAFILEPICT
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0005
-        {
-         long hInproc;
-         remoteMETAFILEPICT *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHMETAFILEPICT;
-
-typedef struct _userHENHMETAFILE
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0006
-        {
-         long hInproc;
-         BYTE_BLOB *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHENHMETAFILE;
-
-typedef struct _userBITMAP
-    {
-    LONG bmType;
-    LONG bmWidth;
-    LONG bmHeight;
-    LONG bmWidthBytes;
-    WORD bmPlanes;
-    WORD bmBitsPixel;
-    ULONG cbSize;
-     byte pBuffer[ 1 ];
-    } 	userBITMAP;
-
-typedef struct _userHBITMAP
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0007
-        {
-         long hInproc;
-         userBITMAP *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHBITMAP;
-
-typedef struct _userHPALETTE
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0008
-        {
-         long hInproc;
-         LOGPALETTE *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHPALETTE;
-
-typedef struct _RemotableHandle
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0009
-        {
-         long hInproc;
-         long hRemote;
-        } 	u;
-    } 	RemotableHandle;
-
-typedef  RemotableHandle *wireHWND;
-
-typedef  RemotableHandle *wireHMENU;
-
-typedef  RemotableHandle *wireHACCEL;
-
-typedef  RemotableHandle *wireHBRUSH;
-
-typedef  RemotableHandle *wireHFONT;
-
-typedef  RemotableHandle *wireHDC;
-
-typedef  RemotableHandle *wireHICON;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  userHBITMAP *wireHBITMAP;
-
-typedef  userHPALETTE *wireHPALETTE;
-
-typedef  userHENHMETAFILE *wireHENHMETAFILE;
-
-typedef  userHMETAFILE *wireHMETAFILE;
-
-typedef  userHMETAFILEPICT *wireHMETAFILEPICT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  void *HMETAFILEPICT;
-
-
-
-extern RPC_IF_HANDLE IWinTypes_v0_1_c_ifspec;
-extern RPC_IF_HANDLE IWinTypes_v0_1_s_ifspec;
-
-
-
- 
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)
-
-typedef double DATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef union tagCY {
-    struct {
-
-
-
-
-        unsigned long Lo;
-        long      Hi;
-
-    };
-    LONGLONG int64;
-} CY;
-
-
-typedef CY *LPCY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDEC {
-    USHORT wReserved;
-    union {
-        struct {
-            BYTE scale;
-            BYTE sign;
-        };
-        USHORT signscale;
-    };
-    ULONG Hi32;
-    union {
-        struct {
-
-
-
-
-            ULONG Lo32;
-            ULONG Mid32;
-
-        };
-        ULONGLONG Lo64;
-    };
-} DECIMAL;
-
-
-
-
-typedef DECIMAL *LPDECIMAL;
-
-
-
-#pragma warning(pop)
-
-
-
-
-typedef  FLAGGED_WORD_BLOB *wireBSTR;
-
-typedef  OLECHAR *BSTR;
-
-typedef BSTR *LPBSTR;
-
-
-typedef short VARIANT_BOOL;
-
-
-
-
-
-
-
-
-
-typedef boolean BOOLEAN;
-
-
-
-
-
-
-typedef struct tagBSTRBLOB
-    {
-    ULONG cbSize;
-     BYTE *pData;
-    } 	BSTRBLOB;
-
-typedef struct tagBSTRBLOB *LPBSTRBLOB;
-
-
-
-
-
-
-
-
-typedef struct tagBLOB
-    {
-    ULONG cbSize;
-     BYTE *pBlobData;
-    } 	BLOB;
-
-typedef struct tagBLOB *LPBLOB;
-
-
-typedef struct tagCLIPDATA
-    {
-    ULONG cbSize;
-    long ulClipFmt;
-     BYTE *pClipData;
-    } 	CLIPDATA;
-
-
-
-typedef unsigned short VARTYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-enum VARENUM
-    {	VT_EMPTY	= 0,
-	VT_NULL	= 1,
-	VT_I2	= 2,
-	VT_I4	= 3,
-	VT_R4	= 4,
-	VT_R8	= 5,
-	VT_CY	= 6,
-	VT_DATE	= 7,
-	VT_BSTR	= 8,
-	VT_DISPATCH	= 9,
-	VT_ERROR	= 10,
-	VT_BOOL	= 11,
-	VT_VARIANT	= 12,
-	VT_UNKNOWN	= 13,
-	VT_DECIMAL	= 14,
-	VT_I1	= 16,
-	VT_UI1	= 17,
-	VT_UI2	= 18,
-	VT_UI4	= 19,
-	VT_I8	= 20,
-	VT_UI8	= 21,
-	VT_INT	= 22,
-	VT_UINT	= 23,
-	VT_VOID	= 24,
-	VT_HRESULT	= 25,
-	VT_PTR	= 26,
-	VT_SAFEARRAY	= 27,
-	VT_CARRAY	= 28,
-	VT_USERDEFINED	= 29,
-	VT_LPSTR	= 30,
-	VT_LPWSTR	= 31,
-	VT_RECORD	= 36,
-	VT_INT_PTR	= 37,
-	VT_UINT_PTR	= 38,
-	VT_FILETIME	= 64,
-	VT_BLOB	= 65,
-	VT_STREAM	= 66,
-	VT_STORAGE	= 67,
-	VT_STREAMED_OBJECT	= 68,
-	VT_STORED_OBJECT	= 69,
-	VT_BLOB_OBJECT	= 70,
-	VT_CF	= 71,
-	VT_CLSID	= 72,
-	VT_VERSIONED_STREAM	= 73,
-	VT_BSTR_BLOB	= 0xfff,
-	VT_VECTOR	= 0x1000,
-	VT_ARRAY	= 0x2000,
-	VT_BYREF	= 0x4000,
-	VT_RESERVED	= 0x8000,
-	VT_ILLEGAL	= 0xffff,
-	VT_ILLEGALMASKED	= 0xfff,
-	VT_TYPEMASK	= 0xfff
-    } ;
-typedef ULONG PROPID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCSPLATFORM
-    {
-    DWORD dwPlatformId;
-    DWORD dwVersionHi;
-    DWORD dwVersionLo;
-    DWORD dwProcessorArch;
-    } 	CSPLATFORM;
-
-typedef struct tagQUERYCONTEXT
-    {
-    DWORD dwContext;
-    CSPLATFORM Platform;
-    LCID Locale;
-    DWORD dwVersionHi;
-    DWORD dwVersionLo;
-    } 	QUERYCONTEXT;
-
-typedef  
-enum tagTYSPEC
-    {	TYSPEC_CLSID	= 0,
-	TYSPEC_FILEEXT	= TYSPEC_CLSID + 1,
-	TYSPEC_MIMETYPE	= TYSPEC_FILEEXT + 1,
-	TYSPEC_FILENAME	= TYSPEC_MIMETYPE + 1,
-	TYSPEC_PROGID	= TYSPEC_FILENAME + 1,
-	TYSPEC_PACKAGENAME	= TYSPEC_PROGID + 1,
-	TYSPEC_OBJECTID	= TYSPEC_PACKAGENAME + 1
-    } 	TYSPEC;
-
-typedef  struct __MIDL___MIDL_itf_wtypes_0003_0001
-    {
-    DWORD tyspec;
-      union __MIDL___MIDL_itf_wtypes_0003_0005
-        {
-         CLSID clsid;
-         LPOLESTR pFileExt;
-         LPOLESTR pMimeType;
-         LPOLESTR pProgId;
-         LPOLESTR pFileName;
-         struct 
-            {
-            LPOLESTR pPackageName;
-            GUID PolicyId;
-            } 	ByName;
-         struct 
-            {
-            GUID ObjectId;
-            GUID PolicyId;
-            } 	ByObjectId;
-        } 	tagged_union;
-    } 	uCLSSPEC;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_wtypes_0003_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_wtypes_0003_v0_0_s_ifspec;
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const GUID  GUID_DEVINTERFACE_DISK;
-extern "C" const GUID  GUID_DEVINTERFACE_CDROM;
-extern "C" const GUID  GUID_DEVINTERFACE_PARTITION;
-extern "C" const GUID  GUID_DEVINTERFACE_TAPE;
-extern "C" const GUID  GUID_DEVINTERFACE_WRITEONCEDISK;
-extern "C" const GUID  GUID_DEVINTERFACE_VOLUME;
-extern "C" const GUID  GUID_DEVINTERFACE_MEDIUMCHANGER;
-extern "C" const GUID  GUID_DEVINTERFACE_FLOPPY;
-extern "C" const GUID  GUID_DEVINTERFACE_CDCHANGER;
-extern "C" const GUID  GUID_DEVINTERFACE_STORAGEPORT;
-extern "C" const GUID  GUID_DEVINTERFACE_COMPORT;
-extern "C" const GUID  GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _STORAGE_HOTPLUG_INFO {
-    DWORD Size; 
-    BOOLEAN MediaRemovable; 
-    BOOLEAN MediaHotplug;   
-    BOOLEAN DeviceHotplug;  
-    BOOLEAN WriteCacheEnableOverride; 
-} STORAGE_HOTPLUG_INFO, *PSTORAGE_HOTPLUG_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _STORAGE_DEVICE_NUMBER {
-
-    
-    
-    
-
-    DWORD DeviceType;
-
-    
-    
-    
-
-    DWORD       DeviceNumber;
-
-    
-    
-    
-    
-
-    DWORD       PartitionNumber;
-} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;
-
-
-
-
-
-typedef struct _STORAGE_BUS_RESET_REQUEST {
-    BYTE  PathId;
-} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;
-
-
-
-
-
-typedef struct STORAGE_BREAK_RESERVATION_REQUEST {
-        DWORD Length;
-        BYTE  _unused;
-    BYTE  PathId;
-    BYTE  TargetId;
-    BYTE  Lun;
-} STORAGE_BREAK_RESERVATION_REQUEST, *PSTORAGE_BREAK_RESERVATION_REQUEST;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PREVENT_MEDIA_REMOVAL {
-    BOOLEAN PreventMediaRemoval;
-} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
-
-
-
-
-
-
-
-typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
-        DWORD MediaChangeCount;
-        DWORD NewState;         
-} CLASS_MEDIA_CHANGE_CONTEXT, *PCLASS_MEDIA_CHANGE_CONTEXT;
-
-
-
-
-
-typedef struct _TAPE_STATISTICS {
-    DWORD Version;
-    DWORD Flags;
-    LARGE_INTEGER RecoveredWrites;
-    LARGE_INTEGER UnrecoveredWrites;
-    LARGE_INTEGER RecoveredReads;
-    LARGE_INTEGER UnrecoveredReads;
-    BYTE          CompressionRatioReads;
-    BYTE          CompressionRatioWrites;
-} TAPE_STATISTICS, *PTAPE_STATISTICS;
-
-
-
-
-
-
-
-
-typedef struct _TAPE_GET_STATISTICS {
-    DWORD Operation;
-} TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS;
-
-
-
-
-
-
-
-
-
-
-typedef enum _STORAGE_MEDIA_TYPE {
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DDS_4mm = 0x20,            
-    MiniQic,                   
-    Travan,                    
-    QIC,                       
-    MP_8mm,                    
-    AME_8mm,                   
-    AIT1_8mm,                  
-    DLT,                       
-    NCTP,                      
-    IBM_3480,                  
-    IBM_3490E,                 
-    IBM_Magstar_3590,          
-    IBM_Magstar_MP,            
-    STK_DATA_D3,               
-    SONY_DTF,                  
-    DV_6mm,                    
-    DMI,                       
-    SONY_D2,                   
-    CLEANER_CARTRIDGE,         
-    CD_ROM,                    
-    CD_R,                      
-    CD_RW,                     
-    DVD_ROM,                   
-    DVD_R,                     
-    DVD_RW,                    
-    MO_3_RW,                   
-    MO_5_WO,                   
-    MO_5_RW,                   
-    MO_5_LIMDOW,               
-    PC_5_WO,                   
-    PC_5_RW,                   
-    PD_5_RW,                   
-    ABL_5_WO,                  
-    PINNACLE_APEX_5_RW,        
-    SONY_12_WO,                
-    PHILIPS_12_WO,             
-    HITACHI_12_WO,             
-    CYGNET_12_WO,              
-    KODAK_14_WO,               
-    MO_NFR_525,                
-    NIKON_12_RW,               
-    IOMEGA_ZIP,                
-    IOMEGA_JAZ,                
-    SYQUEST_EZ135,             
-    SYQUEST_EZFLYER,           
-    SYQUEST_SYJET,             
-    AVATAR_F2,                 
-    MP2_8mm,                   
-    DST_S,                     
-    DST_M,                     
-    DST_L,                     
-    VXATape_1,                 
-    VXATape_2,                 
-    STK_9840,                  
-    LTO_Ultrium,               
-    LTO_Accelis,               
-    DVD_RAM,                   
-    AIT_8mm,                   
-    ADR_1,                     
-    ADR_2,
-    STK_9940,                  
-    SAIT                       
-} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _STORAGE_BUS_TYPE {
-    BusTypeUnknown = 0x00,
-    BusTypeScsi,
-    BusTypeAtapi,
-    BusTypeAta,
-    BusType1394,
-    BusTypeSsa,
-    BusTypeFibre,
-    BusTypeUsb,
-    BusTypeRAID,
-    BusTypeiScsi,
-    BusTypeSas,
-    BusTypeSata,
-    BusTypeMaxReserved = 0x7F
-} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
-
-typedef struct _DEVICE_MEDIA_INFO {
-    union {
-        struct {
-            LARGE_INTEGER Cylinders;
-            STORAGE_MEDIA_TYPE MediaType;
-            DWORD TracksPerCylinder;
-            DWORD SectorsPerTrack;
-            DWORD BytesPerSector;
-            DWORD NumberMediaSides;
-            DWORD MediaCharacteristics; 
-        } DiskInfo;
-
-        struct {
-            LARGE_INTEGER Cylinders;
-            STORAGE_MEDIA_TYPE MediaType;
-            DWORD TracksPerCylinder;
-            DWORD SectorsPerTrack;
-            DWORD BytesPerSector;
-            DWORD NumberMediaSides;
-            DWORD MediaCharacteristics; 
-        } RemovableDiskInfo;
-
-        struct {
-            STORAGE_MEDIA_TYPE MediaType;
-            DWORD   MediaCharacteristics; 
-            DWORD   CurrentBlockSize;
-            STORAGE_BUS_TYPE BusType;
-
-            
-            
-            
-
-            union {
-                struct {
-                    BYTE  MediumType;
-                    BYTE  DensityCode;
-                } ScsiInformation;
-            } BusSpecificData;
-
-        } TapeInfo;
-    } DeviceSpecific;
-} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
-
-typedef struct _GET_MEDIA_TYPES {
-    DWORD DeviceType;              
-    DWORD MediaInfoCount;
-    DEVICE_MEDIA_INFO MediaInfo[1];
-} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _STORAGE_PREDICT_FAILURE
-{
-    DWORD PredictFailure;
-    BYTE  VendorSpecific[512];
-} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _MEDIA_TYPE {
-    Unknown,                
-    F5_1Pt2_512,            
-    F3_1Pt44_512,           
-    F3_2Pt88_512,           
-    F3_20Pt8_512,           
-    F3_720_512,             
-    F5_360_512,             
-    F5_320_512,             
-    F5_320_1024,            
-    F5_180_512,             
-    F5_160_512,             
-    RemovableMedia,         
-    FixedMedia,             
-    F3_120M_512,            
-    F3_640_512,             
-    F5_640_512,             
-    F5_720_512,             
-    F3_1Pt2_512,            
-    F3_1Pt23_1024,          
-    F5_1Pt23_1024,          
-    F3_128Mb_512,           
-    F3_230Mb_512,           
-    F8_256_128,             
-    F3_200Mb_512,           
-    F3_240M_512,            
-    F3_32M_512              
-} MEDIA_TYPE, *PMEDIA_TYPE;
-
-
-
-
-
-
-typedef struct _FORMAT_PARAMETERS {
-   MEDIA_TYPE MediaType;
-   DWORD StartCylinderNumber;
-   DWORD EndCylinderNumber;
-   DWORD StartHeadNumber;
-   DWORD EndHeadNumber;
-} FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
-
-
-
-
-
-
-
-
-typedef WORD   BAD_TRACK_NUMBER;
-typedef WORD   *PBAD_TRACK_NUMBER;
-
-
-
-
-
-
-typedef struct _FORMAT_EX_PARAMETERS {
-   MEDIA_TYPE MediaType;
-   DWORD StartCylinderNumber;
-   DWORD EndCylinderNumber;
-   DWORD StartHeadNumber;
-   DWORD EndHeadNumber;
-   WORD   FormatGapLength;
-   WORD   SectorsPerTrack;
-   WORD   SectorNumber[1];
-} FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
-
-
-
-
-
-
-
-typedef struct _DISK_GEOMETRY {
-    LARGE_INTEGER Cylinders;
-    MEDIA_TYPE MediaType;
-    DWORD TracksPerCylinder;
-    DWORD SectorsPerTrack;
-    DWORD BytesPerSector;
-} DISK_GEOMETRY, *PDISK_GEOMETRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PARTITION_INFORMATION {
-    LARGE_INTEGER StartingOffset;
-    LARGE_INTEGER PartitionLength;
-    DWORD HiddenSectors;
-    DWORD PartitionNumber;
-    BYTE  PartitionType;
-    BOOLEAN BootIndicator;
-    BOOLEAN RecognizedPartition;
-    BOOLEAN RewritePartition;
-} PARTITION_INFORMATION, *PPARTITION_INFORMATION;
-
-
-
-
-
-
-
-typedef struct _SET_PARTITION_INFORMATION {
-    BYTE  PartitionType;
-} SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
-
-
-
-
-
-
-typedef struct _DRIVE_LAYOUT_INFORMATION {
-    DWORD PartitionCount;
-    DWORD Signature;
-    PARTITION_INFORMATION PartitionEntry[1];
-} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION;
-
-
-
-
-
-
-typedef struct _VERIFY_INFORMATION {
-    LARGE_INTEGER StartingOffset;
-    DWORD Length;
-} VERIFY_INFORMATION, *PVERIFY_INFORMATION;
-
-
-
-
-
-
-typedef struct _REASSIGN_BLOCKS {
-    WORD   Reserved;
-    WORD   Count;
-    DWORD BlockNumber[1];
-} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _REASSIGN_BLOCKS_EX {
-    WORD   Reserved;
-    WORD   Count;
-    LARGE_INTEGER BlockNumber[1];
-} REASSIGN_BLOCKS_EX, *PREASSIGN_BLOCKS_EX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _PARTITION_STYLE {
-    PARTITION_STYLE_MBR,
-    PARTITION_STYLE_GPT,
-    PARTITION_STYLE_RAW
-} PARTITION_STYLE;
-
-
-
-
-
-
-
-typedef struct _PARTITION_INFORMATION_GPT {
-    GUID PartitionType;                 
-    GUID PartitionId;                   
-    DWORD64 Attributes;                 
-    WCHAR Name [36];                    
-} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PARTITION_INFORMATION_MBR {
-    BYTE  PartitionType;
-    BOOLEAN BootIndicator;
-    BOOLEAN RecognizedPartition;
-    DWORD HiddenSectors;
-} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
-
-
-
-
-
-
-
-
-
-
-typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
-typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
-
-
-typedef struct _SET_PARTITION_INFORMATION_EX {
-    PARTITION_STYLE PartitionStyle;
-    union {
-        SET_PARTITION_INFORMATION_MBR Mbr;
-        SET_PARTITION_INFORMATION_GPT Gpt;
-    };
-} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
-
-
-
-
-
-
-
-typedef struct _CREATE_DISK_GPT {
-    GUID DiskId;                    
-    DWORD MaxPartitionCount;        
-} CREATE_DISK_GPT, *PCREATE_DISK_GPT;
-
-
-
-
-
-
-typedef struct _CREATE_DISK_MBR {
-    DWORD Signature;
-} CREATE_DISK_MBR, *PCREATE_DISK_MBR;
-
-
-typedef struct _CREATE_DISK {
-    PARTITION_STYLE PartitionStyle;
-    union {
-        CREATE_DISK_MBR Mbr;
-        CREATE_DISK_GPT Gpt;
-    };
-} CREATE_DISK, *PCREATE_DISK;
-
-
-
-
-
-
-
-
-typedef struct _GET_LENGTH_INFORMATION {
-    LARGE_INTEGER   Length;
-} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
-
-
-
-
-
-
-
-typedef struct _PARTITION_INFORMATION_EX {
-    PARTITION_STYLE PartitionStyle;
-    LARGE_INTEGER StartingOffset;
-    LARGE_INTEGER PartitionLength;
-    DWORD PartitionNumber;
-    BOOLEAN RewritePartition;
-    union {
-        PARTITION_INFORMATION_MBR Mbr;
-        PARTITION_INFORMATION_GPT Gpt;
-    };
-} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
-
-
-
-
-
-
-typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
-    GUID DiskId;
-    LARGE_INTEGER StartingUsableOffset;
-    LARGE_INTEGER UsableLength;
-    DWORD MaxPartitionCount;
-} DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
-
-
-
-
-
-
-typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
-    DWORD Signature;
-} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
-
-
-
-
-
-
-typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
-    DWORD PartitionStyle;
-    DWORD PartitionCount;
-    union {
-        DRIVE_LAYOUT_INFORMATION_MBR Mbr;
-        DRIVE_LAYOUT_INFORMATION_GPT Gpt;
-    };
-    PARTITION_INFORMATION_EX PartitionEntry[1];
-} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _DETECTION_TYPE {
-        DetectNone,
-        DetectInt13,
-        DetectExInt13
-} DETECTION_TYPE;
-
-typedef struct _DISK_INT13_INFO {
-        WORD   DriveSelect;
-        DWORD MaxCylinders;
-        WORD   SectorsPerTrack;
-        WORD   MaxHeads;
-        WORD   NumberDrives;
-} DISK_INT13_INFO, *PDISK_INT13_INFO;
-
-typedef struct _DISK_EX_INT13_INFO {
-        WORD   ExBufferSize;
-        WORD   ExFlags;
-        DWORD ExCylinders;
-        DWORD ExHeads;
-        DWORD ExSectorsPerTrack;
-        DWORD64 ExSectorsPerDrive;
-        WORD   ExSectorSize;
-        WORD   ExReserved;
-} DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
-
-typedef struct _DISK_DETECTION_INFO {
-        DWORD SizeOfDetectInfo;
-        DETECTION_TYPE DetectionType;
-        union {
-                struct {
-
-                        
-                        
-                        
-                        
-
-                        DISK_INT13_INFO Int13;
-
-                        
-                        
-                        
-                        
-
-                        DISK_EX_INT13_INFO ExInt13;     
-                };
-        };
-} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
-
-
-typedef struct _DISK_PARTITION_INFO {
-        DWORD SizeOfPartitionInfo;
-        PARTITION_STYLE PartitionStyle;                 
-        union {
-                struct {                                                        
-                        DWORD Signature;                                
-                        DWORD CheckSum;                                 
-                } Mbr;
-                struct {                                                        
-                        GUID DiskId;
-                } Gpt;
-        };
-} DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISK_GEOMETRY_EX {
-        DISK_GEOMETRY Geometry;                                 
-        LARGE_INTEGER DiskSize;                                 
-        BYTE  Data[1];                                                  
-} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISK_CONTROLLER_NUMBER {
-    DWORD ControllerNumber;
-    DWORD DiskNumber;
-} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum {
-    EqualPriority,
-    KeepPrefetchedData,
-    KeepReadData
-} DISK_CACHE_RETENTION_PRIORITY;
-
-typedef struct _DISK_CACHE_INFORMATION {
-
-    
-    
-    
-    
-    
-
-    BOOLEAN ParametersSavable;
-
-    
-    
-    
-
-    BOOLEAN ReadCacheEnabled;
-    BOOLEAN WriteCacheEnabled;
-
-    
-    
-    
-    
-    
-    
-
-    DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
-    DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
-
-    
-    
-    
-    
-
-    WORD   DisablePrefetchTransferLength;
-
-    
-    
-    
-    
-    
-
-    BOOLEAN PrefetchScalar;
-
-    
-    
-    
-    
-    
-    
-    
-
-    union {
-        struct {
-            WORD   Minimum;
-            WORD   Maximum;
-
-            
-            
-            
-            
-
-            WORD   MaximumBlocks;
-        } ScalarPrefetch;
-
-        struct {
-            WORD   Minimum;
-            WORD   Maximum;
-        } BlockPrefetch;
-    };
-
-} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
-
-
-
-
-
-
-
-typedef struct _DISK_GROW_PARTITION {
-    DWORD PartitionNumber;
-    LARGE_INTEGER BytesToGrow;
-} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _HISTOGRAM_BUCKET {
-    DWORD       Reads;
-    DWORD       Writes;
-} HISTOGRAM_BUCKET, *PHISTOGRAM_BUCKET;
-
-
-
-typedef struct _DISK_HISTOGRAM {
-    LARGE_INTEGER   DiskSize;
-    LARGE_INTEGER   Start;
-    LARGE_INTEGER   End;
-    LARGE_INTEGER   Average;
-    LARGE_INTEGER   AverageRead;
-    LARGE_INTEGER   AverageWrite;
-    DWORD           Granularity;
-    DWORD           Size;
-    DWORD           ReadCount;
-    DWORD           WriteCount;
-    PHISTOGRAM_BUCKET  Histogram;
-} DISK_HISTOGRAM, *PDISK_HISTOGRAM;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISK_PERFORMANCE {
-        LARGE_INTEGER BytesRead;
-        LARGE_INTEGER BytesWritten;
-        LARGE_INTEGER ReadTime;
-        LARGE_INTEGER WriteTime;
-        LARGE_INTEGER IdleTime;
-        DWORD ReadCount;
-        DWORD WriteCount;
-        DWORD QueueDepth;
-        DWORD SplitCount;
-        LARGE_INTEGER QueryTime;
-        DWORD   StorageDeviceNumber;
-        WCHAR   StorageManagerName[8];
-} DISK_PERFORMANCE, *PDISK_PERFORMANCE;
-
-
-
-
-
-
-
-typedef struct _DISK_RECORD {
-   LARGE_INTEGER ByteOffset;
-   LARGE_INTEGER StartTime;
-   LARGE_INTEGER EndTime;
-   PVOID VirtualAddress;
-   DWORD NumberOfBytes;
-   BYTE  DeviceNumber;
-   BOOLEAN ReadRequest;
-} DISK_RECORD, *PDISK_RECORD;
-
-
-
-
-
-
-typedef struct _DISK_LOGGING {
-    BYTE  Function;
-    PVOID BufferAddress;
-    DWORD BufferSize;
-} DISK_LOGGING, *PDISK_LOGGING;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _BIN_TYPES {
-    RequestSize,
-    RequestLocation
-} BIN_TYPES;
-
-
-
-
-
-typedef struct _BIN_RANGE {
-    LARGE_INTEGER StartValue;
-    LARGE_INTEGER Length;
-} BIN_RANGE, *PBIN_RANGE;
-
-
-
-
-
-typedef struct _PERF_BIN {
-    DWORD NumberOfBins;
-    DWORD TypeOfBin;
-    BIN_RANGE BinsRanges[1];
-} PERF_BIN, *PPERF_BIN ;
-
-
-
-
-
-typedef struct _BIN_COUNT {
-    BIN_RANGE BinRange;
-    DWORD BinCount;
-} BIN_COUNT, *PBIN_COUNT;
-
-
-
-
-
-typedef struct _BIN_RESULTS {
-    DWORD NumberOfBins;
-    BIN_COUNT BinCounts[1];
-} BIN_RESULTS, *PBIN_RESULTS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _GETVERSIONINPARAMS {
-        BYTE     bVersion;               
-        BYTE     bRevision;              
-        BYTE     bReserved;              
-        BYTE     bIDEDeviceMap;          
-        DWORD   fCapabilities;          
-        DWORD   dwReserved[4];          
-} GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _IDEREGS {
-        BYTE     bFeaturesReg;           
-        BYTE     bSectorCountReg;        
-        BYTE     bSectorNumberReg;       
-        BYTE     bCylLowReg;             
-        BYTE     bCylHighReg;            
-        BYTE     bDriveHeadReg;          
-        BYTE     bCommandReg;            
-        BYTE     bReserved;                      
-} IDEREGS, *PIDEREGS, *LPIDEREGS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _SENDCMDINPARAMS {
-        DWORD   cBufferSize;            
-        IDEREGS irDriveRegs;            
-        BYTE     bDriveNumber;           
-                                                                
-        BYTE     bReserved[3];           
-        DWORD   dwReserved[4];          
-        BYTE     bBuffer[1];                     
-} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _DRIVERSTATUS {
-        BYTE     bDriverError;           
-                                                                
-        BYTE     bIDEError;                      
-                                                                
-                                                                
-        BYTE     bReserved[2];           
-        DWORD   dwReserved[2];          
-} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _SENDCMDOUTPARAMS {
-        DWORD                   cBufferSize;            
-        DRIVERSTATUS            DriverStatus;           
-        BYTE                    bBuffer[1];             
-} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  enum _ELEMENT_TYPE {
-    AllElements,        
-    ChangerTransport,   
-    ChangerSlot,        
-    ChangerIEPort,      
-    ChangerDrive,       
-    ChangerDoor,        
-    ChangerKeypad,      
-    ChangerMaxElement   
-} ELEMENT_TYPE, *PELEMENT_TYPE;
-
-typedef  struct _CHANGER_ELEMENT {
-    ELEMENT_TYPE    ElementType;
-    DWORD   ElementAddress;
-} CHANGER_ELEMENT, *PCHANGER_ELEMENT;
-
-typedef  struct _CHANGER_ELEMENT_LIST {
-    CHANGER_ELEMENT Element;
-    DWORD   NumberOfElements;
-} CHANGER_ELEMENT_LIST , *PCHANGER_ELEMENT_LIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                       
-
-
-
-
-
-
-
-                                                       
-
-                                                       
-
-
-
-                                                       
-
-
-
-
-
-
-
-
-                                                       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  struct _GET_CHANGER_PARAMETERS {
-
-    
-    
-    
-
-    DWORD Size;
-
-    
-    
-    
-
-    WORD   NumberTransportElements;
-    WORD   NumberStorageElements;                
-    WORD   NumberCleanerSlots;                   
-    WORD   NumberIEElements;
-    WORD   NumberDataTransferElements;
-
-    
-    
-    
-
-    WORD   NumberOfDoors;
-
-    
-    
-    
-    
-
-    WORD   FirstSlotNumber;
-    WORD   FirstDriveNumber;
-    WORD   FirstTransportNumber;
-    WORD   FirstIEPortNumber;
-    WORD   FirstCleanerSlotAddress;
-
-    
-    
-    
-
-    WORD   MagazineSize;
-
-    
-    
-    
-    
-
-    DWORD DriveCleanTimeout;
-
-    
-    
-    
-
-    DWORD Features0;
-    DWORD Features1;
-
-    
-    
-    
-    
-
-    BYTE  MoveFromTransport;
-    BYTE  MoveFromSlot;
-    BYTE  MoveFromIePort;
-    BYTE  MoveFromDrive;
-
-    
-    
-    
-    
-
-    BYTE  ExchangeFromTransport;
-    BYTE  ExchangeFromSlot;
-    BYTE  ExchangeFromIePort;
-    BYTE  ExchangeFromDrive;
-
-    
-    
-    
-    
-
-    BYTE  LockUnlockCapabilities;
-
-    
-    
-    
-    
-
-    BYTE  PositionCapabilities;
-
-    
-    
-    
-
-    BYTE  Reserved1[2];
-    DWORD Reserved2[2];
-
-} GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS;
-
-
-
-
-
-
-typedef  struct _CHANGER_PRODUCT_DATA {
-
-    
-    
-    
-
-    BYTE  VendorId[8];
-
-    
-    
-    
-
-    BYTE  ProductId[16];
-
-    
-    
-    
-
-    BYTE  Revision[4];
-
-    
-    
-    
-    
-
-    BYTE  SerialNumber[32];
-
-    
-    
-    
-
-    BYTE  DeviceType;
-
-} CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CHANGER_SET_ACCESS {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Element;
-
-    
-    
-    
-
-    DWORD           Control;
-} CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CHANGER_READ_ELEMENT_STATUS {
-
-    
-    
-    
-
-    CHANGER_ELEMENT_LIST ElementList;
-
-    
-    
-    
-
-    BOOLEAN VolumeTagInfo;
-} CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS;
-
-
-
-
-
-typedef  struct _CHANGER_ELEMENT_STATUS {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Element;
-
-    
-    
-    
-    
-    
-
-    CHANGER_ELEMENT SrcElementAddress;
-
-    
-    
-    
-
-    DWORD Flags;
-
-    
-    
-    
-
-    DWORD ExceptionCode;
-
-    
-    
-    
-    
-
-    BYTE  TargetId;
-
-    
-    
-    
-    
-
-    BYTE  Lun;
-    WORD   Reserved;
-
-    
-    
-    
-    
-
-    BYTE  PrimaryVolumeID[36];
-
-    
-    
-    
-    
-    
-
-    BYTE  AlternateVolumeID[36];
-
-} CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS;
-
-
-
-
-
-
-
-typedef  struct _CHANGER_ELEMENT_STATUS_EX {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Element;
-
-    
-    
-    
-    
-    
-
-    CHANGER_ELEMENT SrcElementAddress;
-
-    
-    
-    
-
-    DWORD Flags;
-
-    
-    
-    
-
-    DWORD ExceptionCode;
-
-    
-    
-    
-    
-
-    BYTE  TargetId;
-
-    
-    
-    
-    
-
-    BYTE  Lun;
-    WORD   Reserved;
-
-    
-    
-    
-    
-
-    BYTE  PrimaryVolumeID[36];
-
-    
-    
-    
-    
-    
-
-    BYTE  AlternateVolumeID[36];
-
-    
-    
-    
-    BYTE  VendorIdentification[8];
-
-    
-    
-    
-    BYTE  ProductIdentification[16];
-
-    
-    
-    
-    BYTE  SerialNumber[32];
-
-} CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
-
-    
-    
-    
-
-    CHANGER_ELEMENT_LIST ElementList;
-
-    
-    
-    
-    
-
-    BOOLEAN BarCodeScan;
-} CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS;
-
-
-
-
-
-
-typedef struct _CHANGER_SET_POSITION {
-
-
-    
-    
-    
-
-    CHANGER_ELEMENT Transport;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Destination;
-
-    
-    
-    
-
-    BOOLEAN         Flip;
-} CHANGER_SET_POSITION, *PCHANGER_SET_POSITION;
-
-
-
-
-
-
-typedef struct _CHANGER_EXCHANGE_MEDIUM {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Transport;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Source;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Destination1;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Destination2;
-
-    
-    
-    
-
-    BOOLEAN         Flip1;
-    BOOLEAN         Flip2;
-} CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM;
-
-
-
-
-
-
-typedef struct _CHANGER_MOVE_MEDIUM {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Transport;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Source;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Destination;
-
-    
-    
-    
-
-    BOOLEAN         Flip;
-} CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM;
-
-
-
-
-
-
-
-
-
-
-
-typedef  struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
-
-    
-    
-    
-
-    CHANGER_ELEMENT StartingElement;
-
-    
-    
-    
-
-    DWORD ActionCode;
-
-    
-    
-    
-
-    BYTE  VolumeIDTemplate[40];
-} CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION;
-
-
-
-
-
-
-typedef struct _READ_ELEMENT_ADDRESS_INFO {
-
-    
-    
-    
-
-    DWORD NumberOfElements;
-
-    
-    
-    
-    
-
-    CHANGER_ELEMENT_STATUS ElementStatus[1];
-} READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
-   DeviceProblemNone,
-   DeviceProblemHardware,
-   DeviceProblemCHMError,
-   DeviceProblemDoorOpen,
-   DeviceProblemCalibrationError,
-   DeviceProblemTargetFailure,
-   DeviceProblemCHMMoveError,
-   DeviceProblemCHMZeroError,
-   DeviceProblemCartridgeInsertError,
-   DeviceProblemPositionError,
-   DeviceProblemSensorError,
-   DeviceProblemCartridgeEjectError,
-   DeviceProblemGripperError,
-   DeviceProblemDriveError
-} CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PATHNAME_BUFFER {
-
-    DWORD PathNameLength;
-    WCHAR Name[1];
-
-} PATHNAME_BUFFER, *PPATHNAME_BUFFER;
-
-
-
-
-
-typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
-
-    BYTE  First0x24BytesOfBootSector[0x24];
-
-} FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    LARGE_INTEGER VolumeSerialNumber;
-    LARGE_INTEGER NumberSectors;
-    LARGE_INTEGER TotalClusters;
-    LARGE_INTEGER FreeClusters;
-    LARGE_INTEGER TotalReserved;
-    DWORD BytesPerSector;
-    DWORD BytesPerCluster;
-    DWORD BytesPerFileRecordSegment;
-    DWORD ClustersPerFileRecordSegment;
-    LARGE_INTEGER MftValidDataLength;
-    LARGE_INTEGER MftStartLcn;
-    LARGE_INTEGER Mft2StartLcn;
-    LARGE_INTEGER MftZoneStart;
-    LARGE_INTEGER MftZoneEnd;
-
-} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
-
-typedef struct {
-
-    DWORD ByteCount;
-
-    WORD   MajorVersion;
-    WORD   MinorVersion;
-
-} NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
-
-
-
-
-
-
-
-typedef struct {
-
-    LARGE_INTEGER StartingLcn;
-
-} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
-
-typedef struct {
-
-    LARGE_INTEGER StartingLcn;
-    LARGE_INTEGER BitmapSize;
-    BYTE  Buffer[1];
-
-} VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
-
-
-
-
-
-
-
-typedef struct {
-
-    LARGE_INTEGER StartingVcn;
-
-} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
-
-typedef struct RETRIEVAL_POINTERS_BUFFER {
-
-    DWORD ExtentCount;
-    LARGE_INTEGER StartingVcn;
-    struct {
-        LARGE_INTEGER NextVcn;
-        LARGE_INTEGER Lcn;
-    } Extents[1];
-
-} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
-
-
-
-
-
-
-
-typedef struct {
-
-    LARGE_INTEGER FileReferenceNumber;
-
-} NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
-
-typedef struct {
-
-    LARGE_INTEGER FileReferenceNumber;
-    DWORD FileRecordLength;
-    BYTE  FileRecordBuffer[1];
-
-} NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
-
-
-
-
-
-
-
-typedef struct {
-
-    HANDLE FileHandle;
-    LARGE_INTEGER StartingVcn;
-    LARGE_INTEGER StartingLcn;
-    DWORD ClusterCount;
-
-} MOVE_FILE_DATA, *PMOVE_FILE_DATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD Restart;
-    SID Sid;
-} FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
-
-typedef struct {
-    DWORD NextEntryOffset;
-    DWORD FileIndex;
-    DWORD FileNameLength;
-    WCHAR FileName[1];
-} FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    DWORDLONG StartFileReferenceNumber;
-    USN LowUsn;
-    USN HighUsn;
-
-} MFT_ENUM_DATA, *PMFT_ENUM_DATA;
-
-
-
-
-
-typedef struct {
-
-    DWORDLONG MaximumSize;
-    DWORDLONG AllocationDelta;
-
-} CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
-
-
-
-
-
-typedef struct {
-
-    USN StartUsn;
-    DWORD ReasonMask;
-    DWORD ReturnOnlyOnClose;
-    DWORDLONG Timeout;
-    DWORDLONG BytesToWaitFor;
-    DWORDLONG UsnJournalID;
-
-} READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    DWORD RecordLength;
-    WORD   MajorVersion;
-    WORD   MinorVersion;
-    DWORDLONG FileReferenceNumber;
-    DWORDLONG ParentFileReferenceNumber;
-    USN Usn;
-    LARGE_INTEGER TimeStamp;
-    DWORD Reason;
-    DWORD SourceInfo;
-    DWORD SecurityId;
-    DWORD FileAttributes;
-    WORD   FileNameLength;
-    WORD   FileNameOffset;
-    WCHAR FileName[1];
-
-} USN_RECORD, *PUSN_RECORD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    DWORDLONG UsnJournalID;
-    USN FirstUsn;
-    USN NextUsn;
-    USN LowestValidUsn;
-    USN MaxUsn;
-    DWORDLONG MaximumSize;
-    DWORDLONG AllocationDelta;
-
-} USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
-
-
-
-
-
-typedef struct {
-
-    DWORDLONG UsnJournalID;
-    DWORD DeleteFlags;
-
-} DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    DWORD UsnSourceInfo;
-    HANDLE VolumeHandle;
-    DWORD HandleInfo;
-
-} MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    ACCESS_MASK DesiredAccess;
-    DWORD SecurityIds[1];
-
-} BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_PREFETCH {
-    DWORD Type;
-    DWORD Count;
-    DWORDLONG Prefetch[1];
-} FILE_PREFETCH, *PFILE_PREFETCH;
-
-
-
-
-
-
-
-
-typedef struct _FILESYSTEM_STATISTICS {
-
-    WORD   FileSystemType;
-    WORD   Version;                     
-
-    DWORD SizeOfCompleteStructure;      
-
-    DWORD UserFileReads;
-    DWORD UserFileReadBytes;
-    DWORD UserDiskReads;
-    DWORD UserFileWrites;
-    DWORD UserFileWriteBytes;
-    DWORD UserDiskWrites;
-
-    DWORD MetaDataReads;
-    DWORD MetaDataReadBytes;
-    DWORD MetaDataDiskReads;
-    DWORD MetaDataWrites;
-    DWORD MetaDataWriteBytes;
-    DWORD MetaDataDiskWrites;
-
-    
-    
-    
-
-} FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
-
-
-
-
-
-
-
-
-
-
-typedef struct _FAT_STATISTICS {
-    DWORD CreateHits;
-    DWORD SuccessfulCreates;
-    DWORD FailedCreates;
-
-    DWORD NonCachedReads;
-    DWORD NonCachedReadBytes;
-    DWORD NonCachedWrites;
-    DWORD NonCachedWriteBytes;
-
-    DWORD NonCachedDiskReads;
-    DWORD NonCachedDiskWrites;
-} FAT_STATISTICS, *PFAT_STATISTICS;
-
-typedef struct _NTFS_STATISTICS {
-
-    DWORD LogFileFullExceptions;
-    DWORD OtherExceptions;
-
-    
-    
-    
-
-    DWORD MftReads;
-    DWORD MftReadBytes;
-    DWORD MftWrites;
-    DWORD MftWriteBytes;
-    struct {
-        WORD   Write;
-        WORD   Create;
-        WORD   SetInfo;
-        WORD   Flush;
-    } MftWritesUserLevel;
-
-    WORD   MftWritesFlushForLogFileFull;
-    WORD   MftWritesLazyWriter;
-    WORD   MftWritesUserRequest;
-
-    DWORD Mft2Writes;
-    DWORD Mft2WriteBytes;
-    struct {
-        WORD   Write;
-        WORD   Create;
-        WORD   SetInfo;
-        WORD   Flush;
-    } Mft2WritesUserLevel;
-
-    WORD   Mft2WritesFlushForLogFileFull;
-    WORD   Mft2WritesLazyWriter;
-    WORD   Mft2WritesUserRequest;
-
-    DWORD RootIndexReads;
-    DWORD RootIndexReadBytes;
-    DWORD RootIndexWrites;
-    DWORD RootIndexWriteBytes;
-
-    DWORD BitmapReads;
-    DWORD BitmapReadBytes;
-    DWORD BitmapWrites;
-    DWORD BitmapWriteBytes;
-
-    WORD   BitmapWritesFlushForLogFileFull;
-    WORD   BitmapWritesLazyWriter;
-    WORD   BitmapWritesUserRequest;
-
-    struct {
-        WORD   Write;
-        WORD   Create;
-        WORD   SetInfo;
-    } BitmapWritesUserLevel;
-
-    DWORD MftBitmapReads;
-    DWORD MftBitmapReadBytes;
-    DWORD MftBitmapWrites;
-    DWORD MftBitmapWriteBytes;
-
-    WORD   MftBitmapWritesFlushForLogFileFull;
-    WORD   MftBitmapWritesLazyWriter;
-    WORD   MftBitmapWritesUserRequest;
-
-    struct {
-        WORD   Write;
-        WORD   Create;
-        WORD   SetInfo;
-        WORD   Flush;
-    } MftBitmapWritesUserLevel;
-
-    DWORD UserIndexReads;
-    DWORD UserIndexReadBytes;
-    DWORD UserIndexWrites;
-    DWORD UserIndexWriteBytes;
-
-    
-    
-    
-
-    DWORD LogFileReads;
-    DWORD LogFileReadBytes;
-    DWORD LogFileWrites;
-    DWORD LogFileWriteBytes;
-
-    struct {
-        DWORD Calls;                
-        DWORD Clusters;             
-        DWORD Hints;                
-
-        DWORD RunsReturned;         
-
-        DWORD HintsHonored;         
-        DWORD HintsClusters;        
-        DWORD Cache;                
-        DWORD CacheClusters;        
-        DWORD CacheMiss;            
-        DWORD CacheMissClusters;    
-    } Allocate;
-
-} NTFS_STATISTICS, *PNTFS_STATISTICS;
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)       
-
-typedef struct _FILE_OBJECTID_BUFFER {
-
-    
-    
-    
-
-    BYTE  ObjectId[16];
-
-    
-    
-    
-    
-
-    union {
-        struct {
-            BYTE  BirthVolumeId[16];
-            BYTE  BirthObjectId[16];
-            BYTE  DomainId[16];
-        } ;
-        BYTE  ExtendedInfo[48];
-    };
-
-} FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_SET_SPARSE_BUFFER {
-    BOOLEAN SetSparse;
-} FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_ZERO_DATA_INFORMATION {
-
-    LARGE_INTEGER FileOffset;
-    LARGE_INTEGER BeyondFinalZero;
-
-} FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
-
-    LARGE_INTEGER FileOffset;
-    LARGE_INTEGER Length;
-
-} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ENCRYPTION_BUFFER {
-
-    DWORD EncryptionOperation;
-    BYTE  Private[1];
-
-} ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DECRYPTION_STATUS_BUFFER {
-
-    BOOLEAN NoEncryptedStreams;
-
-} DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
-
-    
-    
-    
-    
-    
-    
-
-    LONGLONG FileOffset;
-    DWORD Length;
-
-} REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ENCRYPTED_DATA_INFO {
-
-    
-    
-    
-    
-    
-    
-
-    DWORDLONG StartingFileOffset;
-
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD OutputBufferOffset;
-
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD BytesWithinFileSize;
-
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD BytesWithinValidDataLength;
-
-    
-    
-    
-    
-    
-    
-
-    WORD   CompressionFormat;
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    BYTE  DataUnitShift;
-    BYTE  ChunkShift;
-    BYTE  ClusterShift;
-
-    
-    
-    
-
-    BYTE  EncryptionFormat;
-
-    
-    
-    
-    
-
-    WORD   NumberOfDataBlocks;
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD DataBlockSize[1];
-
-} ENCRYPTED_DATA_INFO;
-typedef ENCRYPTED_DATA_INFO *PENCRYPTED_DATA_INFO;
-
-
-
-
-
-
-
-
-
-
-typedef struct _PLEX_READ_DATA_REQUEST {
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    LARGE_INTEGER ByteOffset;
-    DWORD ByteLength;
-    DWORD PlexNumber;
-
-} PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SI_COPYFILE {
-    DWORD SourceFileNameLength;
-    DWORD DestinationFileNameLength;
-    DWORD Flags;
-    WCHAR FileNameBuffer[1];
-} SI_COPYFILE, *PSI_COPYFILE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISK_EXTENT {
-    DWORD           DiskNumber;
-    LARGE_INTEGER   StartingOffset;
-    LARGE_INTEGER   ExtentLength;
-} DISK_EXTENT, *PDISK_EXTENT;
-
-
-
-
-
-typedef struct _VOLUME_DISK_EXTENTS {
-    DWORD       NumberOfDiskExtents;
-    DISK_EXTENT Extents[1];
-} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-
-typedef DWORD ULONG;
-typedef WORD UWORD;
-typedef BYTE UCHAR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                              
-
-                              
-
-                              
-                              
-
-                              
-                              
-
-                              
-                              
-                              
-
-                              
-
-                              
-                              
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SCARD_IO_REQUEST{
-    DWORD dwProtocol;   
-    DWORD cbPciLength;  
-} SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
-typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST;
-
-
-
-
-
-
-typedef struct {
-    BYTE
-        bCla,   
-        bIns,   
-        bP1,
-        bP2,    
-        bP3;    
-} SCARD_T0_COMMAND, *LPSCARD_T0_COMMAND;
-
-typedef struct {
-    SCARD_IO_REQUEST ioRequest;
-    BYTE
-        bSw1,
-        bSw2;           
-    union
-    {
-        SCARD_T0_COMMAND CmdBytes;
-        BYTE rgbHeader[5];
-    };
-} SCARD_T0_REQUEST;
-
-typedef SCARD_T0_REQUEST *PSCARD_T0_REQUEST, *LPSCARD_T0_REQUEST;
-
-
-
-
-
-
-typedef struct {
-    SCARD_IO_REQUEST ioRequest;
-} SCARD_T1_REQUEST;
-typedef SCARD_T1_REQUEST *PSCARD_T1_REQUEST, *LPSCARD_T1_REQUEST;
-
-
-
-
-
-
-
-
-
-                                                
-
-                                                
-
-                                                
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-typedef const BYTE *LPCBYTE;
-
-
-
-typedef const void *LPCVOID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern const SCARD_IO_REQUEST
-    g_rgSCardT0Pci,
-    g_rgSCardT1Pci,
-    g_rgSCardRawPci;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ULONG_PTR SCARDCONTEXT;
-typedef SCARDCONTEXT *PSCARDCONTEXT, *LPSCARDCONTEXT;
-
-typedef ULONG_PTR SCARDHANDLE;
-typedef SCARDHANDLE *PSCARDHANDLE, *LPSCARDHANDLE;
-
-
-
-
-                                
-                                
-
-                                
-                                
-                                
-                                
-
-                                
-                                
-                                
-                                
-
-extern  LONG __stdcall
-SCardEstablishContext(
-      DWORD dwScope,
-      LPCVOID pvReserved1,
-      LPCVOID pvReserved2,
-     LPSCARDCONTEXT phContext);
-
-extern  LONG __stdcall
-SCardReleaseContext(
-          SCARDCONTEXT hContext);
-
-extern  LONG __stdcall
-SCardIsValidContext(
-          SCARDCONTEXT hContext);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardListReaderGroupsA(
-          SCARDCONTEXT hContext,
-         LPSTR mszGroups,
-       LPDWORD pcchGroups);
-extern  LONG __stdcall
-SCardListReaderGroupsW(
-          SCARDCONTEXT hContext,
-         LPWSTR mszGroups,
-       LPDWORD pcchGroups);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardListReadersA(
-          SCARDCONTEXT hContext,
-          LPCSTR mszGroups,
-         LPSTR mszReaders,
-       LPDWORD pcchReaders);
-extern  LONG __stdcall
-SCardListReadersW(
-          SCARDCONTEXT hContext,
-          LPCWSTR mszGroups,
-         LPWSTR mszReaders,
-       LPDWORD pcchReaders);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardListCardsA(
-          SCARDCONTEXT hContext,
-          LPCBYTE pbAtr,
-          LPCGUID rgquidInterfaces,
-          DWORD cguidInterfaceCount,
-         LPSTR mszCards,
-       LPDWORD pcchCards);
-extern  LONG __stdcall
-SCardListCardsW(
-          SCARDCONTEXT hContext,
-          LPCBYTE pbAtr,
-          LPCGUID rgquidInterfaces,
-          DWORD cguidInterfaceCount,
-         LPWSTR mszCards,
-       LPDWORD pcchCards);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardListInterfacesA(
-          SCARDCONTEXT hContext,
-          LPCSTR szCard,
-         LPGUID pguidInterfaces,
-       LPDWORD pcguidInterfaces);
-extern  LONG __stdcall
-SCardListInterfacesW(
-          SCARDCONTEXT hContext,
-          LPCWSTR szCard,
-         LPGUID pguidInterfaces,
-       LPDWORD pcguidInterfaces);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardGetProviderIdA(
-          SCARDCONTEXT hContext,
-          LPCSTR szCard,
-         LPGUID pguidProviderId);
-extern  LONG __stdcall
-SCardGetProviderIdW(
-          SCARDCONTEXT hContext,
-          LPCWSTR szCard,
-         LPGUID pguidProviderId);
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardGetCardTypeProviderNameA(
-     SCARDCONTEXT hContext,
-     LPCSTR szCardName,
-     DWORD dwProviderId,
-     LPSTR szProvider,
-      LPDWORD pcchProvider);
-extern  LONG __stdcall
-SCardGetCardTypeProviderNameW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szCardName,
-     DWORD dwProviderId,
-     LPWSTR szProvider,
-      LPDWORD pcchProvider);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardIntroduceReaderGroupA(
-     SCARDCONTEXT hContext,
-     LPCSTR szGroupName);
-extern  LONG __stdcall
-SCardIntroduceReaderGroupW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szGroupName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardForgetReaderGroupA(
-     SCARDCONTEXT hContext,
-     LPCSTR szGroupName);
-extern  LONG __stdcall
-SCardForgetReaderGroupW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szGroupName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardIntroduceReaderA(
-     SCARDCONTEXT hContext,
-     LPCSTR szReaderName,
-     LPCSTR szDeviceName);
-extern  LONG __stdcall
-SCardIntroduceReaderW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szReaderName,
-     LPCWSTR szDeviceName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardForgetReaderA(
-     SCARDCONTEXT hContext,
-     LPCSTR szReaderName);
-extern  LONG __stdcall
-SCardForgetReaderW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szReaderName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardAddReaderToGroupA(
-     SCARDCONTEXT hContext,
-     LPCSTR szReaderName,
-     LPCSTR szGroupName);
-extern  LONG __stdcall
-SCardAddReaderToGroupW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szReaderName,
-     LPCWSTR szGroupName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardRemoveReaderFromGroupA(
-     SCARDCONTEXT hContext,
-     LPCSTR szReaderName,
-     LPCSTR szGroupName);
-extern  LONG __stdcall
-SCardRemoveReaderFromGroupW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szReaderName,
-     LPCWSTR szGroupName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardIntroduceCardTypeA(
-     SCARDCONTEXT hContext,
-     LPCSTR szCardName,
-     LPCGUID pguidPrimaryProvider,
-     LPCGUID rgguidInterfaces,
-     DWORD dwInterfaceCount,
-     LPCBYTE pbAtr,
-     LPCBYTE pbAtrMask,
-     DWORD cbAtrLen);
-extern  LONG __stdcall
-SCardIntroduceCardTypeW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szCardName,
-     LPCGUID pguidPrimaryProvider,
-     LPCGUID rgguidInterfaces,
-     DWORD dwInterfaceCount,
-     LPCBYTE pbAtr,
-     LPCBYTE pbAtrMask,
-     DWORD cbAtrLen);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardSetCardTypeProviderNameA(
-     SCARDCONTEXT hContext,
-     LPCSTR szCardName,
-     DWORD dwProviderId,
-     LPCSTR szProvider);
-extern  LONG __stdcall
-SCardSetCardTypeProviderNameW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szCardName,
-     DWORD dwProviderId,
-     LPCWSTR szProvider);
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardForgetCardTypeA(
-     SCARDCONTEXT hContext,
-     LPCSTR szCardName);
-extern  LONG __stdcall
-SCardForgetCardTypeW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szCardName);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardFreeMemory(
-     SCARDCONTEXT hContext,
-     LPCVOID pvMem);
-
-extern  HANDLE __stdcall
-SCardAccessStartedEvent(void);
-
-extern  void __stdcall
-SCardReleaseStartedEvent(void);
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    LPCSTR      szReader;       
-    LPVOID      pvUserData;     
-    DWORD       dwCurrentState; 
-    DWORD       dwEventState;   
-    DWORD       cbAtr;          
-    BYTE        rgbAtr[36];     
-} SCARD_READERSTATEA, *PSCARD_READERSTATEA, *LPSCARD_READERSTATEA;
-typedef struct {
-    LPCWSTR     szReader;       
-    LPVOID      pvUserData;     
-    DWORD       dwCurrentState; 
-    DWORD       dwEventState;   
-    DWORD       cbAtr;          
-    BYTE        rgbAtr[36];     
-} SCARD_READERSTATEW, *PSCARD_READERSTATEW, *LPSCARD_READERSTATEW;
-
-typedef SCARD_READERSTATEW SCARD_READERSTATE;
-typedef PSCARD_READERSTATEW PSCARD_READERSTATE;
-typedef LPSCARD_READERSTATEW LPSCARD_READERSTATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-
-                                            
-
-extern  LONG __stdcall
-SCardLocateCardsA(
-          SCARDCONTEXT hContext,
-          LPCSTR mszCards,
-       LPSCARD_READERSTATEA rgReaderStates,
-          DWORD cReaders);
-extern  LONG __stdcall
-SCardLocateCardsW(
-          SCARDCONTEXT hContext,
-          LPCWSTR mszCards,
-       LPSCARD_READERSTATEW rgReaderStates,
-          DWORD cReaders);
-
-
-
-
-
-
-typedef struct _SCARD_ATRMASK {
-    DWORD       cbAtr;          
-    BYTE        rgbAtr[36];     
-    BYTE        rgbMask[36];    
-} SCARD_ATRMASK, *PSCARD_ATRMASK, *LPSCARD_ATRMASK;
-
-
-extern  LONG __stdcall
-SCardLocateCardsByATRA(
-          SCARDCONTEXT hContext,
-          LPSCARD_ATRMASK rgAtrMasks,
-          DWORD cAtrs,
-       LPSCARD_READERSTATEA rgReaderStates,
-          DWORD cReaders);
-extern  LONG __stdcall
-SCardLocateCardsByATRW(
-          SCARDCONTEXT hContext,
-          LPSCARD_ATRMASK rgAtrMasks,
-          DWORD cAtrs,
-       LPSCARD_READERSTATEW rgReaderStates,
-          DWORD cReaders);
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardGetStatusChangeA(
-          SCARDCONTEXT hContext,
-          DWORD dwTimeout,
-       LPSCARD_READERSTATEA rgReaderStates,
-          DWORD cReaders);
-extern  LONG __stdcall
-SCardGetStatusChangeW(
-          SCARDCONTEXT hContext,
-          DWORD dwTimeout,
-       LPSCARD_READERSTATEW rgReaderStates,
-          DWORD cReaders);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardCancel(
-          SCARDCONTEXT hContext);
-
-
-
-
-
-
-
-
-
-
-
-                                
-
-                                
-
-                                
-                                
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardConnectA(
-          SCARDCONTEXT hContext,
-          LPCSTR szReader,
-          DWORD dwShareMode,
-          DWORD dwPreferredProtocols,
-         LPSCARDHANDLE phCard,
-         LPDWORD pdwActiveProtocol);
-extern  LONG __stdcall
-SCardConnectW(
-          SCARDCONTEXT hContext,
-          LPCWSTR szReader,
-          DWORD dwShareMode,
-          DWORD dwPreferredProtocols,
-         LPSCARDHANDLE phCard,
-         LPDWORD pdwActiveProtocol);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardReconnect(
-          SCARDHANDLE hCard,
-          DWORD dwShareMode,
-          DWORD dwPreferredProtocols,
-          DWORD dwInitialization,
-         LPDWORD pdwActiveProtocol);
-
-extern  LONG __stdcall
-SCardDisconnect(
-          SCARDHANDLE hCard,
-          DWORD dwDisposition);
-
-extern  LONG __stdcall
-SCardBeginTransaction(
-          SCARDHANDLE hCard);
-
-extern  LONG __stdcall
-SCardEndTransaction(
-          SCARDHANDLE hCard,
-          DWORD dwDisposition);
-
-extern  LONG __stdcall
-SCardCancelTransaction(
-          SCARDHANDLE hCard);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardState(
-     SCARDHANDLE hCard,
-     LPDWORD pdwState,
-     LPDWORD pdwProtocol,
-     LPBYTE pbAtr,
-      LPDWORD pcbAtrLen);
-
-
-
-
-
-extern  LONG __stdcall
-SCardStatusA(
-     SCARDHANDLE hCard,
-     LPSTR szReaderName,
-      LPDWORD pcchReaderLen,
-     LPDWORD pdwState,
-     LPDWORD pdwProtocol,
-     LPBYTE pbAtr,
-      LPDWORD pcbAtrLen);
-extern  LONG __stdcall
-SCardStatusW(
-     SCARDHANDLE hCard,
-     LPWSTR szReaderName,
-      LPDWORD pcchReaderLen,
-     LPDWORD pdwState,
-     LPDWORD pdwProtocol,
-     LPBYTE pbAtr,
-      LPDWORD pcbAtrLen);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardTransmit(
-     SCARDHANDLE hCard,
-     LPCSCARD_IO_REQUEST pioSendPci,
-     LPCBYTE pbSendBuffer,
-     DWORD cbSendLength,
-      LPSCARD_IO_REQUEST pioRecvPci,
-     LPBYTE pbRecvBuffer,
-      LPDWORD pcbRecvLength);
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardControl(
-          SCARDHANDLE hCard,
-          DWORD dwControlCode,
-          LPCVOID lpInBuffer,
-          DWORD nInBufferSize,
-         LPVOID lpOutBuffer,
-          DWORD nOutBufferSize,
-         LPDWORD lpBytesReturned);
-
-extern  LONG __stdcall
-SCardGetAttrib(
-     SCARDHANDLE hCard,
-     DWORD dwAttrId,
-     LPBYTE pbAttr,
-      LPDWORD pcbAttrLen);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardSetAttrib(
-     SCARDHANDLE hCard,
-     DWORD dwAttrId,
-     LPCBYTE pbAttr,
-     DWORD cbAttrLen);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef SCARDHANDLE (__stdcall *LPOCNCONNPROCA) ( SCARDCONTEXT,  LPSTR,  LPSTR,  PVOID);
-typedef SCARDHANDLE (__stdcall *LPOCNCONNPROCW) ( SCARDCONTEXT,  LPWSTR,  LPWSTR,  PVOID);
-
-
-
-
-
-typedef BOOL (__stdcall *LPOCNCHKPROC) ( SCARDCONTEXT,  SCARDHANDLE,  PVOID);
-typedef void (__stdcall *LPOCNDSCPROC) ( SCARDCONTEXT,  SCARDHANDLE,  PVOID);
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD           dwStructSize;
-    LPSTR           lpstrGroupNames;        
-    DWORD           nMaxGroupNames;         
-                                            
-    LPCGUID         rgguidInterfaces;       
-    DWORD           cguidInterfaces;        
-    LPSTR           lpstrCardNames;         
-    DWORD           nMaxCardNames;          
-    LPOCNCHKPROC    lpfnCheck;              
-    LPOCNCONNPROCA  lpfnConnect;            
-    LPOCNDSCPROC    lpfnDisconnect;         
-    LPVOID          pvUserData;             
-    DWORD           dwShareMode;            
-    DWORD           dwPreferredProtocols;   
-} OPENCARD_SEARCH_CRITERIAA, *POPENCARD_SEARCH_CRITERIAA, *LPOPENCARD_SEARCH_CRITERIAA;
-typedef struct {
-    DWORD           dwStructSize;
-    LPWSTR          lpstrGroupNames;        
-    DWORD           nMaxGroupNames;         
-                                            
-    LPCGUID         rgguidInterfaces;       
-    DWORD           cguidInterfaces;        
-    LPWSTR          lpstrCardNames;         
-    DWORD           nMaxCardNames;          
-    LPOCNCHKPROC    lpfnCheck;              
-    LPOCNCONNPROCW  lpfnConnect;            
-    LPOCNDSCPROC    lpfnDisconnect;         
-    LPVOID          pvUserData;             
-    DWORD           dwShareMode;            
-    DWORD           dwPreferredProtocols;   
-} OPENCARD_SEARCH_CRITERIAW, *POPENCARD_SEARCH_CRITERIAW, *LPOPENCARD_SEARCH_CRITERIAW;
-
-typedef OPENCARD_SEARCH_CRITERIAW OPENCARD_SEARCH_CRITERIA;
-typedef POPENCARD_SEARCH_CRITERIAW POPENCARD_SEARCH_CRITERIA;
-typedef LPOPENCARD_SEARCH_CRITERIAW LPOPENCARD_SEARCH_CRITERIA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD           dwStructSize;           
-    SCARDCONTEXT    hSCardContext;          
-    HWND            hwndOwner;              
-    DWORD           dwFlags;                
-    LPCSTR          lpstrTitle;             
-    LPCSTR          lpstrSearchDesc;        
-    HICON           hIcon;                  
-    POPENCARD_SEARCH_CRITERIAA pOpenCardSearchCriteria; 
-    LPOCNCONNPROCA  lpfnConnect;            
-    LPVOID          pvUserData;             
-    DWORD           dwShareMode;            
-    DWORD           dwPreferredProtocols;   
-                                            
-    LPSTR           lpstrRdr;               
-    DWORD           nMaxRdr;                
-    LPSTR           lpstrCard;              
-    DWORD           nMaxCard;               
-    DWORD           dwActiveProtocol;       
-    SCARDHANDLE     hCardHandle;            
-} OPENCARDNAME_EXA, *POPENCARDNAME_EXA, *LPOPENCARDNAME_EXA;
-typedef struct {
-    DWORD           dwStructSize;           
-    SCARDCONTEXT    hSCardContext;          
-    HWND            hwndOwner;              
-    DWORD           dwFlags;                
-    LPCWSTR         lpstrTitle;             
-    LPCWSTR         lpstrSearchDesc;        
-    HICON           hIcon;                  
-    POPENCARD_SEARCH_CRITERIAW pOpenCardSearchCriteria; 
-    LPOCNCONNPROCW  lpfnConnect;            
-    LPVOID          pvUserData;             
-    DWORD           dwShareMode;            
-    DWORD           dwPreferredProtocols;   
-                                            
-    LPWSTR          lpstrRdr;               
-    DWORD           nMaxRdr;                
-    LPWSTR          lpstrCard;              
-    DWORD           nMaxCard;               
-    DWORD           dwActiveProtocol;       
-    SCARDHANDLE     hCardHandle;            
-} OPENCARDNAME_EXW, *POPENCARDNAME_EXW, *LPOPENCARDNAME_EXW;
-
-typedef OPENCARDNAME_EXW OPENCARDNAME_EX;
-typedef POPENCARDNAME_EXW POPENCARDNAME_EX;
-typedef LPOPENCARDNAME_EXW LPOPENCARDNAME_EX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardUIDlgSelectCardA(
-    LPOPENCARDNAME_EXA);
-extern  LONG __stdcall
-SCardUIDlgSelectCardW(
-    LPOPENCARDNAME_EXW);
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD           dwStructSize;
-    HWND            hwndOwner;
-    SCARDCONTEXT    hSCardContext;
-    LPSTR           lpstrGroupNames;
-    DWORD           nMaxGroupNames;
-    LPSTR           lpstrCardNames;
-    DWORD           nMaxCardNames;
-    LPCGUID         rgguidInterfaces;
-    DWORD           cguidInterfaces;
-    LPSTR           lpstrRdr;
-    DWORD           nMaxRdr;
-    LPSTR           lpstrCard;
-    DWORD           nMaxCard;
-    LPCSTR          lpstrTitle;
-    DWORD           dwFlags;
-    LPVOID          pvUserData;
-    DWORD           dwShareMode;
-    DWORD           dwPreferredProtocols;
-    DWORD           dwActiveProtocol;
-    LPOCNCONNPROCA  lpfnConnect;
-    LPOCNCHKPROC    lpfnCheck;
-    LPOCNDSCPROC    lpfnDisconnect;
-    SCARDHANDLE     hCardHandle;
-} OPENCARDNAMEA, *POPENCARDNAMEA, *LPOPENCARDNAMEA;
-typedef struct {
-    DWORD           dwStructSize;
-    HWND            hwndOwner;
-    SCARDCONTEXT    hSCardContext;
-    LPWSTR          lpstrGroupNames;
-    DWORD           nMaxGroupNames;
-    LPWSTR          lpstrCardNames;
-    DWORD           nMaxCardNames;
-    LPCGUID         rgguidInterfaces;
-    DWORD           cguidInterfaces;
-    LPWSTR          lpstrRdr;
-    DWORD           nMaxRdr;
-    LPWSTR          lpstrCard;
-    DWORD           nMaxCard;
-    LPCWSTR         lpstrTitle;
-    DWORD           dwFlags;
-    LPVOID          pvUserData;
-    DWORD           dwShareMode;
-    DWORD           dwPreferredProtocols;
-    DWORD           dwActiveProtocol;
-    LPOCNCONNPROCW  lpfnConnect;
-    LPOCNCHKPROC    lpfnCheck;
-    LPOCNDSCPROC    lpfnDisconnect;
-    SCARDHANDLE     hCardHandle;
-} OPENCARDNAMEW, *POPENCARDNAMEW, *LPOPENCARDNAMEW;
-
-typedef OPENCARDNAMEW OPENCARDNAME;
-typedef POPENCARDNAMEW POPENCARDNAME;
-typedef LPOPENCARDNAMEW LPOPENCARDNAME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-GetOpenCardNameA(
-    LPOPENCARDNAMEA);
-extern  LONG __stdcall
-GetOpenCardNameW(
-    LPOPENCARDNAMEW);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardDlgExtendedError (void);
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,4)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _PSP;
-typedef struct _PSP * HPROPSHEETPAGE;
-
-
-struct _PROPSHEETPAGEA;
-struct _PROPSHEETPAGEW;
-
-
-typedef UINT (__stdcall *LPFNPSPCALLBACKA)(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEA *ppsp);
-typedef UINT (__stdcall *LPFNPSPCALLBACKW)(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEW *ppsp);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LPCDLGTEMPLATE PROPSHEETPAGE_RESOURCE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PROPSHEETPAGEA_V1
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;
-} PROPSHEETPAGEA_V1, *LPPROPSHEETPAGEA_V1;
-typedef const PROPSHEETPAGEA_V1 *LPCPROPSHEETPAGEA_V1;
-
-typedef struct _PROPSHEETPAGEA_V2
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;
-
-    LPCSTR           pszHeaderTitle;    
-    LPCSTR           pszHeaderSubTitle; 
-} PROPSHEETPAGEA_V2, *LPPROPSHEETPAGEA_V2;
-typedef const PROPSHEETPAGEA_V2 *LPCPROPSHEETPAGEA_V2;
-
-typedef struct _PROPSHEETPAGEA
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;
-
-    LPCSTR           pszHeaderTitle;    
-    LPCSTR           pszHeaderSubTitle; 
-
-    HANDLE           hActCtx;
-} PROPSHEETPAGEA_V3, *LPPROPSHEETPAGEA_V3;
-typedef const PROPSHEETPAGEA_V3 *LPCPROPSHEETPAGEA_V3;
-
-
-typedef struct _PROPSHEETPAGEW_V1
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;
-} PROPSHEETPAGEW_V1, *LPPROPSHEETPAGEW_V1;
-typedef const PROPSHEETPAGEW_V1 *LPCPROPSHEETPAGEW_V1;
-
-typedef struct _PROPSHEETPAGEW_V2
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;
-
-    LPCWSTR           pszHeaderTitle;    
-    LPCWSTR           pszHeaderSubTitle; 
-} PROPSHEETPAGEW_V2, *LPPROPSHEETPAGEW_V2;
-typedef const PROPSHEETPAGEW_V2 *LPCPROPSHEETPAGEW_V2;
-
-typedef struct _PROPSHEETPAGEW
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;
-
-    LPCWSTR           pszHeaderTitle;    
-    LPCWSTR           pszHeaderSubTitle; 
-
-    HANDLE           hActCtx;
-} PROPSHEETPAGEW_V3, *LPPROPSHEETPAGEW_V3;
-typedef const PROPSHEETPAGEW_V3 *LPCPROPSHEETPAGEW_V3;
-
-typedef    PROPSHEETPAGEA_V3    PROPSHEETPAGEA_LATEST;
-typedef    PROPSHEETPAGEW_V3    PROPSHEETPAGEW_LATEST;
-typedef  LPPROPSHEETPAGEA_V3  LPPROPSHEETPAGEA_LATEST;
-typedef  LPPROPSHEETPAGEW_V3  LPPROPSHEETPAGEW_LATEST;
-typedef LPCPROPSHEETPAGEA_V3 LPCPROPSHEETPAGEA_LATEST;
-typedef LPCPROPSHEETPAGEW_V3 LPCPROPSHEETPAGEW_LATEST;
-
-
-typedef    PROPSHEETPAGEA_V3    PROPSHEETPAGEA;
-typedef    PROPSHEETPAGEW_V3    PROPSHEETPAGEW;
-typedef  LPPROPSHEETPAGEA_V3  LPPROPSHEETPAGEA;
-typedef  LPPROPSHEETPAGEW_V3  LPPROPSHEETPAGEW;
-typedef LPCPROPSHEETPAGEA_V3 LPCPROPSHEETPAGEA;
-typedef LPCPROPSHEETPAGEW_V3 LPCPROPSHEETPAGEW;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef int (__stdcall *PFNPROPSHEETCALLBACK)(HWND, UINT, LPARAM);
-
-
-
-
-
-
-
-typedef struct _PROPSHEETHEADERA 
-{
-        DWORD           dwSize;
-        DWORD           dwFlags;
-        HWND            hwndParent;
-        HINSTANCE       hInstance;
-        union 
-        {
-            HICON       hIcon;
-            LPCSTR      pszIcon;
-        } ;
-        LPCSTR          pszCaption;
-
-        UINT            nPages;
-        union 
-        {
-            UINT        nStartPage;
-            LPCSTR      pStartPage;
-        } ;
-        union 
-        {
-            LPCPROPSHEETPAGEA ppsp;
-            HPROPSHEETPAGE *phpage;
-        } ;
-        PFNPROPSHEETCALLBACK pfnCallback;
-
-
-        union 
-        {
-            HBITMAP hbmWatermark;
-            LPCSTR pszbmWatermark;
-        } ;
-        HPALETTE hplWatermark;
-        union 
-        {
-            HBITMAP hbmHeader;     
-            LPCSTR pszbmHeader;
-        } ;
-
-} PROPSHEETHEADERA, *LPPROPSHEETHEADERA;
-
-typedef const PROPSHEETHEADERA *LPCPROPSHEETHEADERA;
-
-typedef struct _PROPSHEETHEADERW 
-{
-        DWORD           dwSize;
-        DWORD           dwFlags;
-        HWND            hwndParent;
-        HINSTANCE       hInstance;
-        union 
-        {
-            HICON       hIcon;
-            LPCWSTR     pszIcon;
-        } ;
-        LPCWSTR         pszCaption;
-
-
-        UINT            nPages;
-        union 
-        {
-            UINT        nStartPage;
-            LPCWSTR     pStartPage;
-        } ;
-        union 
-        {
-            LPCPROPSHEETPAGEW ppsp;
-            HPROPSHEETPAGE *phpage;
-        } ;
-        PFNPROPSHEETCALLBACK pfnCallback;
-
-
-        union 
-        {
-            HBITMAP hbmWatermark;
-            LPCWSTR pszbmWatermark;
-        } ;
-        HPALETTE hplWatermark;
-        union 
-        {
-            HBITMAP hbmHeader;
-            LPCWSTR pszbmHeader;
-        } ;
-
-} PROPSHEETHEADERW, *LPPROPSHEETHEADERW;
-typedef const PROPSHEETHEADERW *LPCPROPSHEETHEADERW;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) HPROPSHEETPAGE __stdcall CreatePropertySheetPageA(LPCPROPSHEETPAGEA constPropSheetPagePointer);
-__declspec(dllimport) HPROPSHEETPAGE __stdcall CreatePropertySheetPageW(LPCPROPSHEETPAGEW constPropSheetPagePointer);
-__declspec(dllimport) BOOL           __stdcall DestroyPropertySheetPage(HPROPSHEETPAGE);
-
-__declspec(dllimport) INT_PTR        __stdcall PropertySheetA(LPCPROPSHEETHEADERA);
-
-__declspec(dllimport) INT_PTR        __stdcall PropertySheetW(LPCPROPSHEETHEADERW);
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM);
-typedef BOOL (__stdcall *LPFNADDPROPSHEETPAGES)(LPVOID, LPFNADDPROPSHEETPAGE, LPARAM);
-
-
-typedef struct _PSHNOTIFY
-{
-    NMHDR hdr;
-    LPARAM lParam;
-} PSHNOTIFY, *LPPSHNOTIFY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-typedef struct _PRINTER_INFO_1A {
-    DWORD   Flags;
-    LPSTR   pDescription;
-    LPSTR   pName;
-    LPSTR   pComment;
-} PRINTER_INFO_1A, *PPRINTER_INFO_1A, *LPPRINTER_INFO_1A;
-typedef struct _PRINTER_INFO_1W {
-    DWORD   Flags;
-    LPWSTR  pDescription;
-    LPWSTR  pName;
-    LPWSTR  pComment;
-} PRINTER_INFO_1W, *PPRINTER_INFO_1W, *LPPRINTER_INFO_1W;
-
-typedef PRINTER_INFO_1W PRINTER_INFO_1;
-typedef PPRINTER_INFO_1W PPRINTER_INFO_1;
-typedef LPPRINTER_INFO_1W LPPRINTER_INFO_1;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_2A {
-    LPSTR     pServerName;
-    LPSTR     pPrinterName;
-    LPSTR     pShareName;
-    LPSTR     pPortName;
-    LPSTR     pDriverName;
-    LPSTR     pComment;
-    LPSTR     pLocation;
-    LPDEVMODEA pDevMode;
-    LPSTR     pSepFile;
-    LPSTR     pPrintProcessor;
-    LPSTR     pDatatype;
-    LPSTR     pParameters;
-    PSECURITY_DESCRIPTOR pSecurityDescriptor;
-    DWORD   Attributes;
-    DWORD   Priority;
-    DWORD   DefaultPriority;
-    DWORD   StartTime;
-    DWORD   UntilTime;
-    DWORD   Status;
-    DWORD   cJobs;
-    DWORD   AveragePPM;
-} PRINTER_INFO_2A, *PPRINTER_INFO_2A, *LPPRINTER_INFO_2A;
-typedef struct _PRINTER_INFO_2W {
-    LPWSTR    pServerName;
-    LPWSTR    pPrinterName;
-    LPWSTR    pShareName;
-    LPWSTR    pPortName;
-    LPWSTR    pDriverName;
-    LPWSTR    pComment;
-    LPWSTR    pLocation;
-    LPDEVMODEW pDevMode;
-    LPWSTR    pSepFile;
-    LPWSTR    pPrintProcessor;
-    LPWSTR    pDatatype;
-    LPWSTR    pParameters;
-    PSECURITY_DESCRIPTOR pSecurityDescriptor;
-    DWORD   Attributes;
-    DWORD   Priority;
-    DWORD   DefaultPriority;
-    DWORD   StartTime;
-    DWORD   UntilTime;
-    DWORD   Status;
-    DWORD   cJobs;
-    DWORD   AveragePPM;
-} PRINTER_INFO_2W, *PPRINTER_INFO_2W, *LPPRINTER_INFO_2W;
-
-typedef PRINTER_INFO_2W PRINTER_INFO_2;
-typedef PPRINTER_INFO_2W PPRINTER_INFO_2;
-typedef LPPRINTER_INFO_2W LPPRINTER_INFO_2;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_3 {
-    PSECURITY_DESCRIPTOR pSecurityDescriptor;
-} PRINTER_INFO_3, *PPRINTER_INFO_3, *LPPRINTER_INFO_3;
-
-typedef struct _PRINTER_INFO_4A {
-    LPSTR   pPrinterName;
-    LPSTR   pServerName;
-    DWORD   Attributes;
-} PRINTER_INFO_4A, *PPRINTER_INFO_4A, *LPPRINTER_INFO_4A;
-typedef struct _PRINTER_INFO_4W {
-    LPWSTR  pPrinterName;
-    LPWSTR  pServerName;
-    DWORD   Attributes;
-} PRINTER_INFO_4W, *PPRINTER_INFO_4W, *LPPRINTER_INFO_4W;
-
-typedef PRINTER_INFO_4W PRINTER_INFO_4;
-typedef PPRINTER_INFO_4W PPRINTER_INFO_4;
-typedef LPPRINTER_INFO_4W LPPRINTER_INFO_4;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_5A {
-    LPSTR   pPrinterName;
-    LPSTR   pPortName;
-    DWORD   Attributes;
-    DWORD   DeviceNotSelectedTimeout;
-    DWORD   TransmissionRetryTimeout;
-} PRINTER_INFO_5A, *PPRINTER_INFO_5A, *LPPRINTER_INFO_5A;
-typedef struct _PRINTER_INFO_5W {
-    LPWSTR  pPrinterName;
-    LPWSTR  pPortName;
-    DWORD   Attributes;
-    DWORD   DeviceNotSelectedTimeout;
-    DWORD   TransmissionRetryTimeout;
-} PRINTER_INFO_5W, *PPRINTER_INFO_5W, *LPPRINTER_INFO_5W;
-
-typedef PRINTER_INFO_5W PRINTER_INFO_5;
-typedef PPRINTER_INFO_5W PPRINTER_INFO_5;
-typedef LPPRINTER_INFO_5W LPPRINTER_INFO_5;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_6 {
-    DWORD   dwStatus;
-} PRINTER_INFO_6, *PPRINTER_INFO_6, *LPPRINTER_INFO_6;
-
-typedef struct _PRINTER_INFO_7A {
-  LPSTR    pszObjectGUID;
-  DWORD    dwAction;
-} PRINTER_INFO_7A, *PPRINTER_INFO_7A, *LPPRINTER_INFO_7A;
-typedef struct _PRINTER_INFO_7W {
-  LPWSTR   pszObjectGUID;
-  DWORD    dwAction;
-} PRINTER_INFO_7W, *PPRINTER_INFO_7W, *LPPRINTER_INFO_7W;
-
-typedef PRINTER_INFO_7W PRINTER_INFO_7;
-typedef PPRINTER_INFO_7W PPRINTER_INFO_7;
-typedef LPPRINTER_INFO_7W LPPRINTER_INFO_7;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_8A {
-    LPDEVMODEA pDevMode;
-} PRINTER_INFO_8A, *PPRINTER_INFO_8A, *LPPRINTER_INFO_8A;
-typedef struct _PRINTER_INFO_8W {
-    LPDEVMODEW pDevMode;
-} PRINTER_INFO_8W, *PPRINTER_INFO_8W, *LPPRINTER_INFO_8W;
-
-typedef PRINTER_INFO_8W PRINTER_INFO_8;
-typedef PPRINTER_INFO_8W PPRINTER_INFO_8;
-typedef LPPRINTER_INFO_8W LPPRINTER_INFO_8;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_9A {
-    LPDEVMODEA pDevMode;
-} PRINTER_INFO_9A, *PPRINTER_INFO_9A, *LPPRINTER_INFO_9A;
-typedef struct _PRINTER_INFO_9W {
-    LPDEVMODEW pDevMode;
-} PRINTER_INFO_9W, *PPRINTER_INFO_9W, *LPPRINTER_INFO_9W;
-
-typedef PRINTER_INFO_9W PRINTER_INFO_9;
-typedef PPRINTER_INFO_9W PPRINTER_INFO_9;
-typedef LPPRINTER_INFO_9W LPPRINTER_INFO_9;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _JOB_INFO_1A {
-   DWORD    JobId;
-   LPSTR      pPrinterName;
-   LPSTR      pMachineName;
-   LPSTR      pUserName;
-   LPSTR      pDocument;
-   LPSTR      pDatatype;
-   LPSTR      pStatus;
-   DWORD    Status;
-   DWORD    Priority;
-   DWORD    Position;
-   DWORD    TotalPages;
-   DWORD    PagesPrinted;
-   SYSTEMTIME Submitted;
-} JOB_INFO_1A, *PJOB_INFO_1A, *LPJOB_INFO_1A;
-typedef struct _JOB_INFO_1W {
-   DWORD    JobId;
-   LPWSTR     pPrinterName;
-   LPWSTR     pMachineName;
-   LPWSTR     pUserName;
-   LPWSTR     pDocument;
-   LPWSTR     pDatatype;
-   LPWSTR     pStatus;
-   DWORD    Status;
-   DWORD    Priority;
-   DWORD    Position;
-   DWORD    TotalPages;
-   DWORD    PagesPrinted;
-   SYSTEMTIME Submitted;
-} JOB_INFO_1W, *PJOB_INFO_1W, *LPJOB_INFO_1W;
-
-typedef JOB_INFO_1W JOB_INFO_1;
-typedef PJOB_INFO_1W PJOB_INFO_1;
-typedef LPJOB_INFO_1W LPJOB_INFO_1;
-
-
-
-
-
-
-typedef struct _JOB_INFO_2A {
-   DWORD    JobId;
-   LPSTR      pPrinterName;
-   LPSTR      pMachineName;
-   LPSTR      pUserName;
-   LPSTR      pDocument;
-   LPSTR      pNotifyName;
-   LPSTR      pDatatype;
-   LPSTR      pPrintProcessor;
-   LPSTR      pParameters;
-   LPSTR      pDriverName;
-   LPDEVMODEA pDevMode;
-   LPSTR      pStatus;
-   PSECURITY_DESCRIPTOR pSecurityDescriptor;
-   DWORD    Status;
-   DWORD    Priority;
-   DWORD    Position;
-   DWORD    StartTime;
-   DWORD    UntilTime;
-   DWORD    TotalPages;
-   DWORD    Size;
-   SYSTEMTIME Submitted;    
-   DWORD    Time;           
-   DWORD    PagesPrinted;
-} JOB_INFO_2A, *PJOB_INFO_2A, *LPJOB_INFO_2A;
-typedef struct _JOB_INFO_2W {
-   DWORD    JobId;
-   LPWSTR     pPrinterName;
-   LPWSTR     pMachineName;
-   LPWSTR     pUserName;
-   LPWSTR     pDocument;
-   LPWSTR     pNotifyName;
-   LPWSTR     pDatatype;
-   LPWSTR     pPrintProcessor;
-   LPWSTR     pParameters;
-   LPWSTR     pDriverName;
-   LPDEVMODEW pDevMode;
-   LPWSTR     pStatus;
-   PSECURITY_DESCRIPTOR pSecurityDescriptor;
-   DWORD    Status;
-   DWORD    Priority;
-   DWORD    Position;
-   DWORD    StartTime;
-   DWORD    UntilTime;
-   DWORD    TotalPages;
-   DWORD    Size;
-   SYSTEMTIME Submitted;    
-   DWORD    Time;           
-   DWORD    PagesPrinted;
-} JOB_INFO_2W, *PJOB_INFO_2W, *LPJOB_INFO_2W;
-
-typedef JOB_INFO_2W JOB_INFO_2;
-typedef PJOB_INFO_2W PJOB_INFO_2;
-typedef LPJOB_INFO_2W LPJOB_INFO_2;
-
-
-
-
-
-
-typedef struct _JOB_INFO_3 {
-    DWORD   JobId;
-    DWORD   NextJobId;
-    DWORD   Reserved;
-} JOB_INFO_3, *PJOB_INFO_3, *LPJOB_INFO_3;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ADDJOB_INFO_1A {
-    LPSTR     Path;
-    DWORD   JobId;
-} ADDJOB_INFO_1A, *PADDJOB_INFO_1A, *LPADDJOB_INFO_1A;
-typedef struct _ADDJOB_INFO_1W {
-    LPWSTR    Path;
-    DWORD   JobId;
-} ADDJOB_INFO_1W, *PADDJOB_INFO_1W, *LPADDJOB_INFO_1W;
-
-typedef ADDJOB_INFO_1W ADDJOB_INFO_1;
-typedef PADDJOB_INFO_1W PADDJOB_INFO_1;
-typedef LPADDJOB_INFO_1W LPADDJOB_INFO_1;
-
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_1A {
-    LPSTR     pName;              
-} DRIVER_INFO_1A, *PDRIVER_INFO_1A, *LPDRIVER_INFO_1A;
-typedef struct _DRIVER_INFO_1W {
-    LPWSTR    pName;              
-} DRIVER_INFO_1W, *PDRIVER_INFO_1W, *LPDRIVER_INFO_1W;
-
-typedef DRIVER_INFO_1W DRIVER_INFO_1;
-typedef PDRIVER_INFO_1W PDRIVER_INFO_1;
-typedef LPDRIVER_INFO_1W LPDRIVER_INFO_1;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_2A {
-    DWORD   cVersion;
-    LPSTR     pName;              
-    LPSTR     pEnvironment;       
-    LPSTR     pDriverPath;        
-    LPSTR     pDataFile;          
-    LPSTR     pConfigFile;        
-} DRIVER_INFO_2A, *PDRIVER_INFO_2A, *LPDRIVER_INFO_2A;
-typedef struct _DRIVER_INFO_2W {
-    DWORD   cVersion;
-    LPWSTR    pName;              
-    LPWSTR    pEnvironment;       
-    LPWSTR    pDriverPath;        
-    LPWSTR    pDataFile;          
-    LPWSTR    pConfigFile;        
-} DRIVER_INFO_2W, *PDRIVER_INFO_2W, *LPDRIVER_INFO_2W;
-
-typedef DRIVER_INFO_2W DRIVER_INFO_2;
-typedef PDRIVER_INFO_2W PDRIVER_INFO_2;
-typedef LPDRIVER_INFO_2W LPDRIVER_INFO_2;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_3A {
-    DWORD   cVersion;
-    LPSTR     pName;                    
-    LPSTR     pEnvironment;             
-    LPSTR     pDriverPath;              
-    LPSTR     pDataFile;                
-    LPSTR     pConfigFile;              
-    LPSTR     pHelpFile;                
-    LPSTR     pDependentFiles;          
-    LPSTR     pMonitorName;             
-    LPSTR     pDefaultDataType;         
-} DRIVER_INFO_3A, *PDRIVER_INFO_3A, *LPDRIVER_INFO_3A;
-typedef struct _DRIVER_INFO_3W {
-    DWORD   cVersion;
-    LPWSTR    pName;                    
-    LPWSTR    pEnvironment;             
-    LPWSTR    pDriverPath;              
-    LPWSTR    pDataFile;                
-    LPWSTR    pConfigFile;              
-    LPWSTR    pHelpFile;                
-    LPWSTR    pDependentFiles;          
-    LPWSTR    pMonitorName;             
-    LPWSTR    pDefaultDataType;         
-} DRIVER_INFO_3W, *PDRIVER_INFO_3W, *LPDRIVER_INFO_3W;
-
-typedef DRIVER_INFO_3W DRIVER_INFO_3;
-typedef PDRIVER_INFO_3W PDRIVER_INFO_3;
-typedef LPDRIVER_INFO_3W LPDRIVER_INFO_3;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_4A {
-    DWORD   cVersion;
-    LPSTR     pName;                    
-    LPSTR     pEnvironment;             
-    LPSTR     pDriverPath;              
-    LPSTR     pDataFile;                
-    LPSTR     pConfigFile;              
-    LPSTR     pHelpFile;                
-    LPSTR     pDependentFiles;          
-    LPSTR     pMonitorName;             
-    LPSTR     pDefaultDataType;         
-    LPSTR     pszzPreviousNames;        
-} DRIVER_INFO_4A, *PDRIVER_INFO_4A, *LPDRIVER_INFO_4A;
-typedef struct _DRIVER_INFO_4W {
-    DWORD   cVersion;
-    LPWSTR    pName;                    
-    LPWSTR    pEnvironment;             
-    LPWSTR    pDriverPath;              
-    LPWSTR    pDataFile;                
-    LPWSTR    pConfigFile;              
-    LPWSTR    pHelpFile;                
-    LPWSTR    pDependentFiles;          
-    LPWSTR    pMonitorName;             
-    LPWSTR    pDefaultDataType;         
-    LPWSTR    pszzPreviousNames;        
-} DRIVER_INFO_4W, *PDRIVER_INFO_4W, *LPDRIVER_INFO_4W;
-
-typedef DRIVER_INFO_4W DRIVER_INFO_4;
-typedef PDRIVER_INFO_4W PDRIVER_INFO_4;
-typedef LPDRIVER_INFO_4W LPDRIVER_INFO_4;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_5A {
-    DWORD   cVersion;
-    LPSTR     pName;                    
-    LPSTR     pEnvironment;             
-    LPSTR     pDriverPath;              
-    LPSTR     pDataFile;                
-    LPSTR     pConfigFile;              
-    DWORD     dwDriverAttributes;       
-    DWORD     dwConfigVersion;          
-    DWORD     dwDriverVersion;          
-} DRIVER_INFO_5A, *PDRIVER_INFO_5A, *LPDRIVER_INFO_5A;
-typedef struct _DRIVER_INFO_5W {
-    DWORD   cVersion;
-    LPWSTR    pName;                    
-    LPWSTR    pEnvironment;             
-    LPWSTR    pDriverPath;              
-    LPWSTR    pDataFile;                
-    LPWSTR    pConfigFile;              
-    DWORD     dwDriverAttributes;       
-    DWORD     dwConfigVersion;          
-    DWORD     dwDriverVersion;          
-} DRIVER_INFO_5W, *PDRIVER_INFO_5W, *LPDRIVER_INFO_5W;
-
-typedef DRIVER_INFO_5W DRIVER_INFO_5;
-typedef PDRIVER_INFO_5W PDRIVER_INFO_5;
-typedef LPDRIVER_INFO_5W LPDRIVER_INFO_5;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_6A {
-    DWORD     cVersion;
-    LPSTR     pName;                    
-    LPSTR     pEnvironment;             
-    LPSTR     pDriverPath;              
-    LPSTR     pDataFile;                
-    LPSTR     pConfigFile;              
-    LPSTR     pHelpFile;                
-    LPSTR     pDependentFiles;          
-    LPSTR     pMonitorName;             
-    LPSTR     pDefaultDataType;         
-    LPSTR     pszzPreviousNames;        
-    FILETIME  ftDriverDate;
-    DWORDLONG dwlDriverVersion;
-    LPSTR      pszMfgName;
-    LPSTR      pszOEMUrl;
-    LPSTR      pszHardwareID;
-    LPSTR      pszProvider;
-} DRIVER_INFO_6A, *PDRIVER_INFO_6A, *LPDRIVER_INFO_6A;
-typedef struct _DRIVER_INFO_6W {
-    DWORD     cVersion;
-    LPWSTR    pName;                    
-    LPWSTR    pEnvironment;             
-    LPWSTR    pDriverPath;              
-    LPWSTR    pDataFile;                
-    LPWSTR    pConfigFile;              
-    LPWSTR    pHelpFile;                
-    LPWSTR    pDependentFiles;          
-    LPWSTR    pMonitorName;             
-    LPWSTR    pDefaultDataType;         
-    LPWSTR    pszzPreviousNames;        
-    FILETIME  ftDriverDate;
-    DWORDLONG dwlDriverVersion;
-    LPWSTR     pszMfgName;
-    LPWSTR     pszOEMUrl;
-    LPWSTR     pszHardwareID;
-    LPWSTR     pszProvider;
-} DRIVER_INFO_6W, *PDRIVER_INFO_6W, *LPDRIVER_INFO_6W;
-
-typedef DRIVER_INFO_6W DRIVER_INFO_6;
-typedef PDRIVER_INFO_6W PDRIVER_INFO_6;
-typedef LPDRIVER_INFO_6W LPDRIVER_INFO_6;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DOC_INFO_1A {
-    LPSTR     pDocName;
-    LPSTR     pOutputFile;
-    LPSTR     pDatatype;
-} DOC_INFO_1A, *PDOC_INFO_1A, *LPDOC_INFO_1A;
-typedef struct _DOC_INFO_1W {
-    LPWSTR    pDocName;
-    LPWSTR    pOutputFile;
-    LPWSTR    pDatatype;
-} DOC_INFO_1W, *PDOC_INFO_1W, *LPDOC_INFO_1W;
-
-typedef DOC_INFO_1W DOC_INFO_1;
-typedef PDOC_INFO_1W PDOC_INFO_1;
-typedef LPDOC_INFO_1W LPDOC_INFO_1;
-
-
-
-
-
-
-typedef struct _FORM_INFO_1A {
-    DWORD   Flags;
-    LPSTR     pName;
-    SIZEL   Size;
-    RECTL   ImageableArea;
-} FORM_INFO_1A, *PFORM_INFO_1A, *LPFORM_INFO_1A;
-typedef struct _FORM_INFO_1W {
-    DWORD   Flags;
-    LPWSTR    pName;
-    SIZEL   Size;
-    RECTL   ImageableArea;
-} FORM_INFO_1W, *PFORM_INFO_1W, *LPFORM_INFO_1W;
-
-typedef FORM_INFO_1W FORM_INFO_1;
-typedef PFORM_INFO_1W PFORM_INFO_1;
-typedef LPFORM_INFO_1W LPFORM_INFO_1;
-
-
-
-
-
-
-typedef struct _DOC_INFO_2A {
-    LPSTR     pDocName;
-    LPSTR     pOutputFile;
-    LPSTR     pDatatype;
-    DWORD   dwMode;
-    DWORD   JobId;
-} DOC_INFO_2A, *PDOC_INFO_2A, *LPDOC_INFO_2A;
-typedef struct _DOC_INFO_2W {
-    LPWSTR    pDocName;
-    LPWSTR    pOutputFile;
-    LPWSTR    pDatatype;
-    DWORD   dwMode;
-    DWORD   JobId;
-} DOC_INFO_2W, *PDOC_INFO_2W, *LPDOC_INFO_2W;
-
-typedef DOC_INFO_2W DOC_INFO_2;
-typedef PDOC_INFO_2W PDOC_INFO_2;
-typedef LPDOC_INFO_2W LPDOC_INFO_2;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DOC_INFO_3A {
-    LPSTR     pDocName;
-    LPSTR     pOutputFile;
-    LPSTR     pDatatype;
-    DWORD     dwFlags;
-} DOC_INFO_3A, *PDOC_INFO_3A, *LPDOC_INFO_3A;
-typedef struct _DOC_INFO_3W {
-    LPWSTR    pDocName;
-    LPWSTR    pOutputFile;
-    LPWSTR    pDatatype;
-    DWORD     dwFlags;
-} DOC_INFO_3W, *PDOC_INFO_3W, *LPDOC_INFO_3W;
-
-typedef DOC_INFO_3W DOC_INFO_3;
-typedef PDOC_INFO_3W PDOC_INFO_3;
-typedef LPDOC_INFO_3W LPDOC_INFO_3;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PRINTPROCESSOR_INFO_1A {
-    LPSTR     pName;
-} PRINTPROCESSOR_INFO_1A, *PPRINTPROCESSOR_INFO_1A, *LPPRINTPROCESSOR_INFO_1A;
-typedef struct _PRINTPROCESSOR_INFO_1W {
-    LPWSTR    pName;
-} PRINTPROCESSOR_INFO_1W, *PPRINTPROCESSOR_INFO_1W, *LPPRINTPROCESSOR_INFO_1W;
-
-typedef PRINTPROCESSOR_INFO_1W PRINTPROCESSOR_INFO_1;
-typedef PPRINTPROCESSOR_INFO_1W PPRINTPROCESSOR_INFO_1;
-typedef LPPRINTPROCESSOR_INFO_1W LPPRINTPROCESSOR_INFO_1;
-
-
-
-
-
-
-typedef struct _PRINTPROCESSOR_CAPS_1 {
-    DWORD     dwLevel;
-    DWORD     dwNupOptions;
-    DWORD     dwPageOrderFlags;
-    DWORD     dwNumberOfCopies;
-} PRINTPROCESSOR_CAPS_1, *PPRINTPROCESSOR_CAPS_1;
-
-
-
-
-typedef struct _PORT_INFO_1A {
-    LPSTR     pName;
-} PORT_INFO_1A, *PPORT_INFO_1A, *LPPORT_INFO_1A;
-typedef struct _PORT_INFO_1W {
-    LPWSTR    pName;
-} PORT_INFO_1W, *PPORT_INFO_1W, *LPPORT_INFO_1W;
-
-typedef PORT_INFO_1W PORT_INFO_1;
-typedef PPORT_INFO_1W PPORT_INFO_1;
-typedef LPPORT_INFO_1W LPPORT_INFO_1;
-
-
-
-
-
-
-typedef struct _PORT_INFO_2A {
-    LPSTR     pPortName;
-    LPSTR     pMonitorName;
-    LPSTR     pDescription;
-    DWORD     fPortType;
-    DWORD     Reserved;
-} PORT_INFO_2A, *PPORT_INFO_2A, *LPPORT_INFO_2A;
-typedef struct _PORT_INFO_2W {
-    LPWSTR    pPortName;
-    LPWSTR    pMonitorName;
-    LPWSTR    pDescription;
-    DWORD     fPortType;
-    DWORD     Reserved;
-} PORT_INFO_2W, *PPORT_INFO_2W, *LPPORT_INFO_2W;
-
-typedef PORT_INFO_2W PORT_INFO_2;
-typedef PPORT_INFO_2W PPORT_INFO_2;
-typedef LPPORT_INFO_2W LPPORT_INFO_2;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PORT_INFO_3A {
-    DWORD   dwStatus;
-    LPSTR   pszStatus;
-    DWORD   dwSeverity;
-} PORT_INFO_3A, *PPORT_INFO_3A, *LPPORT_INFO_3A;
-typedef struct _PORT_INFO_3W {
-    DWORD   dwStatus;
-    LPWSTR  pszStatus;
-    DWORD   dwSeverity;
-} PORT_INFO_3W, *PPORT_INFO_3W, *LPPORT_INFO_3W;
-
-typedef PORT_INFO_3W PORT_INFO_3;
-typedef PPORT_INFO_3W PPORT_INFO_3;
-typedef LPPORT_INFO_3W LPPORT_INFO_3;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _MONITOR_INFO_1A{
-    LPSTR     pName;
-} MONITOR_INFO_1A, *PMONITOR_INFO_1A, *LPMONITOR_INFO_1A;
-typedef struct _MONITOR_INFO_1W{
-    LPWSTR    pName;
-} MONITOR_INFO_1W, *PMONITOR_INFO_1W, *LPMONITOR_INFO_1W;
-
-typedef MONITOR_INFO_1W MONITOR_INFO_1;
-typedef PMONITOR_INFO_1W PMONITOR_INFO_1;
-typedef LPMONITOR_INFO_1W LPMONITOR_INFO_1;
-
-
-
-
-
-
-typedef struct _MONITOR_INFO_2A{
-    LPSTR     pName;
-    LPSTR     pEnvironment;
-    LPSTR     pDLLName;
-} MONITOR_INFO_2A, *PMONITOR_INFO_2A, *LPMONITOR_INFO_2A;
-typedef struct _MONITOR_INFO_2W{
-    LPWSTR    pName;
-    LPWSTR    pEnvironment;
-    LPWSTR    pDLLName;
-} MONITOR_INFO_2W, *PMONITOR_INFO_2W, *LPMONITOR_INFO_2W;
-
-typedef MONITOR_INFO_2W MONITOR_INFO_2;
-typedef PMONITOR_INFO_2W PMONITOR_INFO_2;
-typedef LPMONITOR_INFO_2W LPMONITOR_INFO_2;
-
-
-
-
-
-
-typedef struct _DATATYPES_INFO_1A{
-    LPSTR     pName;
-} DATATYPES_INFO_1A, *PDATATYPES_INFO_1A, *LPDATATYPES_INFO_1A;
-typedef struct _DATATYPES_INFO_1W{
-    LPWSTR    pName;
-} DATATYPES_INFO_1W, *PDATATYPES_INFO_1W, *LPDATATYPES_INFO_1W;
-
-typedef DATATYPES_INFO_1W DATATYPES_INFO_1;
-typedef PDATATYPES_INFO_1W PDATATYPES_INFO_1;
-typedef LPDATATYPES_INFO_1W LPDATATYPES_INFO_1;
-
-
-
-
-
-
-typedef struct _PRINTER_DEFAULTSA{
-    LPSTR         pDatatype;
-    LPDEVMODEA pDevMode;
-    ACCESS_MASK DesiredAccess;
-} PRINTER_DEFAULTSA, *PPRINTER_DEFAULTSA, *LPPRINTER_DEFAULTSA;
-typedef struct _PRINTER_DEFAULTSW{
-    LPWSTR        pDatatype;
-    LPDEVMODEW pDevMode;
-    ACCESS_MASK DesiredAccess;
-} PRINTER_DEFAULTSW, *PPRINTER_DEFAULTSW, *LPPRINTER_DEFAULTSW;
-
-typedef PRINTER_DEFAULTSW PRINTER_DEFAULTS;
-typedef PPRINTER_DEFAULTSW PPRINTER_DEFAULTS;
-typedef LPPRINTER_DEFAULTSW LPPRINTER_DEFAULTS;
-
-
-
-
-
-
-typedef struct _PRINTER_ENUM_VALUESA {
-    LPSTR   pValueName;
-    DWORD   cbValueName;
-    DWORD   dwType;
-    LPBYTE  pData;
-    DWORD   cbData;
-} PRINTER_ENUM_VALUESA, *PPRINTER_ENUM_VALUESA, *LPPRINTER_ENUM_VALUESA;
-typedef struct _PRINTER_ENUM_VALUESW {
-    LPWSTR  pValueName;
-    DWORD   cbValueName;
-    DWORD   dwType;
-    LPBYTE  pData;
-    DWORD   cbData;
-} PRINTER_ENUM_VALUESW, *PPRINTER_ENUM_VALUESW, *LPPRINTER_ENUM_VALUESW;
-
-typedef PRINTER_ENUM_VALUESW PRINTER_ENUM_VALUES;
-typedef PPRINTER_ENUM_VALUESW PPRINTER_ENUM_VALUES;
-typedef LPPRINTER_ENUM_VALUESW LPPRINTER_ENUM_VALUES;
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPrintersA (
-         DWORD Flags,
-         LPSTR Name,
-         DWORD Level,
-             LPBYTE pPrinterEnum,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPrintersW (
-         DWORD Flags,
-         LPWSTR Name,
-         DWORD Level,
-             LPBYTE pPrinterEnum,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-OpenPrinterA (
-        LPSTR pPrinterName,
-        LPHANDLE phPrinter,
-          LPPRINTER_DEFAULTSA pDefault
-);
-BOOL
-__stdcall
-OpenPrinterW (
-        LPWSTR pPrinterName,
-        LPHANDLE phPrinter,
-          LPPRINTER_DEFAULTSW pDefault
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-ResetPrinterA (
-        HANDLE   hPrinter,
-          LPPRINTER_DEFAULTSA pDefault
-);
-BOOL
-__stdcall
-ResetPrinterW (
-        HANDLE   hPrinter,
-          LPPRINTER_DEFAULTSW pDefault
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-SetJobA (
-         HANDLE hPrinter,
-         DWORD JobId,
-         DWORD Level,
-           LPBYTE pJob,
-         DWORD Command
-);
-BOOL
-__stdcall
-SetJobW (
-         HANDLE hPrinter,
-         DWORD JobId,
-         DWORD Level,
-           LPBYTE pJob,
-         DWORD Command
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetJobA (
-        HANDLE hPrinter,
-        DWORD JobId,
-        DWORD Level,
-          LPBYTE pJob,
-        DWORD cbBuf,
-        LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetJobW (
-        HANDLE hPrinter,
-        DWORD JobId,
-        DWORD Level,
-          LPBYTE pJob,
-        DWORD cbBuf,
-        LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumJobsA (
-         HANDLE hPrinter,
-         DWORD FirstJob,
-         DWORD NoJobs,
-         DWORD Level,
-           LPBYTE pJob,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumJobsW (
-         HANDLE hPrinter,
-         DWORD FirstJob,
-         DWORD NoJobs,
-         DWORD Level,
-           LPBYTE pJob,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-HANDLE
-__stdcall
-AddPrinterA (
-         LPSTR pName,
-         DWORD Level,
-         LPBYTE pPrinter
-);
-HANDLE
-__stdcall
-AddPrinterW (
-         LPWSTR pName,
-         DWORD Level,
-         LPBYTE pPrinter
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrinter (
-        HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-SetPrinterA (
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pPrinter,
-         DWORD Command
-);
-BOOL
-__stdcall
-SetPrinterW (
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pPrinter,
-         DWORD Command
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetPrinterA (
-         HANDLE hPrinter,
-         DWORD Level,
-           LPBYTE pPrinter,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetPrinterW (
-         HANDLE hPrinter,
-         DWORD Level,
-           LPBYTE pPrinter,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrinterDriverA (
-         LPSTR pName,
-         DWORD Level,
-         LPBYTE pDriverInfo
-);
-BOOL
-__stdcall
-AddPrinterDriverW (
-         LPWSTR pName,
-         DWORD Level,
-         LPBYTE pDriverInfo
-);
-
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrinterDriverExA (
-         LPSTR pName,
-         DWORD Level,
-         LPBYTE pDriverInfo,
-         DWORD dwFileCopyFlags
-);
-BOOL
-__stdcall
-AddPrinterDriverExW (
-         LPWSTR pName,
-         DWORD Level,
-         LPBYTE pDriverInfo,
-         DWORD dwFileCopyFlags
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPrinterDriversA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPrinterDriversW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetPrinterDriverA (
-         HANDLE hPrinter,
-           LPSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetPrinterDriverW (
-         HANDLE hPrinter,
-           LPWSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetPrinterDriverDirectoryA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverDirectory,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetPrinterDriverDirectoryW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverDirectory,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrinterDriverA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pDriverName
-);
-BOOL
-__stdcall
-DeletePrinterDriverW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pDriverName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrinterDriverExA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pDriverName,
-         DWORD dwDeleteFlag,
-         DWORD dwVersionFlag
-);
-BOOL
-__stdcall
-DeletePrinterDriverExW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pDriverName,
-         DWORD dwDeleteFlag,
-         DWORD dwVersionFlag
-);
-
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrintProcessorA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pPathName,
-         LPSTR pPrintProcessorName
-);
-BOOL
-__stdcall
-AddPrintProcessorW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pPathName,
-         LPWSTR pPrintProcessorName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPrintProcessorsA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         DWORD Level,
-             LPBYTE pPrintProcessorInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPrintProcessorsW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         DWORD Level,
-             LPBYTE pPrintProcessorInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetPrintProcessorDirectoryA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pPrintProcessorInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetPrintProcessorDirectoryW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pPrintProcessorInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPrintProcessorDatatypesA (
-         LPSTR pName,
-         LPSTR pPrintProcessorName,
-         DWORD Level,
-             LPBYTE pDatatypes,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPrintProcessorDatatypesW (
-         LPWSTR pName,
-         LPWSTR pPrintProcessorName,
-         DWORD Level,
-             LPBYTE pDatatypes,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrintProcessorA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pPrintProcessorName
-);
-BOOL
-__stdcall
-DeletePrintProcessorW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pPrintProcessorName
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-StartDocPrinterA ( 
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pDocInfo
-);
-DWORD
-__stdcall
-StartDocPrinterW ( 
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pDocInfo
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-StartPagePrinter (
-         HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-WritePrinter (
-         HANDLE hPrinter,
-           LPVOID pBuf,
-         DWORD cbBuf,
-         LPDWORD pcWritten
-);
-
-
-BOOL
-__stdcall
-FlushPrinter (
-         HANDLE hPrinter,
-           LPVOID pBuf,
-         DWORD cbBuf,
-         LPDWORD pcWritten,
-         DWORD cSleep
-);
-
-BOOL
-__stdcall
-EndPagePrinter (
-        HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-AbortPrinter (
-        HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-ReadPrinter (
-         HANDLE  hPrinter,
-           LPVOID pBuf,
-         DWORD cbBuf,
-         LPDWORD pNoBytesRead
-);
-
-BOOL
-__stdcall
-EndDocPrinter (
-        HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-AddJobA (
-         HANDLE hPrinter,
-         DWORD Level,
-           LPBYTE pData,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-AddJobW (
-         HANDLE hPrinter,
-         DWORD Level,
-           LPBYTE pData,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-ScheduleJob (
-         HANDLE hPrinter,
-         DWORD JobId
-);
-
-BOOL
-__stdcall
-PrinterProperties (
-         HWND hWnd,
-         HANDLE hPrinter
-);
-
-LONG
-__stdcall
-DocumentPropertiesA (
-         HWND hWnd,
-           HANDLE hPrinter,
-         LPSTR pDeviceName,
-           PDEVMODEA pDevModeOutput,
-           PDEVMODEA pDevModeInput,
-         DWORD fMode
-);
-LONG
-__stdcall
-DocumentPropertiesW (
-         HWND hWnd,
-           HANDLE hPrinter,
-         LPWSTR pDeviceName,
-           PDEVMODEW pDevModeOutput,
-           PDEVMODEW pDevModeInput,
-         DWORD fMode
-);
-
-
-
-
-
-
-LONG
-__stdcall
-AdvancedDocumentPropertiesA (
-         HWND hWnd,
-           HANDLE hPrinter,
-         LPSTR   pDeviceName,
-           PDEVMODEA pDevModeOutput,
-           PDEVMODEA pDevModeInput
-);
-LONG
-__stdcall
-AdvancedDocumentPropertiesW (
-         HWND hWnd,
-           HANDLE hPrinter,
-         LPWSTR   pDeviceName,
-           PDEVMODEW pDevModeOutput,
-           PDEVMODEW pDevModeInput
-);
-
-
-
-
-
-
-LONG
-ExtDeviceMode (
-         HWND hWnd,
-           HANDLE hInst,
-           LPDEVMODEA pDevModeOutput,
-         LPSTR pDeviceName,
-           LPSTR pPort,
-           LPDEVMODEA pDevModeInput,
-           LPSTR pProfile,
-         DWORD fMode
-);
-
-
-DWORD
-__stdcall
-GetPrinterDataA (
-         HANDLE hPrinter,
-           LPSTR pValueName,
-           LPDWORD pType,
-           LPBYTE pData,
-         DWORD nSize,
-         LPDWORD pcbNeeded
-);
-DWORD
-__stdcall
-GetPrinterDataW (
-         HANDLE hPrinter,
-           LPWSTR pValueName,
-           LPDWORD pType,
-           LPBYTE pData,
-         DWORD nSize,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-GetPrinterDataExA (
-         HANDLE hPrinter,
-           LPCSTR pKeyName,
-           LPCSTR pValueName,
-           LPDWORD pType,
-           LPBYTE pData,
-         DWORD nSize,
-         LPDWORD pcbNeeded
-);
-DWORD
-__stdcall
-GetPrinterDataExW (
-         HANDLE hPrinter,
-           LPCWSTR pKeyName,
-           LPCWSTR pValueName,
-           LPDWORD pType,
-           LPBYTE pData,
-         DWORD nSize,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-EnumPrinterDataA (
-         HANDLE hPrinter,
-         DWORD dwIndex,
-             LPSTR pValueName,
-         DWORD cbValueName,
-         LPDWORD pcbValueName,
-           LPDWORD pType,
-             LPBYTE pData,
-         DWORD cbData,
-         LPDWORD pcbData
-);
-DWORD
-__stdcall
-EnumPrinterDataW (
-         HANDLE hPrinter,
-         DWORD dwIndex,
-             LPWSTR pValueName,
-         DWORD cbValueName,
-         LPDWORD pcbValueName,
-           LPDWORD pType,
-             LPBYTE pData,
-         DWORD cbData,
-         LPDWORD pcbData
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-EnumPrinterDataExA (
-         HANDLE hPrinter,
-         LPCSTR pKeyName,
-             LPBYTE pEnumValues,
-         DWORD cbEnumValues,
-         LPDWORD pcbEnumValues,
-         LPDWORD pnEnumValues
-);
-DWORD
-__stdcall
-EnumPrinterDataExW (
-         HANDLE hPrinter,
-         LPCWSTR pKeyName,
-             LPBYTE pEnumValues,
-         DWORD cbEnumValues,
-         LPDWORD pcbEnumValues,
-         LPDWORD pnEnumValues
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-EnumPrinterKeyA (
-         HANDLE hPrinter,
-         LPCSTR pKeyName,
-             LPSTR pSubkey,
-         DWORD cbSubkey,
-         LPDWORD pcbSubkey
-);
-DWORD
-__stdcall
-EnumPrinterKeyW (
-         HANDLE hPrinter,
-         LPCWSTR pKeyName,
-             LPWSTR pSubkey,
-         DWORD cbSubkey,
-         LPDWORD pcbSubkey
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-SetPrinterDataA (
-         HANDLE hPrinter,
-         LPSTR pValueName,
-         DWORD Type,
-           LPBYTE pData,
-         DWORD cbData
-);
-DWORD
-__stdcall
-SetPrinterDataW (
-         HANDLE hPrinter,
-         LPWSTR pValueName,
-         DWORD Type,
-           LPBYTE pData,
-         DWORD cbData
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-SetPrinterDataExA (
-         HANDLE hPrinter,
-           LPCSTR pKeyName,
-         LPCSTR pValueName,
-         DWORD Type,
-           LPBYTE pData,
-         DWORD cbData
-);
-DWORD
-__stdcall
-SetPrinterDataExW (
-         HANDLE hPrinter,
-           LPCWSTR pKeyName,
-         LPCWSTR pValueName,
-         DWORD Type,
-           LPBYTE pData,
-         DWORD cbData
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-DeletePrinterDataA (
-         HANDLE hPrinter,
-         LPSTR pValueName
-);
-DWORD
-__stdcall
-DeletePrinterDataW (
-         HANDLE hPrinter,
-         LPWSTR pValueName
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-DeletePrinterDataExA (
-         HANDLE hPrinter,
-         LPCSTR pKeyName,
-         LPCSTR pValueName
-);
-DWORD
-__stdcall
-DeletePrinterDataExW (
-         HANDLE hPrinter,
-         LPCWSTR pKeyName,
-         LPCWSTR pValueName
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-DeletePrinterKeyA (
-         HANDLE hPrinter,
-         LPCSTR pKeyName
-);
-DWORD
-__stdcall
-DeletePrinterKeyW (
-         HANDLE hPrinter,
-         LPCWSTR pKeyName
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PRINTER_NOTIFY_OPTIONS_TYPE {
-    WORD Type;
-    WORD Reserved0;
-    DWORD Reserved1;
-    DWORD Reserved2;
-    DWORD Count;
-    PWORD pFields;
-} PRINTER_NOTIFY_OPTIONS_TYPE, *PPRINTER_NOTIFY_OPTIONS_TYPE, *LPPRINTER_NOTIFY_OPTIONS_TYPE;
-
-
-
-typedef struct _PRINTER_NOTIFY_OPTIONS {
-    DWORD Version;
-    DWORD Flags;
-    DWORD Count;
-    PPRINTER_NOTIFY_OPTIONS_TYPE pTypes;
-} PRINTER_NOTIFY_OPTIONS, *PPRINTER_NOTIFY_OPTIONS, *LPPRINTER_NOTIFY_OPTIONS;
-
-
-
-typedef struct _PRINTER_NOTIFY_INFO_DATA {
-    WORD Type;
-    WORD Field;
-    DWORD Reserved;
-    DWORD Id;
-    union {
-        DWORD adwData[2];
-        struct {
-            DWORD  cbBuf;
-            LPVOID pBuf;
-        } Data;
-    } NotifyData;
-} PRINTER_NOTIFY_INFO_DATA, *PPRINTER_NOTIFY_INFO_DATA, *LPPRINTER_NOTIFY_INFO_DATA;
-
-typedef struct _PRINTER_NOTIFY_INFO {
-    DWORD Version;
-    DWORD Flags;
-    DWORD Count;
-    PRINTER_NOTIFY_INFO_DATA aData[1];
-} PRINTER_NOTIFY_INFO, *PPRINTER_NOTIFY_INFO, *LPPRINTER_NOTIFY_INFO;
-
-typedef struct _BINARY_CONTAINER{
-    DWORD cbBuf;
-    LPBYTE pData;
-} BINARY_CONTAINER, *PBINARY_CONTAINER;
-
-typedef struct _BIDI_DATA{
-    DWORD dwBidiType;
-    union {
-        BOOL   bData;
-        LONG   iData;
-        LPWSTR sData;
-        FLOAT  fData;
-        BINARY_CONTAINER biData;
-        }u;
-} BIDI_DATA, *PBIDI_DATA, *LPBIDI_DATA;
-
-typedef struct _BIDI_REQUEST_DATA{
-    DWORD     dwReqNumber;
-    LPWSTR    pSchema;
-    BIDI_DATA data;
-} BIDI_REQUEST_DATA , *PBIDI_REQUEST_DATA , *LPBIDI_REQUEST_DATA;
-
-typedef struct _BIDI_REQUEST_CONTAINER{
-    DWORD Version;
-    DWORD Flags;
-    DWORD Count;
-    BIDI_REQUEST_DATA aData[ 1 ];
-}BIDI_REQUEST_CONTAINER, *PBIDI_REQUEST_CONTAINER, *LPBIDI_REQUEST_CONTAINER;
-
-typedef struct _BIDI_RESPONSE_DATA{
-    DWORD  dwResult;
-    DWORD  dwReqNumber;
-    LPWSTR pSchema;
-    BIDI_DATA data;
-} BIDI_RESPONSE_DATA, *PBIDI_RESPONSE_DATA, *LPBIDI_RESPONSE_DATA;
-
-typedef struct _BIDI_RESPONSE_CONTAINER{
-    DWORD Version;
-    DWORD Flags;
-    DWORD Count;
-    BIDI_RESPONSE_DATA aData[ 1 ];
-} BIDI_RESPONSE_CONTAINER, *PBIDI_RESPONSE_CONTAINER, *LPBIDI_RESPONSE_CONTAINER;
-
-
-
-
-
-
-typedef enum {
-    BIDI_NULL   = 0,
-    BIDI_INT    = 1,
-    BIDI_FLOAT  = 2,
-    BIDI_BOOL   = 3,
-    BIDI_STRING = 4,
-    BIDI_TEXT   = 5,
-    BIDI_ENUM   = 6,
-    BIDI_BLOB   = 7
-} BIDI_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD
-__stdcall
-WaitForPrinterChange (
-         HANDLE hPrinter,
-         DWORD Flags
-);
-
-HANDLE
-__stdcall
-FindFirstPrinterChangeNotification (
-         HANDLE hPrinter,
-         DWORD fdwFlags,
-         DWORD fdwOptions,
-           LPVOID pPrinterNotifyOptions
-);
-
-BOOL
-__stdcall
-FindNextPrinterChangeNotification (
-         HANDLE hChange,
-           PDWORD pdwChange,
-           LPVOID pPrinterNotifyOptions,
-           LPVOID *ppPrinterNotifyInfo
-);
-
-BOOL
-__stdcall
-FreePrinterNotifyInfo (
-         PPRINTER_NOTIFY_INFO pPrinterNotifyInfo
-);
-
-BOOL
-__stdcall
-FindClosePrinterChangeNotification (
-         HANDLE hChange
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD
-__stdcall
-PrinterMessageBoxA (
-         HANDLE hPrinter,
-         DWORD Error,
-         HWND hWnd,
-           LPSTR pText,
-           LPSTR pCaption,
-         DWORD dwType
-);
-DWORD
-__stdcall
-PrinterMessageBoxW (
-         HANDLE hPrinter,
-         DWORD Error,
-         HWND hWnd,
-           LPWSTR pText,
-           LPWSTR pCaption,
-         DWORD dwType
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-ClosePrinter (
-         HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-AddFormA (
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pForm
-);
-BOOL
-__stdcall
-AddFormW (
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pForm
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeleteFormA (
-         HANDLE hPrinter,
-         LPSTR pFormName
-);
-BOOL
-__stdcall
-DeleteFormW (
-         HANDLE hPrinter,
-         LPWSTR pFormName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetFormA (
-         HANDLE hPrinter,
-         LPSTR pFormName,
-         DWORD Level,
-           LPBYTE pForm,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetFormW (
-         HANDLE hPrinter,
-         LPWSTR pFormName,
-         DWORD Level,
-           LPBYTE pForm,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-SetFormA (
-         HANDLE hPrinter,
-         LPSTR pFormName,
-         DWORD Level,
-         LPBYTE pForm
-);
-BOOL
-__stdcall
-SetFormW (
-         HANDLE hPrinter,
-         LPWSTR pFormName,
-         DWORD Level,
-         LPBYTE pForm
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumFormsA (
-         HANDLE hPrinter,
-         DWORD Level,
-             LPBYTE pForm,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumFormsW (
-         HANDLE hPrinter,
-         DWORD Level,
-             LPBYTE pForm,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumMonitorsA (
-         LPSTR pName,
-         DWORD Level,
-             LPBYTE pMonitor,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumMonitorsW (
-         LPWSTR pName,
-         DWORD Level,
-             LPBYTE pMonitor,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-AddMonitorA (
-         LPSTR pName,
-         DWORD Level,
-           LPBYTE pMonitorInfo
-);
-BOOL
-__stdcall
-AddMonitorW (
-         LPWSTR pName,
-         DWORD Level,
-           LPBYTE pMonitorInfo
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeleteMonitorA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pMonitorName
-);
-BOOL
-__stdcall
-DeleteMonitorW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pMonitorName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPortsA (
-         LPSTR pName,
-         DWORD Level,
-             LPBYTE  pPorts,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPortsW (
-         LPWSTR pName,
-         DWORD Level,
-             LPBYTE  pPorts,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPortA (
-         LPSTR pName,
-         HWND hWnd,
-         LPSTR pMonitorName
-);
-BOOL
-__stdcall
-AddPortW (
-         LPWSTR pName,
-         HWND hWnd,
-         LPWSTR pMonitorName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-ConfigurePortA (
-         LPSTR pName,
-         HWND hWnd,
-         LPSTR pPortName
-);
-BOOL
-__stdcall
-ConfigurePortW (
-         LPWSTR pName,
-         HWND hWnd,
-         LPWSTR pPortName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePortA (
-         LPSTR pName,
-         HWND hWnd,
-         LPSTR pPortName
-);
-BOOL
-__stdcall
-DeletePortW (
-         LPWSTR pName,
-         HWND hWnd,
-         LPWSTR pPortName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-XcvDataW (
-         HANDLE hXcv,
-         PCWSTR pszDataName,
-             PBYTE pInputData,
-         DWORD cbInputData,
-           PBYTE pOutputData,
-         DWORD cbOutputData,
-         PDWORD pcbOutputNeeded,
-         PDWORD  pdwStatus
-);
-
-
-
-BOOL
-__stdcall
-GetDefaultPrinterA (
-             LPSTR pszBuffer,
-         LPDWORD pcchBuffer
-    );
-BOOL
-__stdcall
-GetDefaultPrinterW (
-             LPWSTR pszBuffer,
-         LPDWORD pcchBuffer
-    );
-
-
-
-
-
-
-BOOL
-__stdcall
-SetDefaultPrinterA (
-         LPCSTR pszPrinter
-    );
-BOOL
-__stdcall
-SetDefaultPrinterW (
-         LPCWSTR pszPrinter
-    );
-
-
-
-
-
-
-
-BOOL
-__stdcall
-SetPortA (
-         LPSTR pName,
-         LPSTR pPortName,
-         DWORD dwLevel,
-         LPBYTE pPortInfo
-);
-BOOL
-__stdcall
-SetPortW (
-         LPWSTR pName,
-         LPWSTR pPortName,
-         DWORD dwLevel,
-         LPBYTE pPortInfo
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrinterConnectionA (
-         LPSTR pName
-);
-BOOL
-__stdcall
-AddPrinterConnectionW (
-         LPWSTR pName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrinterConnectionA ( 
-         LPSTR pName
-);
-BOOL
-__stdcall
-DeletePrinterConnectionW ( 
-         LPWSTR pName
-);
-
-
-
-
-
-
-HANDLE
-__stdcall
-ConnectToPrinterDlg (
-         HWND hwnd,
-         DWORD Flags
-);
-
-typedef struct _PROVIDOR_INFO_1A{
-    LPSTR     pName;
-    LPSTR     pEnvironment;
-    LPSTR     pDLLName;
-} PROVIDOR_INFO_1A, *PPROVIDOR_INFO_1A, *LPPROVIDOR_INFO_1A;
-typedef struct _PROVIDOR_INFO_1W{
-    LPWSTR    pName;
-    LPWSTR    pEnvironment;
-    LPWSTR    pDLLName;
-} PROVIDOR_INFO_1W, *PPROVIDOR_INFO_1W, *LPPROVIDOR_INFO_1W;
-
-typedef PROVIDOR_INFO_1W PROVIDOR_INFO_1;
-typedef PPROVIDOR_INFO_1W PPROVIDOR_INFO_1;
-typedef LPPROVIDOR_INFO_1W LPPROVIDOR_INFO_1;
-
-
-
-
-
-
-typedef struct _PROVIDOR_INFO_2A{
-    LPSTR     pOrder;
-} PROVIDOR_INFO_2A, *PPROVIDOR_INFO_2A, *LPPROVIDOR_INFO_2A;
-typedef struct _PROVIDOR_INFO_2W{
-    LPWSTR    pOrder;
-} PROVIDOR_INFO_2W, *PPROVIDOR_INFO_2W, *LPPROVIDOR_INFO_2W;
-
-typedef PROVIDOR_INFO_2W PROVIDOR_INFO_2;
-typedef PPROVIDOR_INFO_2W PPROVIDOR_INFO_2;
-typedef LPPROVIDOR_INFO_2W LPPROVIDOR_INFO_2;
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrintProvidorA (
-         LPSTR pName,
-         DWORD level,
-         LPBYTE pProvidorInfo
-);
-BOOL
-__stdcall
-AddPrintProvidorW (
-         LPWSTR pName,
-         DWORD level,
-         LPBYTE pProvidorInfo
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrintProvidorA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pPrintProvidorName
-);
-BOOL
-__stdcall
-DeletePrintProvidorW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pPrintProvidorName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-IsValidDevmodeA (
-         PDEVMODEA pDevmode,
-         size_t DevmodeSize
-    );
-BOOL
-__stdcall
-IsValidDevmodeW (
-         PDEVMODEW pDevmode,
-         size_t DevmodeSize
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-   
-   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum tagREGCLS
-{
-    REGCLS_SINGLEUSE = 0,       
-    REGCLS_MULTIPLEUSE = 1,     
-                                
-    REGCLS_MULTI_SEPARATE = 2,  
-                                
-    REGCLS_SUSPENDED      = 4,  
-                                
-    REGCLS_SURROGATE      = 8   
-                                
-                                
-} REGCLS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct    IRpcStubBuffer     IRpcStubBuffer;
-typedef struct    IRpcChannelBuffer  IRpcChannelBuffer;
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IUnknown IUnknown;
-
-
-
-
-
-typedef struct AsyncIUnknown AsyncIUnknown;
-
-
-
-
-
-typedef struct IClassFactory IClassFactory;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_unknwn_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_unknwn_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IUnknown *LPUNKNOWN;
-
-
-
-
-
-
-
-    extern "C" const IID IID_IUnknown;
-    extern "C++"
-    {
-        struct __declspec(uuid("00000000-0000-0000-C000-000000000046")) __declspec(novtable)
-        IUnknown
-        {
-        public:
-            
-            virtual HRESULT __stdcall QueryInterface( 
-                 const IID & riid,
-                 void  * *ppvObject) = 0;
-            
-            virtual ULONG __stdcall AddRef( void) = 0;
-            
-            virtual ULONG __stdcall Release( void) = 0;
-    	
-            template<class Q>
-    	HRESULT __stdcall QueryInterface(Q** pp)
-    	{
-    	    return QueryInterface(__uuidof(Q), (void **)pp);
-    	}
-            
-            
-        };
-    } 
-    HRESULT __stdcall IUnknown_QueryInterface_Proxy(
-        IUnknown  * This,
-         const IID & riid,
-         void  * *ppvObject);
-    
-    void __stdcall IUnknown_QueryInterface_Stub(
-        IRpcStubBuffer *This,
-        IRpcChannelBuffer *_pRpcChannelBuffer,
-        PRPC_MESSAGE _pRpcMessage,
-        DWORD *_pdwStubPhase);
-    
-    ULONG __stdcall IUnknown_AddRef_Proxy(
-        IUnknown  * This);
-    
-    void __stdcall IUnknown_AddRef_Stub(
-        IRpcStubBuffer *This,
-        IRpcChannelBuffer *_pRpcChannelBuffer,
-        PRPC_MESSAGE _pRpcMessage,
-        DWORD *_pdwStubPhase);
-    
-    ULONG __stdcall IUnknown_Release_Proxy(
-        IUnknown  * This);
-    
-    void __stdcall IUnknown_Release_Stub(
-        IRpcStubBuffer *This,
-        IRpcChannelBuffer *_pRpcChannelBuffer,
-        PRPC_MESSAGE _pRpcMessage,
-        DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_unknwn_0005_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_unknwn_0005_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIUnknown;
-
-
-    
-    struct __declspec(uuid("000e0000-0000-0000-C000-000000000046")) __declspec(novtable)
-    AsyncIUnknown : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_QueryInterface( 
-             const IID & riid) = 0;
-        
-        virtual HRESULT __stdcall Finish_QueryInterface( 
-             void **ppvObject) = 0;
-        
-        virtual HRESULT __stdcall Begin_AddRef( void) = 0;
-        
-        virtual ULONG __stdcall Finish_AddRef( void) = 0;
-        
-        virtual HRESULT __stdcall Begin_Release( void) = 0;
-        
-        virtual ULONG __stdcall Finish_Release( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIUnknown_Begin_QueryInterface_Proxy( 
-    AsyncIUnknown * This,
-     const IID & riid);
-
-
-void __stdcall AsyncIUnknown_Begin_QueryInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIUnknown_Finish_QueryInterface_Proxy( 
-    AsyncIUnknown * This,
-     void **ppvObject);
-
-
-void __stdcall AsyncIUnknown_Finish_QueryInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIUnknown_Begin_AddRef_Proxy( 
-    AsyncIUnknown * This);
-
-
-void __stdcall AsyncIUnknown_Begin_AddRef_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-ULONG __stdcall AsyncIUnknown_Finish_AddRef_Proxy( 
-    AsyncIUnknown * This);
-
-
-void __stdcall AsyncIUnknown_Finish_AddRef_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIUnknown_Begin_Release_Proxy( 
-    AsyncIUnknown * This);
-
-
-void __stdcall AsyncIUnknown_Begin_Release_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-ULONG __stdcall AsyncIUnknown_Finish_Release_Proxy( 
-    AsyncIUnknown * This);
-
-
-void __stdcall AsyncIUnknown_Finish_Release_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IClassFactory *LPCLASSFACTORY;
-
-
-extern "C" const IID IID_IClassFactory;
-
-
-    
-    struct __declspec(uuid("00000001-0000-0000-C000-000000000046")) __declspec(novtable)
-    IClassFactory : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall CreateInstance( 
-             IUnknown *pUnkOuter,
-             const IID & riid,
-             void **ppvObject) = 0;
-        
-        virtual  HRESULT __stdcall LockServer( 
-             BOOL fLock) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IClassFactory_RemoteCreateInstance_Proxy( 
-    IClassFactory * This,
-     const IID & riid,
-     IUnknown **ppvObject);
-
-
-void __stdcall IClassFactory_RemoteCreateInstance_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IClassFactory_RemoteLockServer_Proxy( 
-    IClassFactory * This,
-     BOOL fLock);
-
-
-void __stdcall IClassFactory_RemoteLockServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
- HRESULT __stdcall IClassFactory_CreateInstance_Proxy( 
-    IClassFactory * This,
-     IUnknown *pUnkOuter,
-     const IID & riid,
-     void **ppvObject);
-
-
- HRESULT __stdcall IClassFactory_CreateInstance_Stub( 
-    IClassFactory * This,
-     const IID & riid,
-     IUnknown **ppvObject);
-
- HRESULT __stdcall IClassFactory_LockServer_Proxy( 
-    IClassFactory * This,
-     BOOL fLock);
-
-
- HRESULT __stdcall IClassFactory_LockServer_Stub( 
-    IClassFactory * This,
-     BOOL fLock);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IMarshal IMarshal;
-
-
-
-
-
-typedef struct IMarshal2 IMarshal2;
-
-
-
-
-
-typedef struct IMalloc IMalloc;
-
-
-
-
-
-typedef struct IMallocSpy IMallocSpy;
-
-
-
-
-
-typedef struct IStdMarshalInfo IStdMarshalInfo;
-
-
-
-
-
-typedef struct IExternalConnection IExternalConnection;
-
-
-
-
-
-typedef struct IMultiQI IMultiQI;
-
-
-
-
-
-typedef struct AsyncIMultiQI AsyncIMultiQI;
-
-
-
-
-
-typedef struct IInternalUnknown IInternalUnknown;
-
-
-
-
-
-typedef struct IEnumUnknown IEnumUnknown;
-
-
-
-
-
-typedef struct IBindCtx IBindCtx;
-
-
-
-
-
-typedef struct IEnumMoniker IEnumMoniker;
-
-
-
-
-
-typedef struct IRunnableObject IRunnableObject;
-
-
-
-
-
-typedef struct IRunningObjectTable IRunningObjectTable;
-
-
-
-
-
-typedef struct IPersist IPersist;
-
-
-
-
-
-typedef struct IPersistStream IPersistStream;
-
-
-
-
-
-typedef struct IMoniker IMoniker;
-
-
-
-
-
-typedef struct IROTData IROTData;
-
-
-
-
-
-typedef struct IEnumString IEnumString;
-
-
-
-
-
-typedef struct ISequentialStream ISequentialStream;
-
-
-
-
-
-typedef struct IStream IStream;
-
-
-
-
-
-typedef struct IEnumSTATSTG IEnumSTATSTG;
-
-
-
-
-
-typedef struct IStorage IStorage;
-
-
-
-
-
-typedef struct IPersistFile IPersistFile;
-
-
-
-
-
-typedef struct IPersistStorage IPersistStorage;
-
-
-
-
-
-typedef struct ILockBytes ILockBytes;
-
-
-
-
-
-typedef struct IEnumFORMATETC IEnumFORMATETC;
-
-
-
-
-
-typedef struct IEnumSTATDATA IEnumSTATDATA;
-
-
-
-
-
-typedef struct IRootStorage IRootStorage;
-
-
-
-
-
-typedef struct IAdviseSink IAdviseSink;
-
-
-
-
-
-typedef struct AsyncIAdviseSink AsyncIAdviseSink;
-
-
-
-
-
-typedef struct IAdviseSink2 IAdviseSink2;
-
-
-
-
-
-typedef struct AsyncIAdviseSink2 AsyncIAdviseSink2;
-
-
-
-
-
-typedef struct IDataObject IDataObject;
-
-
-
-
-
-typedef struct IDataAdviseHolder IDataAdviseHolder;
-
-
-
-
-
-typedef struct IMessageFilter IMessageFilter;
-
-
-
-
-
-typedef struct IRpcChannelBuffer IRpcChannelBuffer;
-
-
-
-
-
-typedef struct IRpcChannelBuffer2 IRpcChannelBuffer2;
-
-
-
-
-
-typedef struct IAsyncRpcChannelBuffer IAsyncRpcChannelBuffer;
-
-
-
-
-
-typedef struct IRpcChannelBuffer3 IRpcChannelBuffer3;
-
-
-
-
-
-typedef struct IRpcSyntaxNegotiate IRpcSyntaxNegotiate;
-
-
-
-
-
-typedef struct IRpcProxyBuffer IRpcProxyBuffer;
-
-
-
-
-
-typedef struct IRpcStubBuffer IRpcStubBuffer;
-
-
-
-
-
-typedef struct IPSFactoryBuffer IPSFactoryBuffer;
-
-
-
-
-
-typedef struct IChannelHook IChannelHook;
-
-
-
-
-
-typedef struct IClientSecurity IClientSecurity;
-
-
-
-
-
-typedef struct IServerSecurity IServerSecurity;
-
-
-
-
-
-typedef struct IClassActivator IClassActivator;
-
-
-
-
-
-typedef struct IRpcOptions IRpcOptions;
-
-
-
-
-
-typedef struct IFillLockBytes IFillLockBytes;
-
-
-
-
-
-typedef struct IProgressNotify IProgressNotify;
-
-
-
-
-
-typedef struct ILayoutStorage ILayoutStorage;
-
-
-
-
-
-typedef struct IBlockingLock IBlockingLock;
-
-
-
-
-
-typedef struct ITimeAndNoticeControl ITimeAndNoticeControl;
-
-
-
-
-
-typedef struct IOplockStorage IOplockStorage;
-
-
-
-
-
-typedef struct ISurrogate ISurrogate;
-
-
-
-
-
-typedef struct IGlobalInterfaceTable IGlobalInterfaceTable;
-
-
-
-
-
-typedef struct IDirectWriterLock IDirectWriterLock;
-
-
-
-
-
-typedef struct ISynchronize ISynchronize;
-
-
-
-
-
-typedef struct ISynchronizeHandle ISynchronizeHandle;
-
-
-
-
-
-typedef struct ISynchronizeEvent ISynchronizeEvent;
-
-
-
-
-
-typedef struct ISynchronizeContainer ISynchronizeContainer;
-
-
-
-
-
-typedef struct ISynchronizeMutex ISynchronizeMutex;
-
-
-
-
-
-typedef struct ICancelMethodCalls ICancelMethodCalls;
-
-
-
-
-
-typedef struct IAsyncManager IAsyncManager;
-
-
-
-
-
-typedef struct ICallFactory ICallFactory;
-
-
-
-
-
-typedef struct IRpcHelper IRpcHelper;
-
-
-
-
-
-typedef struct IReleaseMarshalBuffers IReleaseMarshalBuffers;
-
-
-
-
-
-typedef struct IWaitMultiple IWaitMultiple;
-
-
-
-
-
-typedef struct IUrlMon IUrlMon;
-
-
-
-
-
-typedef struct IForegroundTransfer IForegroundTransfer;
-
-
-
-
-
-typedef struct IAddrTrackingControl IAddrTrackingControl;
-
-
-
-
-
-typedef struct IAddrExclusionControl IAddrExclusionControl;
-
-
-
-
-
-typedef struct IPipeByte IPipeByte;
-
-
-
-
-
-typedef struct AsyncIPipeByte AsyncIPipeByte;
-
-
-
-
-
-typedef struct IPipeLong IPipeLong;
-
-
-
-
-
-typedef struct AsyncIPipeLong AsyncIPipeLong;
-
-
-
-
-
-typedef struct IPipeDouble IPipeDouble;
-
-
-
-
-
-typedef struct AsyncIPipeDouble AsyncIPipeDouble;
-
-
-
-
-
-typedef struct IThumbnailExtractor IThumbnailExtractor;
-
-
-
-
-
-typedef struct IDummyHICONIncluder IDummyHICONIncluder;
-
-
-
-
-
-typedef struct IEnumContextProps IEnumContextProps;
-
-
-
-
-
-typedef struct IContext IContext;
-
-
-
-
-
-typedef struct IObjContext IObjContext;
-
-
-
-
-
-typedef struct IProcessLock IProcessLock;
-
-
-
-
-
-typedef struct ISurrogateService ISurrogateService;
-
-
-
-
-
-typedef struct IComThreadingInfo IComThreadingInfo;
-
-
-
-
-
-typedef struct IProcessInitControl IProcessInitControl;
-
-
-
-
-
-typedef struct IInitializeSpy IInitializeSpy;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _COSERVERINFO
-    {
-    DWORD dwReserved1;
-    LPWSTR pwszName;
-    COAUTHINFO *pAuthInfo;
-    DWORD dwReserved2;
-    } 	COSERVERINFO;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IMarshal *LPMARSHAL;
-
-
-extern "C" const IID IID_IMarshal;
-
-
-    
-    struct __declspec(uuid("00000003-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMarshal : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetUnmarshalClass( 
-             const IID & riid,
-             void *pv,
-             DWORD dwDestContext,
-             void *pvDestContext,
-             DWORD mshlflags,
-             CLSID *pCid) = 0;
-        
-        virtual HRESULT __stdcall GetMarshalSizeMax( 
-             const IID & riid,
-             void *pv,
-             DWORD dwDestContext,
-             void *pvDestContext,
-             DWORD mshlflags,
-             DWORD *pSize) = 0;
-        
-        virtual HRESULT __stdcall MarshalInterface( 
-             IStream *pStm,
-             const IID & riid,
-             void *pv,
-             DWORD dwDestContext,
-             void *pvDestContext,
-             DWORD mshlflags) = 0;
-        
-        virtual HRESULT __stdcall UnmarshalInterface( 
-             IStream *pStm,
-             const IID & riid,
-             void **ppv) = 0;
-        
-        virtual HRESULT __stdcall ReleaseMarshalData( 
-             IStream *pStm) = 0;
-        
-        virtual HRESULT __stdcall DisconnectObject( 
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IMarshal_GetUnmarshalClass_Proxy( 
-    IMarshal * This,
-     const IID & riid,
-     void *pv,
-     DWORD dwDestContext,
-     void *pvDestContext,
-     DWORD mshlflags,
-     CLSID *pCid);
-
-
-void __stdcall IMarshal_GetUnmarshalClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_GetMarshalSizeMax_Proxy( 
-    IMarshal * This,
-     const IID & riid,
-     void *pv,
-     DWORD dwDestContext,
-     void *pvDestContext,
-     DWORD mshlflags,
-     DWORD *pSize);
-
-
-void __stdcall IMarshal_GetMarshalSizeMax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_MarshalInterface_Proxy( 
-    IMarshal * This,
-     IStream *pStm,
-     const IID & riid,
-     void *pv,
-     DWORD dwDestContext,
-     void *pvDestContext,
-     DWORD mshlflags);
-
-
-void __stdcall IMarshal_MarshalInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_UnmarshalInterface_Proxy( 
-    IMarshal * This,
-     IStream *pStm,
-     const IID & riid,
-     void **ppv);
-
-
-void __stdcall IMarshal_UnmarshalInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_ReleaseMarshalData_Proxy( 
-    IMarshal * This,
-     IStream *pStm);
-
-
-void __stdcall IMarshal_ReleaseMarshalData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_DisconnectObject_Proxy( 
-    IMarshal * This,
-     DWORD dwReserved);
-
-
-void __stdcall IMarshal_DisconnectObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMarshal2 *LPMARSHAL2;
-
-
-extern "C" const IID IID_IMarshal2;
-
-
-    
-    struct __declspec(uuid("000001cf-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMarshal2 : public IMarshal
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMalloc *LPMALLOC;
-
-
-extern "C" const IID IID_IMalloc;
-
-
-    
-    struct __declspec(uuid("00000002-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMalloc : public IUnknown
-    {
-    public:
-        virtual void *__stdcall Alloc( 
-             SIZE_T cb) = 0;
-        
-        virtual void *__stdcall Realloc( 
-             void *pv,
-             SIZE_T cb) = 0;
-        
-        virtual void __stdcall Free( 
-             void *pv) = 0;
-        
-        virtual SIZE_T __stdcall GetSize( 
-             void *pv) = 0;
-        
-        virtual int __stdcall DidAlloc( 
-            void *pv) = 0;
-        
-        virtual void __stdcall HeapMinimize( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void *__stdcall IMalloc_Alloc_Proxy( 
-    IMalloc * This,
-     SIZE_T cb);
-
-
-void __stdcall IMalloc_Alloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMalloc_Realloc_Proxy( 
-    IMalloc * This,
-     void *pv,
-     SIZE_T cb);
-
-
-void __stdcall IMalloc_Realloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMalloc_Free_Proxy( 
-    IMalloc * This,
-     void *pv);
-
-
-void __stdcall IMalloc_Free_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-SIZE_T __stdcall IMalloc_GetSize_Proxy( 
-    IMalloc * This,
-     void *pv);
-
-
-void __stdcall IMalloc_GetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-int __stdcall IMalloc_DidAlloc_Proxy( 
-    IMalloc * This,
-    void *pv);
-
-
-void __stdcall IMalloc_DidAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMalloc_HeapMinimize_Proxy( 
-    IMalloc * This);
-
-
-void __stdcall IMalloc_HeapMinimize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMallocSpy *LPMALLOCSPY;
-
-
-extern "C" const IID IID_IMallocSpy;
-
-
-    
-    struct __declspec(uuid("0000001d-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMallocSpy : public IUnknown
-    {
-    public:
-        virtual SIZE_T __stdcall PreAlloc( 
-             SIZE_T cbRequest) = 0;
-        
-        virtual void *__stdcall PostAlloc( 
-             void *pActual) = 0;
-        
-        virtual void *__stdcall PreFree( 
-             void *pRequest,
-             BOOL fSpyed) = 0;
-        
-        virtual void __stdcall PostFree( 
-             BOOL fSpyed) = 0;
-        
-        virtual SIZE_T __stdcall PreRealloc( 
-             void *pRequest,
-             SIZE_T cbRequest,
-             void **ppNewRequest,
-             BOOL fSpyed) = 0;
-        
-        virtual void *__stdcall PostRealloc( 
-             void *pActual,
-             BOOL fSpyed) = 0;
-        
-        virtual void *__stdcall PreGetSize( 
-             void *pRequest,
-             BOOL fSpyed) = 0;
-        
-        virtual SIZE_T __stdcall PostGetSize( 
-             SIZE_T cbActual,
-             BOOL fSpyed) = 0;
-        
-        virtual void *__stdcall PreDidAlloc( 
-             void *pRequest,
-             BOOL fSpyed) = 0;
-        
-        virtual int __stdcall PostDidAlloc( 
-             void *pRequest,
-             BOOL fSpyed,
-             int fActual) = 0;
-        
-        virtual void __stdcall PreHeapMinimize( void) = 0;
-        
-        virtual void __stdcall PostHeapMinimize( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-SIZE_T __stdcall IMallocSpy_PreAlloc_Proxy( 
-    IMallocSpy * This,
-     SIZE_T cbRequest);
-
-
-void __stdcall IMallocSpy_PreAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PostAlloc_Proxy( 
-    IMallocSpy * This,
-     void *pActual);
-
-
-void __stdcall IMallocSpy_PostAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PreFree_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PreFree_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMallocSpy_PostFree_Proxy( 
-    IMallocSpy * This,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PostFree_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-SIZE_T __stdcall IMallocSpy_PreRealloc_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     SIZE_T cbRequest,
-     void **ppNewRequest,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PreRealloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PostRealloc_Proxy( 
-    IMallocSpy * This,
-     void *pActual,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PostRealloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PreGetSize_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PreGetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-SIZE_T __stdcall IMallocSpy_PostGetSize_Proxy( 
-    IMallocSpy * This,
-     SIZE_T cbActual,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PostGetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PreDidAlloc_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PreDidAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-int __stdcall IMallocSpy_PostDidAlloc_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     BOOL fSpyed,
-     int fActual);
-
-
-void __stdcall IMallocSpy_PostDidAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMallocSpy_PreHeapMinimize_Proxy( 
-    IMallocSpy * This);
-
-
-void __stdcall IMallocSpy_PreHeapMinimize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMallocSpy_PostHeapMinimize_Proxy( 
-    IMallocSpy * This);
-
-
-void __stdcall IMallocSpy_PostHeapMinimize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IStdMarshalInfo *LPSTDMARSHALINFO;
-
-
-extern "C" const IID IID_IStdMarshalInfo;
-
-
-    
-    struct __declspec(uuid("00000018-0000-0000-C000-000000000046")) __declspec(novtable)
-    IStdMarshalInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassForHandler( 
-             DWORD dwDestContext,
-             void *pvDestContext,
-             CLSID *pClsid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IStdMarshalInfo_GetClassForHandler_Proxy( 
-    IStdMarshalInfo * This,
-     DWORD dwDestContext,
-     void *pvDestContext,
-     CLSID *pClsid);
-
-
-void __stdcall IStdMarshalInfo_GetClassForHandler_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IExternalConnection *LPEXTERNALCONNECTION;
-
-typedef 
-enum tagEXTCONN
-    {	EXTCONN_STRONG	= 0x1,
-	EXTCONN_WEAK	= 0x2,
-	EXTCONN_CALLABLE	= 0x4
-    } 	EXTCONN;
-
-
-extern "C" const IID IID_IExternalConnection;
-
-
-    
-    struct __declspec(uuid("00000019-0000-0000-C000-000000000046")) __declspec(novtable)
-    IExternalConnection : public IUnknown
-    {
-    public:
-        virtual DWORD __stdcall AddConnection( 
-             DWORD extconn,
-             DWORD reserved) = 0;
-        
-        virtual DWORD __stdcall ReleaseConnection( 
-             DWORD extconn,
-             DWORD reserved,
-             BOOL fLastReleaseCloses) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall IExternalConnection_AddConnection_Proxy( 
-    IExternalConnection * This,
-     DWORD extconn,
-     DWORD reserved);
-
-
-void __stdcall IExternalConnection_AddConnection_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-DWORD __stdcall IExternalConnection_ReleaseConnection_Proxy( 
-    IExternalConnection * This,
-     DWORD extconn,
-     DWORD reserved,
-     BOOL fLastReleaseCloses);
-
-
-void __stdcall IExternalConnection_ReleaseConnection_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-typedef  IMultiQI *LPMULTIQI;
-
-typedef struct tagMULTI_QI
-    {
-    const IID *pIID;
-    IUnknown *pItf;
-    HRESULT hr;
-    } 	MULTI_QI;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0015_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0015_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IMultiQI;
-
-
-    
-    struct __declspec(uuid("00000020-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMultiQI : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryMultipleInterfaces( 
-             ULONG cMQIs,
-             MULTI_QI *pMQIs) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IMultiQI_QueryMultipleInterfaces_Proxy( 
-    IMultiQI * This,
-     ULONG cMQIs,
-     MULTI_QI *pMQIs);
-
-
-void __stdcall IMultiQI_QueryMultipleInterfaces_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIMultiQI;
-
-
-    
-    struct __declspec(uuid("000e0020-0000-0000-C000-000000000046")) __declspec(novtable)
-    AsyncIMultiQI : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_QueryMultipleInterfaces( 
-             ULONG cMQIs,
-             MULTI_QI *pMQIs) = 0;
-        
-        virtual HRESULT __stdcall Finish_QueryMultipleInterfaces( 
-             MULTI_QI *pMQIs) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIMultiQI_Begin_QueryMultipleInterfaces_Proxy( 
-    AsyncIMultiQI * This,
-     ULONG cMQIs,
-     MULTI_QI *pMQIs);
-
-
-void __stdcall AsyncIMultiQI_Begin_QueryMultipleInterfaces_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIMultiQI_Finish_QueryMultipleInterfaces_Proxy( 
-    AsyncIMultiQI * This,
-     MULTI_QI *pMQIs);
-
-
-void __stdcall AsyncIMultiQI_Finish_QueryMultipleInterfaces_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IInternalUnknown;
-
-
-    
-    struct __declspec(uuid("00000021-0000-0000-C000-000000000046")) __declspec(novtable)
-    IInternalUnknown : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryInternalInterface( 
-             const IID & riid,
-             void **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternalUnknown_QueryInternalInterface_Proxy( 
-    IInternalUnknown * This,
-     const IID & riid,
-     void **ppv);
-
-
-void __stdcall IInternalUnknown_QueryInternalInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumUnknown *LPENUMUNKNOWN;
-
-
-extern "C" const IID IID_IEnumUnknown;
-
-
-    
-    struct __declspec(uuid("00000100-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumUnknown : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             IUnknown **rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumUnknown **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumUnknown_RemoteNext_Proxy( 
-    IEnumUnknown * This,
-     ULONG celt,
-     IUnknown **rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumUnknown_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumUnknown_Skip_Proxy( 
-    IEnumUnknown * This,
-     ULONG celt);
-
-
-void __stdcall IEnumUnknown_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumUnknown_Reset_Proxy( 
-    IEnumUnknown * This);
-
-
-void __stdcall IEnumUnknown_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumUnknown_Clone_Proxy( 
-    IEnumUnknown * This,
-     IEnumUnknown **ppenum);
-
-
-void __stdcall IEnumUnknown_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IBindCtx *LPBC;
-
-typedef  IBindCtx *LPBINDCTX;
-
-typedef struct tagBIND_OPTS
-    {
-    DWORD cbStruct;
-    DWORD grfFlags;
-    DWORD grfMode;
-    DWORD dwTickCountDeadline;
-    } 	BIND_OPTS;
-
-typedef struct tagBIND_OPTS *LPBIND_OPTS;
-
-
-    typedef struct tagBIND_OPTS2 : tagBIND_OPTS{
-    DWORD           dwTrackFlags;
-    DWORD           dwClassContext;
-    LCID            locale;
-    COSERVERINFO *  pServerInfo;
-    } BIND_OPTS2, * LPBIND_OPTS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagBIND_FLAGS
-    {	BIND_MAYBOTHERUSER	= 1,
-	BIND_JUSTTESTEXISTENCE	= 2
-    } 	BIND_FLAGS;
-
-
-extern "C" const IID IID_IBindCtx;
-
-
-    
-    struct __declspec(uuid("0000000e-0000-0000-C000-000000000046")) __declspec(novtable)
-    IBindCtx : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RegisterObjectBound( 
-             IUnknown *punk) = 0;
-        
-        virtual HRESULT __stdcall RevokeObjectBound( 
-             IUnknown *punk) = 0;
-        
-        virtual HRESULT __stdcall ReleaseBoundObjects( void) = 0;
-        
-        virtual  HRESULT __stdcall SetBindOptions( 
-             BIND_OPTS *pbindopts) = 0;
-        
-        virtual  HRESULT __stdcall GetBindOptions( 
-             BIND_OPTS *pbindopts) = 0;
-        
-        virtual HRESULT __stdcall GetRunningObjectTable( 
-             IRunningObjectTable **pprot) = 0;
-        
-        virtual HRESULT __stdcall RegisterObjectParam( 
-             LPOLESTR pszKey,
-             IUnknown *punk) = 0;
-        
-        virtual HRESULT __stdcall GetObjectParam( 
-             LPOLESTR pszKey,
-             IUnknown **ppunk) = 0;
-        
-        virtual HRESULT __stdcall EnumObjectParam( 
-             IEnumString **ppenum) = 0;
-        
-        virtual HRESULT __stdcall RevokeObjectParam( 
-             LPOLESTR pszKey) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBindCtx_RegisterObjectBound_Proxy( 
-    IBindCtx * This,
-     IUnknown *punk);
-
-
-void __stdcall IBindCtx_RegisterObjectBound_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_RevokeObjectBound_Proxy( 
-    IBindCtx * This,
-     IUnknown *punk);
-
-
-void __stdcall IBindCtx_RevokeObjectBound_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_ReleaseBoundObjects_Proxy( 
-    IBindCtx * This);
-
-
-void __stdcall IBindCtx_ReleaseBoundObjects_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindCtx_RemoteSetBindOptions_Proxy( 
-    IBindCtx * This,
-     BIND_OPTS2 *pbindopts);
-
-
-void __stdcall IBindCtx_RemoteSetBindOptions_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindCtx_RemoteGetBindOptions_Proxy( 
-    IBindCtx * This,
-     BIND_OPTS2 *pbindopts);
-
-
-void __stdcall IBindCtx_RemoteGetBindOptions_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_GetRunningObjectTable_Proxy( 
-    IBindCtx * This,
-     IRunningObjectTable **pprot);
-
-
-void __stdcall IBindCtx_GetRunningObjectTable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_RegisterObjectParam_Proxy( 
-    IBindCtx * This,
-     LPOLESTR pszKey,
-     IUnknown *punk);
-
-
-void __stdcall IBindCtx_RegisterObjectParam_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_GetObjectParam_Proxy( 
-    IBindCtx * This,
-     LPOLESTR pszKey,
-     IUnknown **ppunk);
-
-
-void __stdcall IBindCtx_GetObjectParam_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_EnumObjectParam_Proxy( 
-    IBindCtx * This,
-     IEnumString **ppenum);
-
-
-void __stdcall IBindCtx_EnumObjectParam_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_RevokeObjectParam_Proxy( 
-    IBindCtx * This,
-     LPOLESTR pszKey);
-
-
-void __stdcall IBindCtx_RevokeObjectParam_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumMoniker *LPENUMMONIKER;
-
-
-extern "C" const IID IID_IEnumMoniker;
-
-
-    
-    struct __declspec(uuid("00000102-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumMoniker : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             IMoniker **rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumMoniker **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumMoniker_RemoteNext_Proxy( 
-    IEnumMoniker * This,
-     ULONG celt,
-     IMoniker **rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumMoniker_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumMoniker_Skip_Proxy( 
-    IEnumMoniker * This,
-     ULONG celt);
-
-
-void __stdcall IEnumMoniker_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumMoniker_Reset_Proxy( 
-    IEnumMoniker * This);
-
-
-void __stdcall IEnumMoniker_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumMoniker_Clone_Proxy( 
-    IEnumMoniker * This,
-     IEnumMoniker **ppenum);
-
-
-void __stdcall IEnumMoniker_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IRunnableObject *LPRUNNABLEOBJECT;
-
-
-extern "C" const IID IID_IRunnableObject;
-
-
-    
-    struct __declspec(uuid("00000126-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRunnableObject : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetRunningClass( 
-             LPCLSID lpClsid) = 0;
-        
-        virtual HRESULT __stdcall Run( 
-             LPBINDCTX pbc) = 0;
-        
-        virtual  BOOL __stdcall IsRunning( void) = 0;
-        
-        virtual HRESULT __stdcall LockRunning( 
-             BOOL fLock,
-             BOOL fLastUnlockCloses) = 0;
-        
-        virtual HRESULT __stdcall SetContainedObject( 
-             BOOL fContained) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRunnableObject_GetRunningClass_Proxy( 
-    IRunnableObject * This,
-     LPCLSID lpClsid);
-
-
-void __stdcall IRunnableObject_GetRunningClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunnableObject_Run_Proxy( 
-    IRunnableObject * This,
-     LPBINDCTX pbc);
-
-
-void __stdcall IRunnableObject_Run_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IRunnableObject_RemoteIsRunning_Proxy( 
-    IRunnableObject * This);
-
-
-void __stdcall IRunnableObject_RemoteIsRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunnableObject_LockRunning_Proxy( 
-    IRunnableObject * This,
-     BOOL fLock,
-     BOOL fLastUnlockCloses);
-
-
-void __stdcall IRunnableObject_LockRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunnableObject_SetContainedObject_Proxy( 
-    IRunnableObject * This,
-     BOOL fContained);
-
-
-void __stdcall IRunnableObject_SetContainedObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IRunningObjectTable *LPRUNNINGOBJECTTABLE;
-
-
-extern "C" const IID IID_IRunningObjectTable;
-
-
-    
-    struct __declspec(uuid("00000010-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRunningObjectTable : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Register( 
-             DWORD grfFlags,
-             IUnknown *punkObject,
-             IMoniker *pmkObjectName,
-             DWORD *pdwRegister) = 0;
-        
-        virtual HRESULT __stdcall Revoke( 
-             DWORD dwRegister) = 0;
-        
-        virtual HRESULT __stdcall IsRunning( 
-             IMoniker *pmkObjectName) = 0;
-        
-        virtual HRESULT __stdcall GetObjectW( 
-             IMoniker *pmkObjectName,
-             IUnknown **ppunkObject) = 0;
-        
-        virtual HRESULT __stdcall NoteChangeTime( 
-             DWORD dwRegister,
-             FILETIME *pfiletime) = 0;
-        
-        virtual HRESULT __stdcall GetTimeOfLastChange( 
-             IMoniker *pmkObjectName,
-             FILETIME *pfiletime) = 0;
-        
-        virtual HRESULT __stdcall EnumRunning( 
-             IEnumMoniker **ppenumMoniker) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRunningObjectTable_Register_Proxy( 
-    IRunningObjectTable * This,
-     DWORD grfFlags,
-     IUnknown *punkObject,
-     IMoniker *pmkObjectName,
-     DWORD *pdwRegister);
-
-
-void __stdcall IRunningObjectTable_Register_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_Revoke_Proxy( 
-    IRunningObjectTable * This,
-     DWORD dwRegister);
-
-
-void __stdcall IRunningObjectTable_Revoke_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_IsRunning_Proxy( 
-    IRunningObjectTable * This,
-     IMoniker *pmkObjectName);
-
-
-void __stdcall IRunningObjectTable_IsRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_GetObject_Proxy( 
-    IRunningObjectTable * This,
-     IMoniker *pmkObjectName,
-     IUnknown **ppunkObject);
-
-
-void __stdcall IRunningObjectTable_GetObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_NoteChangeTime_Proxy( 
-    IRunningObjectTable * This,
-     DWORD dwRegister,
-     FILETIME *pfiletime);
-
-
-void __stdcall IRunningObjectTable_NoteChangeTime_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_GetTimeOfLastChange_Proxy( 
-    IRunningObjectTable * This,
-     IMoniker *pmkObjectName,
-     FILETIME *pfiletime);
-
-
-void __stdcall IRunningObjectTable_GetTimeOfLastChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_EnumRunning_Proxy( 
-    IRunningObjectTable * This,
-     IEnumMoniker **ppenumMoniker);
-
-
-void __stdcall IRunningObjectTable_EnumRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPersist *LPPERSIST;
-
-
-extern "C" const IID IID_IPersist;
-
-
-    
-    struct __declspec(uuid("0000010c-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPersist : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassID( 
-             CLSID *pClassID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersist_GetClassID_Proxy( 
-    IPersist * This,
-     CLSID *pClassID);
-
-
-void __stdcall IPersist_GetClassID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPersistStream *LPPERSISTSTREAM;
-
-
-extern "C" const IID IID_IPersistStream;
-
-
-    
-    struct __declspec(uuid("00000109-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPersistStream : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             IStream *pStm) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IStream *pStm,
-             BOOL fClearDirty) = 0;
-        
-        virtual HRESULT __stdcall GetSizeMax( 
-             ULARGE_INTEGER *pcbSize) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistStream_IsDirty_Proxy( 
-    IPersistStream * This);
-
-
-void __stdcall IPersistStream_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStream_Load_Proxy( 
-    IPersistStream * This,
-     IStream *pStm);
-
-
-void __stdcall IPersistStream_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStream_Save_Proxy( 
-    IPersistStream * This,
-     IStream *pStm,
-     BOOL fClearDirty);
-
-
-void __stdcall IPersistStream_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStream_GetSizeMax_Proxy( 
-    IPersistStream * This,
-     ULARGE_INTEGER *pcbSize);
-
-
-void __stdcall IPersistStream_GetSizeMax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMoniker *LPMONIKER;
-
-typedef 
-enum tagMKSYS
-    {	MKSYS_NONE	= 0,
-	MKSYS_GENERICCOMPOSITE	= 1,
-	MKSYS_FILEMONIKER	= 2,
-	MKSYS_ANTIMONIKER	= 3,
-	MKSYS_ITEMMONIKER	= 4,
-	MKSYS_POINTERMONIKER	= 5,
-	MKSYS_CLASSMONIKER	= 7,
-	MKSYS_OBJREFMONIKER	= 8,
-	MKSYS_SESSIONMONIKER	= 9
-    } 	MKSYS;
-
-typedef  
-enum tagMKREDUCE
-    {	MKRREDUCE_ONE	= 3 << 16,
-	MKRREDUCE_TOUSER	= 2 << 16,
-	MKRREDUCE_THROUGHUSER	= 1 << 16,
-	MKRREDUCE_ALL	= 0
-    } 	MKRREDUCE;
-
-
-extern "C" const IID IID_IMoniker;
-
-
-    
-    struct __declspec(uuid("0000000f-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMoniker : public IPersistStream
-    {
-    public:
-        virtual  HRESULT __stdcall BindToObject( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             const IID & riidResult,
-             void **ppvResult) = 0;
-        
-        virtual  HRESULT __stdcall BindToStorage( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             const IID & riid,
-             void **ppvObj) = 0;
-        
-        virtual HRESULT __stdcall Reduce( 
-             IBindCtx *pbc,
-             DWORD dwReduceHowFar,
-             IMoniker **ppmkToLeft,
-             IMoniker **ppmkReduced) = 0;
-        
-        virtual HRESULT __stdcall ComposeWith( 
-             IMoniker *pmkRight,
-             BOOL fOnlyIfNotGeneric,
-             IMoniker **ppmkComposite) = 0;
-        
-        virtual HRESULT __stdcall Enum( 
-             BOOL fForward,
-             IEnumMoniker **ppenumMoniker) = 0;
-        
-        virtual HRESULT __stdcall IsEqual( 
-             IMoniker *pmkOtherMoniker) = 0;
-        
-        virtual HRESULT __stdcall Hash( 
-             DWORD *pdwHash) = 0;
-        
-        virtual HRESULT __stdcall IsRunning( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             IMoniker *pmkNewlyRunning) = 0;
-        
-        virtual HRESULT __stdcall GetTimeOfLastChange( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             FILETIME *pFileTime) = 0;
-        
-        virtual HRESULT __stdcall Inverse( 
-             IMoniker **ppmk) = 0;
-        
-        virtual HRESULT __stdcall CommonPrefixWith( 
-             IMoniker *pmkOther,
-             IMoniker **ppmkPrefix) = 0;
-        
-        virtual HRESULT __stdcall RelativePathTo( 
-             IMoniker *pmkOther,
-             IMoniker **ppmkRelPath) = 0;
-        
-        virtual HRESULT __stdcall GetDisplayName( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             LPOLESTR *ppszDisplayName) = 0;
-        
-        virtual HRESULT __stdcall ParseDisplayName( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             LPOLESTR pszDisplayName,
-             ULONG *pchEaten,
-             IMoniker **ppmkOut) = 0;
-        
-        virtual HRESULT __stdcall IsSystemMoniker( 
-             DWORD *pdwMksys) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IMoniker_RemoteBindToObject_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riidResult,
-     IUnknown **ppvResult);
-
-
-void __stdcall IMoniker_RemoteBindToObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IMoniker_RemoteBindToStorage_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-void __stdcall IMoniker_RemoteBindToStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_Reduce_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     DWORD dwReduceHowFar,
-     IMoniker **ppmkToLeft,
-     IMoniker **ppmkReduced);
-
-
-void __stdcall IMoniker_Reduce_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_ComposeWith_Proxy( 
-    IMoniker * This,
-     IMoniker *pmkRight,
-     BOOL fOnlyIfNotGeneric,
-     IMoniker **ppmkComposite);
-
-
-void __stdcall IMoniker_ComposeWith_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_Enum_Proxy( 
-    IMoniker * This,
-     BOOL fForward,
-     IEnumMoniker **ppenumMoniker);
-
-
-void __stdcall IMoniker_Enum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_IsEqual_Proxy( 
-    IMoniker * This,
-     IMoniker *pmkOtherMoniker);
-
-
-void __stdcall IMoniker_IsEqual_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_Hash_Proxy( 
-    IMoniker * This,
-     DWORD *pdwHash);
-
-
-void __stdcall IMoniker_Hash_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_IsRunning_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     IMoniker *pmkNewlyRunning);
-
-
-void __stdcall IMoniker_IsRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_GetTimeOfLastChange_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     FILETIME *pFileTime);
-
-
-void __stdcall IMoniker_GetTimeOfLastChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_Inverse_Proxy( 
-    IMoniker * This,
-     IMoniker **ppmk);
-
-
-void __stdcall IMoniker_Inverse_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_CommonPrefixWith_Proxy( 
-    IMoniker * This,
-     IMoniker *pmkOther,
-     IMoniker **ppmkPrefix);
-
-
-void __stdcall IMoniker_CommonPrefixWith_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_RelativePathTo_Proxy( 
-    IMoniker * This,
-     IMoniker *pmkOther,
-     IMoniker **ppmkRelPath);
-
-
-void __stdcall IMoniker_RelativePathTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_GetDisplayName_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     LPOLESTR *ppszDisplayName);
-
-
-void __stdcall IMoniker_GetDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_ParseDisplayName_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     LPOLESTR pszDisplayName,
-     ULONG *pchEaten,
-     IMoniker **ppmkOut);
-
-
-void __stdcall IMoniker_ParseDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_IsSystemMoniker_Proxy( 
-    IMoniker * This,
-     DWORD *pdwMksys);
-
-
-void __stdcall IMoniker_IsSystemMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IROTData;
-
-
-    
-    struct __declspec(uuid("f29f6bc0-5021-11ce-aa15-00006901293f")) __declspec(novtable)
-    IROTData : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetComparisonData( 
-             byte *pbData,
-             ULONG cbMax,
-             ULONG *pcbData) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IROTData_GetComparisonData_Proxy( 
-    IROTData * This,
-     byte *pbData,
-     ULONG cbMax,
-     ULONG *pcbData);
-
-
-void __stdcall IROTData_GetComparisonData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumString *LPENUMSTRING;
-
-
-extern "C" const IID IID_IEnumString;
-
-
-    
-    struct __declspec(uuid("00000101-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumString : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             LPOLESTR *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumString **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumString_RemoteNext_Proxy( 
-    IEnumString * This,
-     ULONG celt,
-     LPOLESTR *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumString_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumString_Skip_Proxy( 
-    IEnumString * This,
-     ULONG celt);
-
-
-void __stdcall IEnumString_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumString_Reset_Proxy( 
-    IEnumString * This);
-
-
-void __stdcall IEnumString_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumString_Clone_Proxy( 
-    IEnumString * This,
-     IEnumString **ppenum);
-
-
-void __stdcall IEnumString_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISequentialStream;
-
-
-    
-    struct __declspec(uuid("0c733a30-2a1c-11ce-ade5-00aa0044773d")) __declspec(novtable)
-    ISequentialStream : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Read( 
-             void *pv,
-             ULONG cb,
-             ULONG *pcbRead) = 0;
-        
-        virtual  HRESULT __stdcall Write( 
-             const void *pv,
-             ULONG cb,
-             ULONG *pcbWritten) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ISequentialStream_RemoteRead_Proxy( 
-    ISequentialStream * This,
-     byte *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
-void __stdcall ISequentialStream_RemoteRead_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ISequentialStream_RemoteWrite_Proxy( 
-    ISequentialStream * This,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
-void __stdcall ISequentialStream_RemoteWrite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IStream *LPSTREAM;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSTATSTG
-    {
-    LPOLESTR pwcsName;
-    DWORD type;
-    ULARGE_INTEGER cbSize;
-    FILETIME mtime;
-    FILETIME ctime;
-    FILETIME atime;
-    DWORD grfMode;
-    DWORD grfLocksSupported;
-    CLSID clsid;
-    DWORD grfStateBits;
-    DWORD reserved;
-    } 	STATSTG;
-
-
-typedef 
-enum tagSTGTY
-    {	STGTY_STORAGE	= 1,
-	STGTY_STREAM	= 2,
-	STGTY_LOCKBYTES	= 3,
-	STGTY_PROPERTY	= 4
-    } 	STGTY;
-
-typedef 
-enum tagSTREAM_SEEK
-    {	STREAM_SEEK_SET	= 0,
-	STREAM_SEEK_CUR	= 1,
-	STREAM_SEEK_END	= 2
-    } 	STREAM_SEEK;
-
-typedef 
-enum tagLOCKTYPE
-    {	LOCK_WRITE	= 1,
-	LOCK_EXCLUSIVE	= 2,
-	LOCK_ONLYONCE	= 4
-    } 	LOCKTYPE;
-
-
-extern "C" const IID IID_IStream;
-
-
-    
-    struct __declspec(uuid("0000000c-0000-0000-C000-000000000046")) __declspec(novtable)
-    IStream : public ISequentialStream
-    {
-    public:
-        virtual  HRESULT __stdcall Seek( 
-             LARGE_INTEGER dlibMove,
-             DWORD dwOrigin,
-             ULARGE_INTEGER *plibNewPosition) = 0;
-        
-        virtual HRESULT __stdcall SetSize( 
-             ULARGE_INTEGER libNewSize) = 0;
-        
-        virtual  HRESULT __stdcall CopyTo( 
-             IStream *pstm,
-             ULARGE_INTEGER cb,
-             ULARGE_INTEGER *pcbRead,
-             ULARGE_INTEGER *pcbWritten) = 0;
-        
-        virtual HRESULT __stdcall Commit( 
-             DWORD grfCommitFlags) = 0;
-        
-        virtual HRESULT __stdcall Revert( void) = 0;
-        
-        virtual HRESULT __stdcall LockRegion( 
-             ULARGE_INTEGER libOffset,
-             ULARGE_INTEGER cb,
-             DWORD dwLockType) = 0;
-        
-        virtual HRESULT __stdcall UnlockRegion( 
-             ULARGE_INTEGER libOffset,
-             ULARGE_INTEGER cb,
-             DWORD dwLockType) = 0;
-        
-        virtual HRESULT __stdcall Stat( 
-             STATSTG *pstatstg,
-             DWORD grfStatFlag) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IStream **ppstm) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IStream_RemoteSeek_Proxy( 
-    IStream * This,
-     LARGE_INTEGER dlibMove,
-     DWORD dwOrigin,
-     ULARGE_INTEGER *plibNewPosition);
-
-
-void __stdcall IStream_RemoteSeek_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_SetSize_Proxy( 
-    IStream * This,
-     ULARGE_INTEGER libNewSize);
-
-
-void __stdcall IStream_SetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IStream_RemoteCopyTo_Proxy( 
-    IStream * This,
-     IStream *pstm,
-     ULARGE_INTEGER cb,
-     ULARGE_INTEGER *pcbRead,
-     ULARGE_INTEGER *pcbWritten);
-
-
-void __stdcall IStream_RemoteCopyTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_Commit_Proxy( 
-    IStream * This,
-     DWORD grfCommitFlags);
-
-
-void __stdcall IStream_Commit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_Revert_Proxy( 
-    IStream * This);
-
-
-void __stdcall IStream_Revert_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_LockRegion_Proxy( 
-    IStream * This,
-     ULARGE_INTEGER libOffset,
-     ULARGE_INTEGER cb,
-     DWORD dwLockType);
-
-
-void __stdcall IStream_LockRegion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_UnlockRegion_Proxy( 
-    IStream * This,
-     ULARGE_INTEGER libOffset,
-     ULARGE_INTEGER cb,
-     DWORD dwLockType);
-
-
-void __stdcall IStream_UnlockRegion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_Stat_Proxy( 
-    IStream * This,
-     STATSTG *pstatstg,
-     DWORD grfStatFlag);
-
-
-void __stdcall IStream_Stat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_Clone_Proxy( 
-    IStream * This,
-     IStream **ppstm);
-
-
-void __stdcall IStream_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumSTATSTG *LPENUMSTATSTG;
-
-
-extern "C" const IID IID_IEnumSTATSTG;
-
-
-    
-    struct __declspec(uuid("0000000d-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumSTATSTG : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             STATSTG *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumSTATSTG **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumSTATSTG_RemoteNext_Proxy( 
-    IEnumSTATSTG * This,
-     ULONG celt,
-     STATSTG *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumSTATSTG_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATSTG_Skip_Proxy( 
-    IEnumSTATSTG * This,
-     ULONG celt);
-
-
-void __stdcall IEnumSTATSTG_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATSTG_Reset_Proxy( 
-    IEnumSTATSTG * This);
-
-
-void __stdcall IEnumSTATSTG_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATSTG_Clone_Proxy( 
-    IEnumSTATSTG * This,
-     IEnumSTATSTG **ppenum);
-
-
-void __stdcall IEnumSTATSTG_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IStorage *LPSTORAGE;
-
-typedef struct tagRemSNB
-    {
-    unsigned long ulCntStr;
-    unsigned long ulCntChar;
-     OLECHAR rgString[ 1 ];
-    } 	RemSNB;
-
-typedef  RemSNB *wireSNB;
-
-typedef  OLECHAR **SNB;
-
-
-extern "C" const IID IID_IStorage;
-
-
-    
-    struct __declspec(uuid("0000000b-0000-0000-C000-000000000046")) __declspec(novtable)
-    IStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateStream( 
-             const OLECHAR *pwcsName,
-             DWORD grfMode,
-             DWORD reserved1,
-             DWORD reserved2,
-             IStream **ppstm) = 0;
-        
-        virtual  HRESULT __stdcall OpenStream( 
-             const OLECHAR *pwcsName,
-             void *reserved1,
-             DWORD grfMode,
-             DWORD reserved2,
-             IStream **ppstm) = 0;
-        
-        virtual HRESULT __stdcall CreateStorage( 
-             const OLECHAR *pwcsName,
-             DWORD grfMode,
-             DWORD reserved1,
-             DWORD reserved2,
-             IStorage **ppstg) = 0;
-        
-        virtual HRESULT __stdcall OpenStorage( 
-             const OLECHAR *pwcsName,
-             IStorage *pstgPriority,
-             DWORD grfMode,
-             SNB snbExclude,
-             DWORD reserved,
-             IStorage **ppstg) = 0;
-        
-        virtual HRESULT __stdcall CopyTo( 
-             DWORD ciidExclude,
-             const IID *rgiidExclude,
-             SNB snbExclude,
-             IStorage *pstgDest) = 0;
-        
-        virtual HRESULT __stdcall MoveElementTo( 
-             const OLECHAR *pwcsName,
-             IStorage *pstgDest,
-             const OLECHAR *pwcsNewName,
-             DWORD grfFlags) = 0;
-        
-        virtual HRESULT __stdcall Commit( 
-             DWORD grfCommitFlags) = 0;
-        
-        virtual HRESULT __stdcall Revert( void) = 0;
-        
-        virtual  HRESULT __stdcall EnumElements( 
-             DWORD reserved1,
-             void *reserved2,
-             DWORD reserved3,
-             IEnumSTATSTG **ppenum) = 0;
-        
-        virtual HRESULT __stdcall DestroyElement( 
-             const OLECHAR *pwcsName) = 0;
-        
-        virtual HRESULT __stdcall RenameElement( 
-             const OLECHAR *pwcsOldName,
-             const OLECHAR *pwcsNewName) = 0;
-        
-        virtual HRESULT __stdcall SetElementTimes( 
-             const OLECHAR *pwcsName,
-             const FILETIME *pctime,
-             const FILETIME *patime,
-             const FILETIME *pmtime) = 0;
-        
-        virtual HRESULT __stdcall SetClass( 
-             const IID & clsid) = 0;
-        
-        virtual HRESULT __stdcall SetStateBits( 
-             DWORD grfStateBits,
-             DWORD grfMask) = 0;
-        
-        virtual HRESULT __stdcall Stat( 
-             STATSTG *pstatstg,
-             DWORD grfStatFlag) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IStorage_CreateStream_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     DWORD grfMode,
-     DWORD reserved1,
-     DWORD reserved2,
-     IStream **ppstm);
-
-
-void __stdcall IStorage_CreateStream_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IStorage_RemoteOpenStream_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     unsigned long cbReserved1,
-     byte *reserved1,
-     DWORD grfMode,
-     DWORD reserved2,
-     IStream **ppstm);
-
-
-void __stdcall IStorage_RemoteOpenStream_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_CreateStorage_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     DWORD grfMode,
-     DWORD reserved1,
-     DWORD reserved2,
-     IStorage **ppstg);
-
-
-void __stdcall IStorage_CreateStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_OpenStorage_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     IStorage *pstgPriority,
-     DWORD grfMode,
-     SNB snbExclude,
-     DWORD reserved,
-     IStorage **ppstg);
-
-
-void __stdcall IStorage_OpenStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_CopyTo_Proxy( 
-    IStorage * This,
-     DWORD ciidExclude,
-     const IID *rgiidExclude,
-     SNB snbExclude,
-     IStorage *pstgDest);
-
-
-void __stdcall IStorage_CopyTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_MoveElementTo_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     IStorage *pstgDest,
-     const OLECHAR *pwcsNewName,
-     DWORD grfFlags);
-
-
-void __stdcall IStorage_MoveElementTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_Commit_Proxy( 
-    IStorage * This,
-     DWORD grfCommitFlags);
-
-
-void __stdcall IStorage_Commit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_Revert_Proxy( 
-    IStorage * This);
-
-
-void __stdcall IStorage_Revert_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IStorage_RemoteEnumElements_Proxy( 
-    IStorage * This,
-     DWORD reserved1,
-     unsigned long cbReserved2,
-     byte *reserved2,
-     DWORD reserved3,
-     IEnumSTATSTG **ppenum);
-
-
-void __stdcall IStorage_RemoteEnumElements_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_DestroyElement_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName);
-
-
-void __stdcall IStorage_DestroyElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_RenameElement_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsOldName,
-     const OLECHAR *pwcsNewName);
-
-
-void __stdcall IStorage_RenameElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_SetElementTimes_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     const FILETIME *pctime,
-     const FILETIME *patime,
-     const FILETIME *pmtime);
-
-
-void __stdcall IStorage_SetElementTimes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_SetClass_Proxy( 
-    IStorage * This,
-     const IID & clsid);
-
-
-void __stdcall IStorage_SetClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_SetStateBits_Proxy( 
-    IStorage * This,
-     DWORD grfStateBits,
-     DWORD grfMask);
-
-
-void __stdcall IStorage_SetStateBits_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_Stat_Proxy( 
-    IStorage * This,
-     STATSTG *pstatstg,
-     DWORD grfStatFlag);
-
-
-void __stdcall IStorage_Stat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPersistFile *LPPERSISTFILE;
-
-
-extern "C" const IID IID_IPersistFile;
-
-
-    
-    struct __declspec(uuid("0000010b-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPersistFile : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             LPCOLESTR pszFileName,
-             DWORD dwMode) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             LPCOLESTR pszFileName,
-             BOOL fRemember) = 0;
-        
-        virtual HRESULT __stdcall SaveCompleted( 
-             LPCOLESTR pszFileName) = 0;
-        
-        virtual HRESULT __stdcall GetCurFile( 
-             LPOLESTR *ppszFileName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistFile_IsDirty_Proxy( 
-    IPersistFile * This);
-
-
-void __stdcall IPersistFile_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistFile_Load_Proxy( 
-    IPersistFile * This,
-     LPCOLESTR pszFileName,
-     DWORD dwMode);
-
-
-void __stdcall IPersistFile_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistFile_Save_Proxy( 
-    IPersistFile * This,
-     LPCOLESTR pszFileName,
-     BOOL fRemember);
-
-
-void __stdcall IPersistFile_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistFile_SaveCompleted_Proxy( 
-    IPersistFile * This,
-     LPCOLESTR pszFileName);
-
-
-void __stdcall IPersistFile_SaveCompleted_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistFile_GetCurFile_Proxy( 
-    IPersistFile * This,
-     LPOLESTR *ppszFileName);
-
-
-void __stdcall IPersistFile_GetCurFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPersistStorage *LPPERSISTSTORAGE;
-
-
-extern "C" const IID IID_IPersistStorage;
-
-
-    
-    struct __declspec(uuid("0000010a-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPersistStorage : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall InitNew( 
-             IStorage *pStg) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             IStorage *pStg) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IStorage *pStgSave,
-             BOOL fSameAsLoad) = 0;
-        
-        virtual HRESULT __stdcall SaveCompleted( 
-             IStorage *pStgNew) = 0;
-        
-        virtual HRESULT __stdcall HandsOffStorage( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistStorage_IsDirty_Proxy( 
-    IPersistStorage * This);
-
-
-void __stdcall IPersistStorage_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_InitNew_Proxy( 
-    IPersistStorage * This,
-     IStorage *pStg);
-
-
-void __stdcall IPersistStorage_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_Load_Proxy( 
-    IPersistStorage * This,
-     IStorage *pStg);
-
-
-void __stdcall IPersistStorage_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_Save_Proxy( 
-    IPersistStorage * This,
-     IStorage *pStgSave,
-     BOOL fSameAsLoad);
-
-
-void __stdcall IPersistStorage_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_SaveCompleted_Proxy( 
-    IPersistStorage * This,
-     IStorage *pStgNew);
-
-
-void __stdcall IPersistStorage_SaveCompleted_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_HandsOffStorage_Proxy( 
-    IPersistStorage * This);
-
-
-void __stdcall IPersistStorage_HandsOffStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ILockBytes *LPLOCKBYTES;
-
-
-extern "C" const IID IID_ILockBytes;
-
-
-    
-    struct __declspec(uuid("0000000a-0000-0000-C000-000000000046")) __declspec(novtable)
-    ILockBytes : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall ReadAt( 
-             ULARGE_INTEGER ulOffset,
-             void *pv,
-             ULONG cb,
-             ULONG *pcbRead) = 0;
-        
-        virtual  HRESULT __stdcall WriteAt( 
-             ULARGE_INTEGER ulOffset,
-             const void *pv,
-             ULONG cb,
-             ULONG *pcbWritten) = 0;
-        
-        virtual HRESULT __stdcall Flush( void) = 0;
-        
-        virtual HRESULT __stdcall SetSize( 
-             ULARGE_INTEGER cb) = 0;
-        
-        virtual HRESULT __stdcall LockRegion( 
-             ULARGE_INTEGER libOffset,
-             ULARGE_INTEGER cb,
-             DWORD dwLockType) = 0;
-        
-        virtual HRESULT __stdcall UnlockRegion( 
-             ULARGE_INTEGER libOffset,
-             ULARGE_INTEGER cb,
-             DWORD dwLockType) = 0;
-        
-        virtual HRESULT __stdcall Stat( 
-             STATSTG *pstatstg,
-             DWORD grfStatFlag) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ILockBytes_RemoteReadAt_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     byte *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
-void __stdcall ILockBytes_RemoteReadAt_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ILockBytes_RemoteWriteAt_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
-void __stdcall ILockBytes_RemoteWriteAt_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_Flush_Proxy( 
-    ILockBytes * This);
-
-
-void __stdcall ILockBytes_Flush_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_SetSize_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER cb);
-
-
-void __stdcall ILockBytes_SetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_LockRegion_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER libOffset,
-     ULARGE_INTEGER cb,
-     DWORD dwLockType);
-
-
-void __stdcall ILockBytes_LockRegion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_UnlockRegion_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER libOffset,
-     ULARGE_INTEGER cb,
-     DWORD dwLockType);
-
-
-void __stdcall ILockBytes_UnlockRegion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_Stat_Proxy( 
-    ILockBytes * This,
-     STATSTG *pstatstg,
-     DWORD grfStatFlag);
-
-
-void __stdcall ILockBytes_Stat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumFORMATETC *LPENUMFORMATETC;
-
-typedef struct tagDVTARGETDEVICE
-    {
-    DWORD tdSize;
-    WORD tdDriverNameOffset;
-    WORD tdDeviceNameOffset;
-    WORD tdPortNameOffset;
-    WORD tdExtDevmodeOffset;
-     BYTE tdData[ 1 ];
-    } 	DVTARGETDEVICE;
-
-typedef CLIPFORMAT *LPCLIPFORMAT;
-
-typedef struct tagFORMATETC
-    {
-    CLIPFORMAT cfFormat;
-     DVTARGETDEVICE *ptd;
-    DWORD dwAspect;
-    LONG lindex;
-    DWORD tymed;
-    } 	FORMATETC;
-
-typedef struct tagFORMATETC *LPFORMATETC;
-
-
-extern "C" const IID IID_IEnumFORMATETC;
-
-
-    
-    struct __declspec(uuid("00000103-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumFORMATETC : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             FORMATETC *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumFORMATETC **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumFORMATETC_RemoteNext_Proxy( 
-    IEnumFORMATETC * This,
-     ULONG celt,
-     FORMATETC *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumFORMATETC_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumFORMATETC_Skip_Proxy( 
-    IEnumFORMATETC * This,
-     ULONG celt);
-
-
-void __stdcall IEnumFORMATETC_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumFORMATETC_Reset_Proxy( 
-    IEnumFORMATETC * This);
-
-
-void __stdcall IEnumFORMATETC_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumFORMATETC_Clone_Proxy( 
-    IEnumFORMATETC * This,
-     IEnumFORMATETC **ppenum);
-
-
-void __stdcall IEnumFORMATETC_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumSTATDATA *LPENUMSTATDATA;
-
-typedef 
-enum tagADVF
-    {	ADVF_NODATA	= 1,
-	ADVF_PRIMEFIRST	= 2,
-	ADVF_ONLYONCE	= 4,
-	ADVF_DATAONSTOP	= 64,
-	ADVFCACHE_NOHANDLER	= 8,
-	ADVFCACHE_FORCEBUILTIN	= 16,
-	ADVFCACHE_ONSAVE	= 32
-    } 	ADVF;
-
-typedef struct tagSTATDATA
-    {
-    FORMATETC formatetc;
-    DWORD advf;
-     IAdviseSink *pAdvSink;
-    DWORD dwConnection;
-    } 	STATDATA;
-
-typedef STATDATA *LPSTATDATA;
-
-
-extern "C" const IID IID_IEnumSTATDATA;
-
-
-    
-    struct __declspec(uuid("00000105-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumSTATDATA : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             STATDATA *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumSTATDATA **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumSTATDATA_RemoteNext_Proxy( 
-    IEnumSTATDATA * This,
-     ULONG celt,
-     STATDATA *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumSTATDATA_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATDATA_Skip_Proxy( 
-    IEnumSTATDATA * This,
-     ULONG celt);
-
-
-void __stdcall IEnumSTATDATA_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATDATA_Reset_Proxy( 
-    IEnumSTATDATA * This);
-
-
-void __stdcall IEnumSTATDATA_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATDATA_Clone_Proxy( 
-    IEnumSTATDATA * This,
-     IEnumSTATDATA **ppenum);
-
-
-void __stdcall IEnumSTATDATA_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IRootStorage *LPROOTSTORAGE;
-
-
-extern "C" const IID IID_IRootStorage;
-
-
-    
-    struct __declspec(uuid("00000012-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRootStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SwitchToFile( 
-             LPOLESTR pszFile) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRootStorage_SwitchToFile_Proxy( 
-    IRootStorage * This,
-     LPOLESTR pszFile);
-
-
-void __stdcall IRootStorage_SwitchToFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IAdviseSink *LPADVISESINK;
-
-typedef  
-enum tagTYMED
-    {	TYMED_HGLOBAL	= 1,
-	TYMED_FILE	= 2,
-	TYMED_ISTREAM	= 4,
-	TYMED_ISTORAGE	= 8,
-	TYMED_GDI	= 16,
-	TYMED_MFPICT	= 32,
-	TYMED_ENHMF	= 64,
-	TYMED_NULL	= 0
-    } 	TYMED;
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4200)
-
-typedef struct tagRemSTGMEDIUM
-    {
-    DWORD tymed;
-    DWORD dwHandleType;
-    unsigned long pData;
-    unsigned long pUnkForRelease;
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemSTGMEDIUM;
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSTGMEDIUM
-    {
-    DWORD tymed;
-     union 
-        {
-         HBITMAP hBitmap;
-         HMETAFILEPICT hMetaFilePict;
-         HENHMETAFILE hEnhMetaFile;
-         HGLOBAL hGlobal;
-         LPOLESTR lpszFileName;
-         IStream *pstm;
-         IStorage *pstg;
-           
-        } 	;
-     IUnknown *pUnkForRelease;
-    } 	uSTGMEDIUM;
-
-
-typedef struct _GDI_OBJECT
-    {
-    DWORD ObjectType;
-      union __MIDL_IAdviseSink_0002
-        {
-         wireHBITMAP hBitmap;
-         wireHPALETTE hPalette;
-         wireHGLOBAL hGeneric;
-        } 	u;
-    } 	GDI_OBJECT;
-
-typedef struct _userSTGMEDIUM
-    {
-    struct _STGMEDIUM_UNION
-        {
-        DWORD tymed;
-          union __MIDL_IAdviseSink_0003
-            {
-               
-             wireHMETAFILEPICT hMetaFilePict;
-             wireHENHMETAFILE hHEnhMetaFile;
-             GDI_OBJECT *hGdiHandle;
-             wireHGLOBAL hGlobal;
-             LPOLESTR lpszFileName;
-             BYTE_BLOB *pstm;
-             BYTE_BLOB *pstg;
-            } 	u;
-        } 	;
-    IUnknown *pUnkForRelease;
-    } 	userSTGMEDIUM;
-
-typedef  userSTGMEDIUM *wireSTGMEDIUM;
-
-typedef  uSTGMEDIUM STGMEDIUM;
-
-typedef  userSTGMEDIUM *wireASYNC_STGMEDIUM;
-
-typedef  STGMEDIUM ASYNC_STGMEDIUM;
-
-typedef STGMEDIUM *LPSTGMEDIUM;
-
-typedef struct _userFLAG_STGMEDIUM
-    {
-    long ContextFlags;
-    long fPassOwnership;
-    userSTGMEDIUM Stgmed;
-    } 	userFLAG_STGMEDIUM;
-
-typedef  userFLAG_STGMEDIUM *wireFLAG_STGMEDIUM;
-
-typedef  struct _FLAG_STGMEDIUM
-    {
-    long ContextFlags;
-    long fPassOwnership;
-    STGMEDIUM Stgmed;
-    } 	FLAG_STGMEDIUM;
-
-
-extern "C" const IID IID_IAdviseSink;
-
-
-    
-    struct __declspec(uuid("0000010f-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAdviseSink : public IUnknown
-    {
-    public:
-        virtual  void __stdcall OnDataChange( 
-             FORMATETC *pFormatetc,
-             STGMEDIUM *pStgmed) = 0;
-        
-        virtual  void __stdcall OnViewChange( 
-             DWORD dwAspect,
-             LONG lindex) = 0;
-        
-        virtual  void __stdcall OnRename( 
-             IMoniker *pmk) = 0;
-        
-        virtual  void __stdcall OnSave( void) = 0;
-        
-        virtual  void __stdcall OnClose( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnDataChange_Proxy( 
-    IAdviseSink * This,
-     FORMATETC *pFormatetc,
-     ASYNC_STGMEDIUM *pStgmed);
-
-
-void __stdcall IAdviseSink_RemoteOnDataChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnViewChange_Proxy( 
-    IAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
-
-void __stdcall IAdviseSink_RemoteOnViewChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnRename_Proxy( 
-    IAdviseSink * This,
-     IMoniker *pmk);
-
-
-void __stdcall IAdviseSink_RemoteOnRename_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnSave_Proxy( 
-    IAdviseSink * This);
-
-
-void __stdcall IAdviseSink_RemoteOnSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnClose_Proxy( 
-    IAdviseSink * This);
-
-
-void __stdcall IAdviseSink_RemoteOnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIAdviseSink;
-
-
-    
-    struct __declspec(uuid("00000150-0000-0000-C000-000000000046")) __declspec(novtable)
-    AsyncIAdviseSink : public IUnknown
-    {
-    public:
-        virtual  void __stdcall Begin_OnDataChange( 
-             FORMATETC *pFormatetc,
-             STGMEDIUM *pStgmed) = 0;
-        
-        virtual  void __stdcall Finish_OnDataChange( void) = 0;
-        
-        virtual  void __stdcall Begin_OnViewChange( 
-             DWORD dwAspect,
-             LONG lindex) = 0;
-        
-        virtual  void __stdcall Finish_OnViewChange( void) = 0;
-        
-        virtual  void __stdcall Begin_OnRename( 
-             IMoniker *pmk) = 0;
-        
-        virtual  void __stdcall Finish_OnRename( void) = 0;
-        
-        virtual  void __stdcall Begin_OnSave( void) = 0;
-        
-        virtual  void __stdcall Finish_OnSave( void) = 0;
-        
-        virtual  void __stdcall Begin_OnClose( void) = 0;
-        
-        virtual  void __stdcall Finish_OnClose( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnDataChange_Proxy( 
-    AsyncIAdviseSink * This,
-     FORMATETC *pFormatetc,
-     ASYNC_STGMEDIUM *pStgmed);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnDataChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnDataChange_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnDataChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnViewChange_Proxy( 
-    AsyncIAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnViewChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnViewChange_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnViewChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnRename_Proxy( 
-    AsyncIAdviseSink * This,
-     IMoniker *pmk);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnRename_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnRename_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnRename_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnSave_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnSave_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnClose_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnClose_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IAdviseSink2 *LPADVISESINK2;
-
-
-extern "C" const IID IID_IAdviseSink2;
-
-
-    
-    struct __declspec(uuid("00000125-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAdviseSink2 : public IAdviseSink
-    {
-    public:
-        virtual  void __stdcall OnLinkSrcChange( 
-             IMoniker *pmk) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAdviseSink2_RemoteOnLinkSrcChange_Proxy( 
-    IAdviseSink2 * This,
-     IMoniker *pmk);
-
-
-void __stdcall IAdviseSink2_RemoteOnLinkSrcChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIAdviseSink2;
-
-
-    
-    struct __declspec(uuid("00000151-0000-0000-C000-000000000046")) __declspec(novtable)
-    AsyncIAdviseSink2 : public AsyncIAdviseSink
-    {
-    public:
-        virtual  void __stdcall Begin_OnLinkSrcChange( 
-             IMoniker *pmk) = 0;
-        
-        virtual  void __stdcall Finish_OnLinkSrcChange( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall AsyncIAdviseSink2_Begin_RemoteOnLinkSrcChange_Proxy( 
-    AsyncIAdviseSink2 * This,
-     IMoniker *pmk);
-
-
-void __stdcall AsyncIAdviseSink2_Begin_RemoteOnLinkSrcChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Proxy( 
-    AsyncIAdviseSink2 * This);
-
-
-void __stdcall AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDataObject *LPDATAOBJECT;
-
-typedef 
-enum tagDATADIR
-    {	DATADIR_GET	= 1,
-	DATADIR_SET	= 2
-    } 	DATADIR;
-
-
-extern "C" const IID IID_IDataObject;
-
-
-    
-    struct __declspec(uuid("0000010e-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDataObject : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall GetData( 
-             FORMATETC *pformatetcIn,
-             STGMEDIUM *pmedium) = 0;
-        
-        virtual  HRESULT __stdcall GetDataHere( 
-             FORMATETC *pformatetc,
-             STGMEDIUM *pmedium) = 0;
-        
-        virtual HRESULT __stdcall QueryGetData( 
-             FORMATETC *pformatetc) = 0;
-        
-        virtual HRESULT __stdcall GetCanonicalFormatEtc( 
-             FORMATETC *pformatectIn,
-             FORMATETC *pformatetcOut) = 0;
-        
-        virtual  HRESULT __stdcall SetData( 
-             FORMATETC *pformatetc,
-             STGMEDIUM *pmedium,
-             BOOL fRelease) = 0;
-        
-        virtual HRESULT __stdcall EnumFormatEtc( 
-             DWORD dwDirection,
-             IEnumFORMATETC **ppenumFormatEtc) = 0;
-        
-        virtual HRESULT __stdcall DAdvise( 
-             FORMATETC *pformatetc,
-             DWORD advf,
-             IAdviseSink *pAdvSink,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall DUnadvise( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumDAdvise( 
-             IEnumSTATDATA **ppenumAdvise) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IDataObject_RemoteGetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetcIn,
-     STGMEDIUM *pRemoteMedium);
-
-
-void __stdcall IDataObject_RemoteGetData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IDataObject_RemoteGetDataHere_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pRemoteMedium);
-
-
-void __stdcall IDataObject_RemoteGetDataHere_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_QueryGetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc);
-
-
-void __stdcall IDataObject_QueryGetData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_GetCanonicalFormatEtc_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatectIn,
-     FORMATETC *pformatetcOut);
-
-
-void __stdcall IDataObject_GetCanonicalFormatEtc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IDataObject_RemoteSetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     FLAG_STGMEDIUM *pmedium,
-     BOOL fRelease);
-
-
-void __stdcall IDataObject_RemoteSetData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_EnumFormatEtc_Proxy( 
-    IDataObject * This,
-     DWORD dwDirection,
-     IEnumFORMATETC **ppenumFormatEtc);
-
-
-void __stdcall IDataObject_EnumFormatEtc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_DAdvise_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     DWORD advf,
-     IAdviseSink *pAdvSink,
-     DWORD *pdwConnection);
-
-
-void __stdcall IDataObject_DAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_DUnadvise_Proxy( 
-    IDataObject * This,
-     DWORD dwConnection);
-
-
-void __stdcall IDataObject_DUnadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_EnumDAdvise_Proxy( 
-    IDataObject * This,
-     IEnumSTATDATA **ppenumAdvise);
-
-
-void __stdcall IDataObject_EnumDAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDataAdviseHolder *LPDATAADVISEHOLDER;
-
-
-extern "C" const IID IID_IDataAdviseHolder;
-
-
-    
-    struct __declspec(uuid("00000110-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDataAdviseHolder : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Advise( 
-             IDataObject *pDataObject,
-             FORMATETC *pFetc,
-             DWORD advf,
-             IAdviseSink *pAdvise,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall Unadvise( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumAdvise( 
-             IEnumSTATDATA **ppenumAdvise) = 0;
-        
-        virtual HRESULT __stdcall SendOnDataChange( 
-             IDataObject *pDataObject,
-             DWORD dwReserved,
-             DWORD advf) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDataAdviseHolder_Advise_Proxy( 
-    IDataAdviseHolder * This,
-     IDataObject *pDataObject,
-     FORMATETC *pFetc,
-     DWORD advf,
-     IAdviseSink *pAdvise,
-     DWORD *pdwConnection);
-
-
-void __stdcall IDataAdviseHolder_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataAdviseHolder_Unadvise_Proxy( 
-    IDataAdviseHolder * This,
-     DWORD dwConnection);
-
-
-void __stdcall IDataAdviseHolder_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataAdviseHolder_EnumAdvise_Proxy( 
-    IDataAdviseHolder * This,
-     IEnumSTATDATA **ppenumAdvise);
-
-
-void __stdcall IDataAdviseHolder_EnumAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataAdviseHolder_SendOnDataChange_Proxy( 
-    IDataAdviseHolder * This,
-     IDataObject *pDataObject,
-     DWORD dwReserved,
-     DWORD advf);
-
-
-void __stdcall IDataAdviseHolder_SendOnDataChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMessageFilter *LPMESSAGEFILTER;
-
-typedef 
-enum tagCALLTYPE
-    {	CALLTYPE_TOPLEVEL	= 1,
-	CALLTYPE_NESTED	= 2,
-	CALLTYPE_ASYNC	= 3,
-	CALLTYPE_TOPLEVEL_CALLPENDING	= 4,
-	CALLTYPE_ASYNC_CALLPENDING	= 5
-    } 	CALLTYPE;
-
-typedef 
-enum tagSERVERCALL
-    {	SERVERCALL_ISHANDLED	= 0,
-	SERVERCALL_REJECTED	= 1,
-	SERVERCALL_RETRYLATER	= 2
-    } 	SERVERCALL;
-
-typedef 
-enum tagPENDINGTYPE
-    {	PENDINGTYPE_TOPLEVEL	= 1,
-	PENDINGTYPE_NESTED	= 2
-    } 	PENDINGTYPE;
-
-typedef 
-enum tagPENDINGMSG
-    {	PENDINGMSG_CANCELCALL	= 0,
-	PENDINGMSG_WAITNOPROCESS	= 1,
-	PENDINGMSG_WAITDEFPROCESS	= 2
-    } 	PENDINGMSG;
-
-typedef struct tagINTERFACEINFO
-    {
-    IUnknown *pUnk;
-    IID iid;
-    WORD wMethod;
-    } 	INTERFACEINFO;
-
-typedef struct tagINTERFACEINFO *LPINTERFACEINFO;
-
-
-extern "C" const IID IID_IMessageFilter;
-
-
-    
-    struct __declspec(uuid("00000016-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMessageFilter : public IUnknown
-    {
-    public:
-        virtual DWORD __stdcall HandleInComingCall( 
-             DWORD dwCallType,
-             HTASK htaskCaller,
-             DWORD dwTickCount,
-             LPINTERFACEINFO lpInterfaceInfo) = 0;
-        
-        virtual DWORD __stdcall RetryRejectedCall( 
-             HTASK htaskCallee,
-             DWORD dwTickCount,
-             DWORD dwRejectType) = 0;
-        
-        virtual DWORD __stdcall MessagePending( 
-             HTASK htaskCallee,
-             DWORD dwTickCount,
-             DWORD dwPendingType) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall IMessageFilter_HandleInComingCall_Proxy( 
-    IMessageFilter * This,
-     DWORD dwCallType,
-     HTASK htaskCaller,
-     DWORD dwTickCount,
-     LPINTERFACEINFO lpInterfaceInfo);
-
-
-void __stdcall IMessageFilter_HandleInComingCall_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-DWORD __stdcall IMessageFilter_RetryRejectedCall_Proxy( 
-    IMessageFilter * This,
-     HTASK htaskCallee,
-     DWORD dwTickCount,
-     DWORD dwRejectType);
-
-
-void __stdcall IMessageFilter_RetryRejectedCall_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-DWORD __stdcall IMessageFilter_MessagePending_Proxy( 
-    IMessageFilter * This,
-     HTASK htaskCallee,
-     DWORD dwTickCount,
-     DWORD dwPendingType);
-
-
-void __stdcall IMessageFilter_MessagePending_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef unsigned long RPCOLEDATAREP;
-
-typedef struct tagRPCOLEMESSAGE
-    {
-    void *reserved1;
-    RPCOLEDATAREP dataRepresentation;
-    void *Buffer;
-    ULONG cbBuffer;
-    ULONG iMethod;
-    void *reserved2[ 5 ];
-    ULONG rpcFlags;
-    } 	RPCOLEMESSAGE;
-
-typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
-
-
-extern "C" const IID IID_IRpcChannelBuffer;
-
-
-    
-    struct __declspec(uuid("D5F56B60-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
-    IRpcChannelBuffer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetBuffer( 
-             RPCOLEMESSAGE *pMessage,
-             const IID & riid) = 0;
-        
-        virtual HRESULT __stdcall SendReceive( 
-             RPCOLEMESSAGE *pMessage,
-             ULONG *pStatus) = 0;
-        
-        virtual HRESULT __stdcall FreeBuffer( 
-             RPCOLEMESSAGE *pMessage) = 0;
-        
-        virtual HRESULT __stdcall GetDestCtx( 
-             DWORD *pdwDestContext,
-             void **ppvDestContext) = 0;
-        
-        virtual HRESULT __stdcall IsConnected( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcChannelBuffer_GetBuffer_Proxy( 
-    IRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMessage,
-     const IID & riid);
-
-
-void __stdcall IRpcChannelBuffer_GetBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer_SendReceive_Proxy( 
-    IRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMessage,
-     ULONG *pStatus);
-
-
-void __stdcall IRpcChannelBuffer_SendReceive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer_FreeBuffer_Proxy( 
-    IRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMessage);
-
-
-void __stdcall IRpcChannelBuffer_FreeBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer_GetDestCtx_Proxy( 
-    IRpcChannelBuffer * This,
-     DWORD *pdwDestContext,
-     void **ppvDestContext);
-
-
-void __stdcall IRpcChannelBuffer_GetDestCtx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer_IsConnected_Proxy( 
-    IRpcChannelBuffer * This);
-
-
-void __stdcall IRpcChannelBuffer_IsConnected_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcChannelBuffer2;
-
-
-    
-    struct __declspec(uuid("594f31d0-7f19-11d0-b194-00a0c90dc8bf")) __declspec(novtable)
-    IRpcChannelBuffer2 : public IRpcChannelBuffer
-    {
-    public:
-        virtual HRESULT __stdcall GetProtocolVersion( 
-             DWORD *pdwVersion) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcChannelBuffer2_GetProtocolVersion_Proxy( 
-    IRpcChannelBuffer2 * This,
-     DWORD *pdwVersion);
-
-
-void __stdcall IRpcChannelBuffer2_GetProtocolVersion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAsyncRpcChannelBuffer;
-
-
-    
-    struct __declspec(uuid("a5029fb6-3c34-11d1-9c99-00c04fb998aa")) __declspec(novtable)
-    IAsyncRpcChannelBuffer : public IRpcChannelBuffer2
-    {
-    public:
-        virtual HRESULT __stdcall Send( 
-             RPCOLEMESSAGE *pMsg,
-             ISynchronize *pSync,
-             ULONG *pulStatus) = 0;
-        
-        virtual HRESULT __stdcall Receive( 
-             RPCOLEMESSAGE *pMsg,
-             ULONG *pulStatus) = 0;
-        
-        virtual HRESULT __stdcall GetDestCtxEx( 
-             RPCOLEMESSAGE *pMsg,
-             DWORD *pdwDestContext,
-             void **ppvDestContext) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAsyncRpcChannelBuffer_Send_Proxy( 
-    IAsyncRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMsg,
-     ISynchronize *pSync,
-     ULONG *pulStatus);
-
-
-void __stdcall IAsyncRpcChannelBuffer_Send_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAsyncRpcChannelBuffer_Receive_Proxy( 
-    IAsyncRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMsg,
-     ULONG *pulStatus);
-
-
-void __stdcall IAsyncRpcChannelBuffer_Receive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAsyncRpcChannelBuffer_GetDestCtxEx_Proxy( 
-    IAsyncRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMsg,
-     DWORD *pdwDestContext,
-     void **ppvDestContext);
-
-
-void __stdcall IAsyncRpcChannelBuffer_GetDestCtxEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcChannelBuffer3;
-
-
-    
-    struct __declspec(uuid("25B15600-0115-11d0-BF0D-00AA00B8DFD2")) __declspec(novtable)
-    IRpcChannelBuffer3 : public IRpcChannelBuffer2
-    {
-    public:
-        virtual HRESULT __stdcall Send( 
-             RPCOLEMESSAGE *pMsg,
-             ULONG *pulStatus) = 0;
-        
-        virtual HRESULT __stdcall Receive( 
-             RPCOLEMESSAGE *pMsg,
-             ULONG ulSize,
-             ULONG *pulStatus) = 0;
-        
-        virtual HRESULT __stdcall Cancel( 
-             RPCOLEMESSAGE *pMsg) = 0;
-        
-        virtual HRESULT __stdcall GetCallContext( 
-             RPCOLEMESSAGE *pMsg,
-             const IID & riid,
-             void **pInterface) = 0;
-        
-        virtual HRESULT __stdcall GetDestCtxEx( 
-             RPCOLEMESSAGE *pMsg,
-             DWORD *pdwDestContext,
-             void **ppvDestContext) = 0;
-        
-        virtual HRESULT __stdcall GetState( 
-             RPCOLEMESSAGE *pMsg,
-             DWORD *pState) = 0;
-        
-        virtual HRESULT __stdcall RegisterAsync( 
-             RPCOLEMESSAGE *pMsg,
-             IAsyncManager *pAsyncMgr) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcChannelBuffer3_Send_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     ULONG *pulStatus);
-
-
-void __stdcall IRpcChannelBuffer3_Send_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_Receive_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     ULONG ulSize,
-     ULONG *pulStatus);
-
-
-void __stdcall IRpcChannelBuffer3_Receive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_Cancel_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg);
-
-
-void __stdcall IRpcChannelBuffer3_Cancel_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_GetCallContext_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     const IID & riid,
-     void **pInterface);
-
-
-void __stdcall IRpcChannelBuffer3_GetCallContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_GetDestCtxEx_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     DWORD *pdwDestContext,
-     void **ppvDestContext);
-
-
-void __stdcall IRpcChannelBuffer3_GetDestCtxEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_GetState_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     DWORD *pState);
-
-
-void __stdcall IRpcChannelBuffer3_GetState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_RegisterAsync_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     IAsyncManager *pAsyncMgr);
-
-
-void __stdcall IRpcChannelBuffer3_RegisterAsync_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcSyntaxNegotiate;
-
-
-    
-    struct __declspec(uuid("58a08519-24c8-4935-b482-3fd823333a4f")) __declspec(novtable)
-    IRpcSyntaxNegotiate : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall NegotiateSyntax( 
-             RPCOLEMESSAGE *pMsg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcSyntaxNegotiate_NegotiateSyntax_Proxy( 
-    IRpcSyntaxNegotiate * This,
-     RPCOLEMESSAGE *pMsg);
-
-
-void __stdcall IRpcSyntaxNegotiate_NegotiateSyntax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcProxyBuffer;
-
-
-    
-    struct __declspec(uuid("D5F56A34-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
-    IRpcProxyBuffer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Connect( 
-             IRpcChannelBuffer *pRpcChannelBuffer) = 0;
-        
-        virtual void __stdcall Disconnect( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcProxyBuffer_Connect_Proxy( 
-    IRpcProxyBuffer * This,
-     IRpcChannelBuffer *pRpcChannelBuffer);
-
-
-void __stdcall IRpcProxyBuffer_Connect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IRpcProxyBuffer_Disconnect_Proxy( 
-    IRpcProxyBuffer * This);
-
-
-void __stdcall IRpcProxyBuffer_Disconnect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcStubBuffer;
-
-
-    
-    struct __declspec(uuid("D5F56AFC-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
-    IRpcStubBuffer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Connect( 
-             IUnknown *pUnkServer) = 0;
-        
-        virtual void __stdcall Disconnect( void) = 0;
-        
-        virtual HRESULT __stdcall Invoke( 
-             RPCOLEMESSAGE *_prpcmsg,
-             IRpcChannelBuffer *_pRpcChannelBuffer) = 0;
-        
-        virtual IRpcStubBuffer *__stdcall IsIIDSupported( 
-             const IID & riid) = 0;
-        
-        virtual ULONG __stdcall CountRefs( void) = 0;
-        
-        virtual HRESULT __stdcall DebugServerQueryInterface( 
-            void **ppv) = 0;
-        
-        virtual void __stdcall DebugServerRelease( 
-            void *pv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcStubBuffer_Connect_Proxy( 
-    IRpcStubBuffer * This,
-     IUnknown *pUnkServer);
-
-
-void __stdcall IRpcStubBuffer_Connect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IRpcStubBuffer_Disconnect_Proxy( 
-    IRpcStubBuffer * This);
-
-
-void __stdcall IRpcStubBuffer_Disconnect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcStubBuffer_Invoke_Proxy( 
-    IRpcStubBuffer * This,
-     RPCOLEMESSAGE *_prpcmsg,
-     IRpcChannelBuffer *_pRpcChannelBuffer);
-
-
-void __stdcall IRpcStubBuffer_Invoke_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-IRpcStubBuffer *__stdcall IRpcStubBuffer_IsIIDSupported_Proxy( 
-    IRpcStubBuffer * This,
-     const IID & riid);
-
-
-void __stdcall IRpcStubBuffer_IsIIDSupported_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-ULONG __stdcall IRpcStubBuffer_CountRefs_Proxy( 
-    IRpcStubBuffer * This);
-
-
-void __stdcall IRpcStubBuffer_CountRefs_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcStubBuffer_DebugServerQueryInterface_Proxy( 
-    IRpcStubBuffer * This,
-    void **ppv);
-
-
-void __stdcall IRpcStubBuffer_DebugServerQueryInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IRpcStubBuffer_DebugServerRelease_Proxy( 
-    IRpcStubBuffer * This,
-    void *pv);
-
-
-void __stdcall IRpcStubBuffer_DebugServerRelease_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPSFactoryBuffer;
-
-
-    
-    struct __declspec(uuid("D5F569D0-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
-    IPSFactoryBuffer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateProxy( 
-             IUnknown *pUnkOuter,
-             const IID & riid,
-             IRpcProxyBuffer **ppProxy,
-             void **ppv) = 0;
-        
-        virtual HRESULT __stdcall CreateStub( 
-             const IID & riid,
-             IUnknown *pUnkServer,
-             IRpcStubBuffer **ppStub) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPSFactoryBuffer_CreateProxy_Proxy( 
-    IPSFactoryBuffer * This,
-     IUnknown *pUnkOuter,
-     const IID & riid,
-     IRpcProxyBuffer **ppProxy,
-     void **ppv);
-
-
-void __stdcall IPSFactoryBuffer_CreateProxy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPSFactoryBuffer_CreateStub_Proxy( 
-    IPSFactoryBuffer * This,
-     const IID & riid,
-     IUnknown *pUnkServer,
-     IRpcStubBuffer **ppStub);
-
-
-void __stdcall IPSFactoryBuffer_CreateStub_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-typedef struct SChannelHookCallInfo
-    {
-    IID iid;
-    DWORD cbSize;
-    GUID uCausality;
-    DWORD dwServerPid;
-    DWORD iMethod;
-    void *pObject;
-    } 	SChannelHookCallInfo;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0050_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0050_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IChannelHook;
-
-
-    
-    struct __declspec(uuid("1008c4a0-7613-11cf-9af1-0020af6e72f4")) __declspec(novtable)
-    IChannelHook : public IUnknown
-    {
-    public:
-        virtual void __stdcall ClientGetSize( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG *pDataSize) = 0;
-        
-        virtual void __stdcall ClientFillBuffer( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG *pDataSize,
-             void *pDataBuffer) = 0;
-        
-        virtual void __stdcall ClientNotify( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG cbDataSize,
-             void *pDataBuffer,
-             DWORD lDataRep,
-             HRESULT hrFault) = 0;
-        
-        virtual void __stdcall ServerNotify( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG cbDataSize,
-             void *pDataBuffer,
-             DWORD lDataRep) = 0;
-        
-        virtual void __stdcall ServerGetSize( 
-             const GUID & uExtent,
-             const IID & riid,
-             HRESULT hrFault,
-             ULONG *pDataSize) = 0;
-        
-        virtual void __stdcall ServerFillBuffer( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG *pDataSize,
-             void *pDataBuffer,
-             HRESULT hrFault) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void __stdcall IChannelHook_ClientGetSize_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG *pDataSize);
-
-
-void __stdcall IChannelHook_ClientGetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ClientFillBuffer_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG *pDataSize,
-     void *pDataBuffer);
-
-
-void __stdcall IChannelHook_ClientFillBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ClientNotify_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG cbDataSize,
-     void *pDataBuffer,
-     DWORD lDataRep,
-     HRESULT hrFault);
-
-
-void __stdcall IChannelHook_ClientNotify_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ServerNotify_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG cbDataSize,
-     void *pDataBuffer,
-     DWORD lDataRep);
-
-
-void __stdcall IChannelHook_ServerNotify_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ServerGetSize_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     HRESULT hrFault,
-     ULONG *pDataSize);
-
-
-void __stdcall IChannelHook_ServerGetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ServerFillBuffer_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG *pDataSize,
-     void *pDataBuffer,
-     HRESULT hrFault);
-
-
-void __stdcall IChannelHook_ServerFillBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-extern const FMTID FMTID_SummaryInformation;
-
-extern const FMTID FMTID_DocSummaryInformation;
-
-extern const FMTID FMTID_UserDefinedProperties;
-
-extern const FMTID FMTID_DiscardableInformation;
-
-extern const FMTID FMTID_ImageSummaryInformation;
-
-extern const FMTID FMTID_AudioSummaryInformation;
-
-extern const FMTID FMTID_VideoSummaryInformation;
-
-extern const FMTID FMTID_MediaFileSummaryInformation;
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0051_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0051_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef struct tagSOLE_AUTHENTICATION_SERVICE
-    {
-    DWORD dwAuthnSvc;
-    DWORD dwAuthzSvc;
-    OLECHAR *pPrincipalName;
-    HRESULT hr;
-    } 	SOLE_AUTHENTICATION_SERVICE;
-
-typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
-
-typedef 
-enum tagEOLE_AUTHENTICATION_CAPABILITIES
-    {	EOAC_NONE	= 0,
-	EOAC_MUTUAL_AUTH	= 0x1,
-	EOAC_STATIC_CLOAKING	= 0x20,
-	EOAC_DYNAMIC_CLOAKING	= 0x40,
-	EOAC_ANY_AUTHORITY	= 0x80,
-	EOAC_MAKE_FULLSIC	= 0x100,
-	EOAC_DEFAULT	= 0x800,
-	EOAC_SECURE_REFS	= 0x2,
-	EOAC_ACCESS_CONTROL	= 0x4,
-	EOAC_APPID	= 0x8,
-	EOAC_DYNAMIC	= 0x10,
-	EOAC_REQUIRE_FULLSIC	= 0x200,
-	EOAC_AUTO_IMPERSONATE	= 0x400,
-	EOAC_NO_CUSTOM_MARSHAL	= 0x2000,
-	EOAC_DISABLE_AAA	= 0x1000
-    } 	EOLE_AUTHENTICATION_CAPABILITIES;
-
-
-
-
-
-typedef struct tagSOLE_AUTHENTICATION_INFO
-    {
-    DWORD dwAuthnSvc;
-    DWORD dwAuthzSvc;
-    void *pAuthInfo;
-    } 	SOLE_AUTHENTICATION_INFO;
-
-typedef struct tagSOLE_AUTHENTICATION_INFO *PSOLE_AUTHENTICATION_INFO;
-
-typedef struct tagSOLE_AUTHENTICATION_LIST
-    {
-    DWORD cAuthInfo;
-    SOLE_AUTHENTICATION_INFO *aAuthInfo;
-    } 	SOLE_AUTHENTICATION_LIST;
-
-typedef struct tagSOLE_AUTHENTICATION_LIST *PSOLE_AUTHENTICATION_LIST;
-
-
-extern "C" const IID IID_IClientSecurity;
-
-
-    
-    struct __declspec(uuid("0000013D-0000-0000-C000-000000000046")) __declspec(novtable)
-    IClientSecurity : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryBlanket( 
-             IUnknown *pProxy,
-             DWORD *pAuthnSvc,
-             DWORD *pAuthzSvc,
-             OLECHAR **pServerPrincName,
-             DWORD *pAuthnLevel,
-             DWORD *pImpLevel,
-             void **pAuthInfo,
-             DWORD *pCapabilites) = 0;
-        
-        virtual HRESULT __stdcall SetBlanket( 
-             IUnknown *pProxy,
-             DWORD dwAuthnSvc,
-             DWORD dwAuthzSvc,
-             OLECHAR *pServerPrincName,
-             DWORD dwAuthnLevel,
-             DWORD dwImpLevel,
-             void *pAuthInfo,
-             DWORD dwCapabilities) = 0;
-        
-        virtual HRESULT __stdcall CopyProxy( 
-             IUnknown *pProxy,
-             IUnknown **ppCopy) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IClientSecurity_QueryBlanket_Proxy( 
-    IClientSecurity * This,
-     IUnknown *pProxy,
-     DWORD *pAuthnSvc,
-     DWORD *pAuthzSvc,
-     OLECHAR **pServerPrincName,
-     DWORD *pAuthnLevel,
-     DWORD *pImpLevel,
-     void **pAuthInfo,
-     DWORD *pCapabilites);
-
-
-void __stdcall IClientSecurity_QueryBlanket_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IClientSecurity_SetBlanket_Proxy( 
-    IClientSecurity * This,
-     IUnknown *pProxy,
-     DWORD dwAuthnSvc,
-     DWORD dwAuthzSvc,
-     OLECHAR *pServerPrincName,
-     DWORD dwAuthnLevel,
-     DWORD dwImpLevel,
-     void *pAuthInfo,
-     DWORD dwCapabilities);
-
-
-void __stdcall IClientSecurity_SetBlanket_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IClientSecurity_CopyProxy_Proxy( 
-    IClientSecurity * This,
-     IUnknown *pProxy,
-     IUnknown **ppCopy);
-
-
-void __stdcall IClientSecurity_CopyProxy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IServerSecurity;
-
-
-    
-    struct __declspec(uuid("0000013E-0000-0000-C000-000000000046")) __declspec(novtable)
-    IServerSecurity : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryBlanket( 
-             DWORD *pAuthnSvc,
-             DWORD *pAuthzSvc,
-             OLECHAR **pServerPrincName,
-             DWORD *pAuthnLevel,
-             DWORD *pImpLevel,
-             void **pPrivs,
-             DWORD *pCapabilities) = 0;
-        
-        virtual HRESULT __stdcall ImpersonateClient( void) = 0;
-        
-        virtual HRESULT __stdcall RevertToSelf( void) = 0;
-        
-        virtual BOOL __stdcall IsImpersonating( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IServerSecurity_QueryBlanket_Proxy( 
-    IServerSecurity * This,
-     DWORD *pAuthnSvc,
-     DWORD *pAuthzSvc,
-     OLECHAR **pServerPrincName,
-     DWORD *pAuthnLevel,
-     DWORD *pImpLevel,
-     void **pPrivs,
-     DWORD *pCapabilities);
-
-
-void __stdcall IServerSecurity_QueryBlanket_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IServerSecurity_ImpersonateClient_Proxy( 
-    IServerSecurity * This);
-
-
-void __stdcall IServerSecurity_ImpersonateClient_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IServerSecurity_RevertToSelf_Proxy( 
-    IServerSecurity * This);
-
-
-void __stdcall IServerSecurity_RevertToSelf_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-BOOL __stdcall IServerSecurity_IsImpersonating_Proxy( 
-    IServerSecurity * This);
-
-
-void __stdcall IServerSecurity_IsImpersonating_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IClassActivator;
-
-
-    
-    struct __declspec(uuid("00000140-0000-0000-C000-000000000046")) __declspec(novtable)
-    IClassActivator : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassObject( 
-             const IID & rclsid,
-             DWORD dwClassContext,
-             LCID locale,
-             const IID & riid,
-             void **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IClassActivator_GetClassObject_Proxy( 
-    IClassActivator * This,
-     const IID & rclsid,
-     DWORD dwClassContext,
-     LCID locale,
-     const IID & riid,
-     void **ppv);
-
-
-void __stdcall IClassActivator_GetClassObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcOptions;
-
-
-    
-    struct __declspec(uuid("00000144-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRpcOptions : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Set( 
-             IUnknown *pPrx,
-             DWORD dwProperty,
-             ULONG_PTR dwValue) = 0;
-        
-        virtual HRESULT __stdcall Query( 
-             IUnknown *pPrx,
-             DWORD dwProperty,
-             ULONG_PTR *pdwValue) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcOptions_Set_Proxy( 
-    IRpcOptions * This,
-     IUnknown *pPrx,
-     DWORD dwProperty,
-     ULONG_PTR dwValue);
-
-
-void __stdcall IRpcOptions_Set_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcOptions_Query_Proxy( 
-    IRpcOptions * This,
-     IUnknown *pPrx,
-     DWORD dwProperty,
-     ULONG_PTR *pdwValue);
-
-
-void __stdcall IRpcOptions_Query_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-enum __MIDL___MIDL_itf_objidl_0055_0001
-    {	COMBND_RPCTIMEOUT	= 0x1,
-	COMBND_SERVER_LOCALITY	= 0x2
-    } ;
-
-enum __MIDL___MIDL_itf_objidl_0055_0002
-    {	SERVER_LOCALITY_PROCESS_LOCAL	= 0,
-	SERVER_LOCALITY_MACHINE_LOCAL	= 1,
-	SERVER_LOCALITY_REMOTE	= 2
-    } ;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0055_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0055_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IFillLockBytes;
-
-
-    
-    struct __declspec(uuid("99caf010-415e-11cf-8814-00aa00b569f5")) __declspec(novtable)
-    IFillLockBytes : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall FillAppend( 
-             const void *pv,
-             ULONG cb,
-             ULONG *pcbWritten) = 0;
-        
-        virtual  HRESULT __stdcall FillAt( 
-             ULARGE_INTEGER ulOffset,
-             const void *pv,
-             ULONG cb,
-             ULONG *pcbWritten) = 0;
-        
-        virtual HRESULT __stdcall SetFillSize( 
-             ULARGE_INTEGER ulSize) = 0;
-        
-        virtual HRESULT __stdcall Terminate( 
-             BOOL bCanceled) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IFillLockBytes_RemoteFillAppend_Proxy( 
-    IFillLockBytes * This,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
-void __stdcall IFillLockBytes_RemoteFillAppend_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IFillLockBytes_RemoteFillAt_Proxy( 
-    IFillLockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
-void __stdcall IFillLockBytes_RemoteFillAt_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFillLockBytes_SetFillSize_Proxy( 
-    IFillLockBytes * This,
-     ULARGE_INTEGER ulSize);
-
-
-void __stdcall IFillLockBytes_SetFillSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFillLockBytes_Terminate_Proxy( 
-    IFillLockBytes * This,
-     BOOL bCanceled);
-
-
-void __stdcall IFillLockBytes_Terminate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IProgressNotify;
-
-
-    
-    struct __declspec(uuid("a9d758a0-4617-11cf-95fc-00aa00680db4")) __declspec(novtable)
-    IProgressNotify : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnProgress( 
-             DWORD dwProgressCurrent,
-             DWORD dwProgressMaximum,
-             BOOL fAccurate,
-             BOOL fOwner) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProgressNotify_OnProgress_Proxy( 
-    IProgressNotify * This,
-     DWORD dwProgressCurrent,
-     DWORD dwProgressMaximum,
-     BOOL fAccurate,
-     BOOL fOwner);
-
-
-void __stdcall IProgressNotify_OnProgress_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef struct tagStorageLayout
-    {
-    DWORD LayoutType;
-    OLECHAR *pwcsElementName;
-    LARGE_INTEGER cOffset;
-    LARGE_INTEGER cBytes;
-    } 	StorageLayout;
-
-
-extern "C" const IID IID_ILayoutStorage;
-
-
-    
-    struct __declspec(uuid("0e6d4d90-6738-11cf-9608-00aa00680db4")) __declspec(novtable)
-    ILayoutStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall LayoutScript( 
-             StorageLayout *pStorageLayout,
-             DWORD nEntries,
-             DWORD glfInterleavedFlag) = 0;
-        
-        virtual HRESULT __stdcall BeginMonitor( void) = 0;
-        
-        virtual HRESULT __stdcall EndMonitor( void) = 0;
-        
-        virtual HRESULT __stdcall ReLayoutDocfile( 
-             OLECHAR *pwcsNewDfName) = 0;
-        
-        virtual HRESULT __stdcall ReLayoutDocfileOnILockBytes( 
-             ILockBytes *pILockBytes) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ILayoutStorage_LayoutScript_Proxy( 
-    ILayoutStorage * This,
-     StorageLayout *pStorageLayout,
-     DWORD nEntries,
-     DWORD glfInterleavedFlag);
-
-
-void __stdcall ILayoutStorage_LayoutScript_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILayoutStorage_BeginMonitor_Proxy( 
-    ILayoutStorage * This);
-
-
-void __stdcall ILayoutStorage_BeginMonitor_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILayoutStorage_EndMonitor_Proxy( 
-    ILayoutStorage * This);
-
-
-void __stdcall ILayoutStorage_EndMonitor_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILayoutStorage_ReLayoutDocfile_Proxy( 
-    ILayoutStorage * This,
-     OLECHAR *pwcsNewDfName);
-
-
-void __stdcall ILayoutStorage_ReLayoutDocfile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILayoutStorage_ReLayoutDocfileOnILockBytes_Proxy( 
-    ILayoutStorage * This,
-     ILockBytes *pILockBytes);
-
-
-void __stdcall ILayoutStorage_ReLayoutDocfileOnILockBytes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IBlockingLock;
-
-
-    
-    struct __declspec(uuid("30f3d47a-6447-11d1-8e3c-00c04fb9386d")) __declspec(novtable)
-    IBlockingLock : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Lock( 
-             DWORD dwTimeout) = 0;
-        
-        virtual HRESULT __stdcall Unlock( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBlockingLock_Lock_Proxy( 
-    IBlockingLock * This,
-     DWORD dwTimeout);
-
-
-void __stdcall IBlockingLock_Lock_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBlockingLock_Unlock_Proxy( 
-    IBlockingLock * This);
-
-
-void __stdcall IBlockingLock_Unlock_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ITimeAndNoticeControl;
-
-
-    
-    struct __declspec(uuid("bc0bf6ae-8878-11d1-83e9-00c04fc2c6d4")) __declspec(novtable)
-    ITimeAndNoticeControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SuppressChanges( 
-             DWORD res1,
-             DWORD res2) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITimeAndNoticeControl_SuppressChanges_Proxy( 
-    ITimeAndNoticeControl * This,
-     DWORD res1,
-     DWORD res2);
-
-
-void __stdcall ITimeAndNoticeControl_SuppressChanges_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IOplockStorage;
-
-
-    
-    struct __declspec(uuid("8d19c834-8879-11d1-83e9-00c04fc2c6d4")) __declspec(novtable)
-    IOplockStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateStorageEx( 
-             LPCWSTR pwcsName,
-             DWORD grfMode,
-             DWORD stgfmt,
-             DWORD grfAttrs,
-             const IID & riid,
-             void **ppstgOpen) = 0;
-        
-        virtual HRESULT __stdcall OpenStorageEx( 
-             LPCWSTR pwcsName,
-             DWORD grfMode,
-             DWORD stgfmt,
-             DWORD grfAttrs,
-             const IID & riid,
-             void **ppstgOpen) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOplockStorage_CreateStorageEx_Proxy( 
-    IOplockStorage * This,
-     LPCWSTR pwcsName,
-     DWORD grfMode,
-     DWORD stgfmt,
-     DWORD grfAttrs,
-     const IID & riid,
-     void **ppstgOpen);
-
-
-void __stdcall IOplockStorage_CreateStorageEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOplockStorage_OpenStorageEx_Proxy( 
-    IOplockStorage * This,
-     LPCWSTR pwcsName,
-     DWORD grfMode,
-     DWORD stgfmt,
-     DWORD grfAttrs,
-     const IID & riid,
-     void **ppstgOpen);
-
-
-void __stdcall IOplockStorage_OpenStorageEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ISurrogate *LPSURROGATE;
-
-
-extern "C" const IID IID_ISurrogate;
-
-
-    
-    struct __declspec(uuid("00000022-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISurrogate : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall LoadDllServer( 
-             const IID & Clsid) = 0;
-        
-        virtual HRESULT __stdcall FreeSurrogate( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISurrogate_LoadDllServer_Proxy( 
-    ISurrogate * This,
-     const IID & Clsid);
-
-
-void __stdcall ISurrogate_LoadDllServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogate_FreeSurrogate_Proxy( 
-    ISurrogate * This);
-
-
-void __stdcall ISurrogate_FreeSurrogate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;
-
-
-extern "C" const IID IID_IGlobalInterfaceTable;
-
-
-    
-    struct __declspec(uuid("00000146-0000-0000-C000-000000000046")) __declspec(novtable)
-    IGlobalInterfaceTable : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RegisterInterfaceInGlobal( 
-             IUnknown *pUnk,
-             const IID & riid,
-             DWORD *pdwCookie) = 0;
-        
-        virtual HRESULT __stdcall RevokeInterfaceFromGlobal( 
-             DWORD dwCookie) = 0;
-        
-        virtual HRESULT __stdcall GetInterfaceFromGlobal( 
-             DWORD dwCookie,
-             const IID & riid,
-             void **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IGlobalInterfaceTable_RegisterInterfaceInGlobal_Proxy( 
-    IGlobalInterfaceTable * This,
-     IUnknown *pUnk,
-     const IID & riid,
-     DWORD *pdwCookie);
-
-
-void __stdcall IGlobalInterfaceTable_RegisterInterfaceInGlobal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IGlobalInterfaceTable_RevokeInterfaceFromGlobal_Proxy( 
-    IGlobalInterfaceTable * This,
-     DWORD dwCookie);
-
-
-void __stdcall IGlobalInterfaceTable_RevokeInterfaceFromGlobal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IGlobalInterfaceTable_GetInterfaceFromGlobal_Proxy( 
-    IGlobalInterfaceTable * This,
-     DWORD dwCookie,
-     const IID & riid,
-     void **ppv);
-
-
-void __stdcall IGlobalInterfaceTable_GetInterfaceFromGlobal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IDirectWriterLock;
-
-
-    
-    struct __declspec(uuid("0e6d4d92-6738-11cf-9608-00aa00680db4")) __declspec(novtable)
-    IDirectWriterLock : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall WaitForWriteAccess( 
-             DWORD dwTimeout) = 0;
-        
-        virtual HRESULT __stdcall ReleaseWriteAccess( void) = 0;
-        
-        virtual HRESULT __stdcall HaveWriteAccess( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDirectWriterLock_WaitForWriteAccess_Proxy( 
-    IDirectWriterLock * This,
-     DWORD dwTimeout);
-
-
-void __stdcall IDirectWriterLock_WaitForWriteAccess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDirectWriterLock_ReleaseWriteAccess_Proxy( 
-    IDirectWriterLock * This);
-
-
-void __stdcall IDirectWriterLock_ReleaseWriteAccess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDirectWriterLock_HaveWriteAccess_Proxy( 
-    IDirectWriterLock * This);
-
-
-void __stdcall IDirectWriterLock_HaveWriteAccess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronize;
-
-
-    
-    struct __declspec(uuid("00000030-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronize : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Wait( 
-             DWORD dwFlags,
-             DWORD dwMilliseconds) = 0;
-        
-        virtual HRESULT __stdcall Signal( void) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronize_Wait_Proxy( 
-    ISynchronize * This,
-     DWORD dwFlags,
-     DWORD dwMilliseconds);
-
-
-void __stdcall ISynchronize_Wait_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISynchronize_Signal_Proxy( 
-    ISynchronize * This);
-
-
-void __stdcall ISynchronize_Signal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISynchronize_Reset_Proxy( 
-    ISynchronize * This);
-
-
-void __stdcall ISynchronize_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronizeHandle;
-
-
-    
-    struct __declspec(uuid("00000031-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronizeHandle : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetHandle( 
-             HANDLE *ph) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronizeHandle_GetHandle_Proxy( 
-    ISynchronizeHandle * This,
-     HANDLE *ph);
-
-
-void __stdcall ISynchronizeHandle_GetHandle_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronizeEvent;
-
-
-    
-    struct __declspec(uuid("00000032-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronizeEvent : public ISynchronizeHandle
-    {
-    public:
-        virtual HRESULT __stdcall SetEventHandle( 
-             HANDLE *ph) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronizeEvent_SetEventHandle_Proxy( 
-    ISynchronizeEvent * This,
-     HANDLE *ph);
-
-
-void __stdcall ISynchronizeEvent_SetEventHandle_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronizeContainer;
-
-
-    
-    struct __declspec(uuid("00000033-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronizeContainer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AddSynchronize( 
-             ISynchronize *pSync) = 0;
-        
-        virtual HRESULT __stdcall WaitMultiple( 
-             DWORD dwFlags,
-             DWORD dwTimeOut,
-             ISynchronize **ppSync) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronizeContainer_AddSynchronize_Proxy( 
-    ISynchronizeContainer * This,
-     ISynchronize *pSync);
-
-
-void __stdcall ISynchronizeContainer_AddSynchronize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISynchronizeContainer_WaitMultiple_Proxy( 
-    ISynchronizeContainer * This,
-     DWORD dwFlags,
-     DWORD dwTimeOut,
-     ISynchronize **ppSync);
-
-
-void __stdcall ISynchronizeContainer_WaitMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronizeMutex;
-
-
-    
-    struct __declspec(uuid("00000025-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronizeMutex : public ISynchronize
-    {
-    public:
-        virtual HRESULT __stdcall ReleaseMutex( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronizeMutex_ReleaseMutex_Proxy( 
-    ISynchronizeMutex * This);
-
-
-void __stdcall ISynchronizeMutex_ReleaseMutex_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICancelMethodCalls *LPCANCELMETHODCALLS;
-
-
-extern "C" const IID IID_ICancelMethodCalls;
-
-
-    
-    struct __declspec(uuid("00000029-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICancelMethodCalls : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Cancel( 
-             ULONG ulSeconds) = 0;
-        
-        virtual HRESULT __stdcall TestCancel( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICancelMethodCalls_Cancel_Proxy( 
-    ICancelMethodCalls * This,
-     ULONG ulSeconds);
-
-
-void __stdcall ICancelMethodCalls_Cancel_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICancelMethodCalls_TestCancel_Proxy( 
-    ICancelMethodCalls * This);
-
-
-void __stdcall ICancelMethodCalls_TestCancel_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef 
-enum tagDCOM_CALL_STATE
-    {	DCOM_NONE	= 0,
-	DCOM_CALL_COMPLETE	= 0x1,
-	DCOM_CALL_CANCELED	= 0x2
-    } 	DCOM_CALL_STATE;
-
-
-extern "C" const IID IID_IAsyncManager;
-
-
-    
-    struct __declspec(uuid("0000002A-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAsyncManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CompleteCall( 
-             HRESULT Result) = 0;
-        
-        virtual HRESULT __stdcall GetCallContext( 
-             const IID & riid,
-             void **pInterface) = 0;
-        
-        virtual HRESULT __stdcall GetState( 
-             ULONG *pulStateFlags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAsyncManager_CompleteCall_Proxy( 
-    IAsyncManager * This,
-     HRESULT Result);
-
-
-void __stdcall IAsyncManager_CompleteCall_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAsyncManager_GetCallContext_Proxy( 
-    IAsyncManager * This,
-     const IID & riid,
-     void **pInterface);
-
-
-void __stdcall IAsyncManager_GetCallContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAsyncManager_GetState_Proxy( 
-    IAsyncManager * This,
-     ULONG *pulStateFlags);
-
-
-void __stdcall IAsyncManager_GetState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ICallFactory;
-
-
-    
-    struct __declspec(uuid("1c733a30-2a1c-11ce-ade5-00aa0044773d")) __declspec(novtable)
-    ICallFactory : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateCall( 
-             const IID & riid,
-             IUnknown *pCtrlUnk,
-             const IID & riid2,
-             IUnknown **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICallFactory_CreateCall_Proxy( 
-    ICallFactory * This,
-     const IID & riid,
-     IUnknown *pCtrlUnk,
-     const IID & riid2,
-     IUnknown **ppv);
-
-
-void __stdcall ICallFactory_CreateCall_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcHelper;
-
-
-    
-    struct __declspec(uuid("00000149-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRpcHelper : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetDCOMProtocolVersion( 
-             DWORD *pComVersion) = 0;
-        
-        virtual HRESULT __stdcall GetIIDFromOBJREF( 
-             void *pObjRef,
-             IID **piid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcHelper_GetDCOMProtocolVersion_Proxy( 
-    IRpcHelper * This,
-     DWORD *pComVersion);
-
-
-void __stdcall IRpcHelper_GetDCOMProtocolVersion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcHelper_GetIIDFromOBJREF_Proxy( 
-    IRpcHelper * This,
-     void *pObjRef,
-     IID **piid);
-
-
-void __stdcall IRpcHelper_GetIIDFromOBJREF_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IReleaseMarshalBuffers;
-
-
-    
-    struct __declspec(uuid("eb0cb9e8-7996-11d2-872e-0000f8080859")) __declspec(novtable)
-    IReleaseMarshalBuffers : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ReleaseMarshalBuffer( 
-             RPCOLEMESSAGE *pMsg,
-             DWORD dwFlags,
-             IUnknown *pChnl) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IReleaseMarshalBuffers_ReleaseMarshalBuffer_Proxy( 
-    IReleaseMarshalBuffers * This,
-     RPCOLEMESSAGE *pMsg,
-     DWORD dwFlags,
-     IUnknown *pChnl);
-
-
-void __stdcall IReleaseMarshalBuffers_ReleaseMarshalBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IWaitMultiple;
-
-
-    
-    struct __declspec(uuid("0000002B-0000-0000-C000-000000000046")) __declspec(novtable)
-    IWaitMultiple : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall WaitMultiple( 
-             DWORD timeout,
-             ISynchronize **pSync) = 0;
-        
-        virtual HRESULT __stdcall AddSynchronize( 
-             ISynchronize *pSync) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWaitMultiple_WaitMultiple_Proxy( 
-    IWaitMultiple * This,
-     DWORD timeout,
-     ISynchronize **pSync);
-
-
-void __stdcall IWaitMultiple_WaitMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IWaitMultiple_AddSynchronize_Proxy( 
-    IWaitMultiple * This,
-     ISynchronize *pSync);
-
-
-void __stdcall IWaitMultiple_AddSynchronize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IUrlMon;
-
-
-    
-    struct __declspec(uuid("00000026-0000-0000-C000-000000000046")) __declspec(novtable)
-    IUrlMon : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AsyncGetClassBits( 
-             const IID & rclsid,
-             LPCWSTR pszTYPE,
-             LPCWSTR pszExt,
-             DWORD dwFileVersionMS,
-             DWORD dwFileVersionLS,
-             LPCWSTR pszCodeBase,
-             IBindCtx *pbc,
-             DWORD dwClassContext,
-             const IID & riid,
-             DWORD flags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IUrlMon_AsyncGetClassBits_Proxy( 
-    IUrlMon * This,
-     const IID & rclsid,
-     LPCWSTR pszTYPE,
-     LPCWSTR pszExt,
-     DWORD dwFileVersionMS,
-     DWORD dwFileVersionLS,
-     LPCWSTR pszCodeBase,
-     IBindCtx *pbc,
-     DWORD dwClassContext,
-     const IID & riid,
-     DWORD flags);
-
-
-void __stdcall IUrlMon_AsyncGetClassBits_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IForegroundTransfer;
-
-
-    
-    struct __declspec(uuid("00000145-0000-0000-C000-000000000046")) __declspec(novtable)
-    IForegroundTransfer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AllowForegroundTransfer( 
-             void *lpvReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IForegroundTransfer_AllowForegroundTransfer_Proxy( 
-    IForegroundTransfer * This,
-     void *lpvReserved);
-
-
-void __stdcall IForegroundTransfer_AllowForegroundTransfer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IAddrTrackingControl *LPADDRTRACKINGCONTROL;
-
-
-extern "C" const IID IID_IAddrTrackingControl;
-
-
-    
-    struct __declspec(uuid("00000147-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAddrTrackingControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall EnableCOMDynamicAddrTracking( void) = 0;
-        
-        virtual HRESULT __stdcall DisableCOMDynamicAddrTracking( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAddrTrackingControl_EnableCOMDynamicAddrTracking_Proxy( 
-    IAddrTrackingControl * This);
-
-
-void __stdcall IAddrTrackingControl_EnableCOMDynamicAddrTracking_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAddrTrackingControl_DisableCOMDynamicAddrTracking_Proxy( 
-    IAddrTrackingControl * This);
-
-
-void __stdcall IAddrTrackingControl_DisableCOMDynamicAddrTracking_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IAddrExclusionControl *LPADDREXCLUSIONCONTROL;
-
-
-extern "C" const IID IID_IAddrExclusionControl;
-
-
-    
-    struct __declspec(uuid("00000148-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAddrExclusionControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetCurrentAddrExclusionList( 
-             const IID & riid,
-             void **ppEnumerator) = 0;
-        
-        virtual HRESULT __stdcall UpdateAddrExclusionList( 
-             IUnknown *pEnumerator) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAddrExclusionControl_GetCurrentAddrExclusionList_Proxy( 
-    IAddrExclusionControl * This,
-     const IID & riid,
-     void **ppEnumerator);
-
-
-void __stdcall IAddrExclusionControl_GetCurrentAddrExclusionList_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAddrExclusionControl_UpdateAddrExclusionList_Proxy( 
-    IAddrExclusionControl * This,
-     IUnknown *pEnumerator);
-
-
-void __stdcall IAddrExclusionControl_UpdateAddrExclusionList_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPipeByte;
-
-
-    
-    struct __declspec(uuid("DB2F3ACA-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    IPipeByte : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Pull( 
-             BYTE *buf,
-             ULONG cRequest,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Push( 
-             BYTE *buf,
-             ULONG cSent) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPipeByte_Pull_Proxy( 
-    IPipeByte * This,
-     BYTE *buf,
-     ULONG cRequest,
-     ULONG *pcReturned);
-
-
-void __stdcall IPipeByte_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPipeByte_Push_Proxy( 
-    IPipeByte * This,
-     BYTE *buf,
-     ULONG cSent);
-
-
-void __stdcall IPipeByte_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIPipeByte;
-
-
-    
-    struct __declspec(uuid("DB2F3ACB-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    AsyncIPipeByte : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_Pull( 
-             ULONG cRequest) = 0;
-        
-        virtual HRESULT __stdcall Finish_Pull( 
-             BYTE *buf,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Begin_Push( 
-             BYTE *buf,
-             ULONG cSent) = 0;
-        
-        virtual HRESULT __stdcall Finish_Push( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIPipeByte_Begin_Pull_Proxy( 
-    AsyncIPipeByte * This,
-     ULONG cRequest);
-
-
-void __stdcall AsyncIPipeByte_Begin_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeByte_Finish_Pull_Proxy( 
-    AsyncIPipeByte * This,
-     BYTE *buf,
-     ULONG *pcReturned);
-
-
-void __stdcall AsyncIPipeByte_Finish_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeByte_Begin_Push_Proxy( 
-    AsyncIPipeByte * This,
-     BYTE *buf,
-     ULONG cSent);
-
-
-void __stdcall AsyncIPipeByte_Begin_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeByte_Finish_Push_Proxy( 
-    AsyncIPipeByte * This);
-
-
-void __stdcall AsyncIPipeByte_Finish_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPipeLong;
-
-
-    
-    struct __declspec(uuid("DB2F3ACC-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    IPipeLong : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Pull( 
-             LONG *buf,
-             ULONG cRequest,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Push( 
-             LONG *buf,
-             ULONG cSent) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPipeLong_Pull_Proxy( 
-    IPipeLong * This,
-     LONG *buf,
-     ULONG cRequest,
-     ULONG *pcReturned);
-
-
-void __stdcall IPipeLong_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPipeLong_Push_Proxy( 
-    IPipeLong * This,
-     LONG *buf,
-     ULONG cSent);
-
-
-void __stdcall IPipeLong_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIPipeLong;
-
-
-    
-    struct __declspec(uuid("DB2F3ACD-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    AsyncIPipeLong : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_Pull( 
-             ULONG cRequest) = 0;
-        
-        virtual HRESULT __stdcall Finish_Pull( 
-             LONG *buf,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Begin_Push( 
-             LONG *buf,
-             ULONG cSent) = 0;
-        
-        virtual HRESULT __stdcall Finish_Push( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIPipeLong_Begin_Pull_Proxy( 
-    AsyncIPipeLong * This,
-     ULONG cRequest);
-
-
-void __stdcall AsyncIPipeLong_Begin_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeLong_Finish_Pull_Proxy( 
-    AsyncIPipeLong * This,
-     LONG *buf,
-     ULONG *pcReturned);
-
-
-void __stdcall AsyncIPipeLong_Finish_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeLong_Begin_Push_Proxy( 
-    AsyncIPipeLong * This,
-     LONG *buf,
-     ULONG cSent);
-
-
-void __stdcall AsyncIPipeLong_Begin_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeLong_Finish_Push_Proxy( 
-    AsyncIPipeLong * This);
-
-
-void __stdcall AsyncIPipeLong_Finish_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPipeDouble;
-
-
-    
-    struct __declspec(uuid("DB2F3ACE-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    IPipeDouble : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Pull( 
-             DOUBLE *buf,
-             ULONG cRequest,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Push( 
-             DOUBLE *buf,
-             ULONG cSent) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPipeDouble_Pull_Proxy( 
-    IPipeDouble * This,
-     DOUBLE *buf,
-     ULONG cRequest,
-     ULONG *pcReturned);
-
-
-void __stdcall IPipeDouble_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPipeDouble_Push_Proxy( 
-    IPipeDouble * This,
-     DOUBLE *buf,
-     ULONG cSent);
-
-
-void __stdcall IPipeDouble_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIPipeDouble;
-
-
-    
-    struct __declspec(uuid("DB2F3ACF-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    AsyncIPipeDouble : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_Pull( 
-             ULONG cRequest) = 0;
-        
-        virtual HRESULT __stdcall Finish_Pull( 
-             DOUBLE *buf,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Begin_Push( 
-             DOUBLE *buf,
-             ULONG cSent) = 0;
-        
-        virtual HRESULT __stdcall Finish_Push( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIPipeDouble_Begin_Pull_Proxy( 
-    AsyncIPipeDouble * This,
-     ULONG cRequest);
-
-
-void __stdcall AsyncIPipeDouble_Begin_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeDouble_Finish_Pull_Proxy( 
-    AsyncIPipeDouble * This,
-     DOUBLE *buf,
-     ULONG *pcReturned);
-
-
-void __stdcall AsyncIPipeDouble_Finish_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeDouble_Begin_Push_Proxy( 
-    AsyncIPipeDouble * This,
-     DOUBLE *buf,
-     ULONG cSent);
-
-
-void __stdcall AsyncIPipeDouble_Begin_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeDouble_Finish_Push_Proxy( 
-    AsyncIPipeDouble * This);
-
-
-void __stdcall AsyncIPipeDouble_Finish_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IThumbnailExtractor;
-
-
-    
-    struct __declspec(uuid("969dc708-5c76-11d1-8d86-0000f804b057")) __declspec(novtable)
-    IThumbnailExtractor : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ExtractThumbnail( 
-             IStorage *pStg,
-             ULONG ulLength,
-             ULONG ulHeight,
-             ULONG *pulOutputLength,
-             ULONG *pulOutputHeight,
-             HBITMAP *phOutputBitmap) = 0;
-        
-        virtual HRESULT __stdcall OnFileUpdated( 
-             IStorage *pStg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IThumbnailExtractor_ExtractThumbnail_Proxy( 
-    IThumbnailExtractor * This,
-     IStorage *pStg,
-     ULONG ulLength,
-     ULONG ulHeight,
-     ULONG *pulOutputLength,
-     ULONG *pulOutputHeight,
-     HBITMAP *phOutputBitmap);
-
-
-void __stdcall IThumbnailExtractor_ExtractThumbnail_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IThumbnailExtractor_OnFileUpdated_Proxy( 
-    IThumbnailExtractor * This,
-     IStorage *pStg);
-
-
-void __stdcall IThumbnailExtractor_OnFileUpdated_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IDummyHICONIncluder;
-
-
-    
-    struct __declspec(uuid("947990de-cc28-11d2-a0f7-00805f858fb1")) __declspec(novtable)
-    IDummyHICONIncluder : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Dummy( 
-             HICON h1,
-             HDC h2) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDummyHICONIncluder_Dummy_Proxy( 
-    IDummyHICONIncluder * This,
-     HICON h1,
-     HDC h2);
-
-
-void __stdcall IDummyHICONIncluder_Dummy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagApplicationType
-    {	ServerApplication	= 0,
-	LibraryApplication	= ServerApplication + 1
-    } 	ApplicationType;
-
-typedef 
-enum tagShutdownType
-    {	IdleShutdown	= 0,
-	ForcedShutdown	= IdleShutdown + 1
-    } 	ShutdownType;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0087_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0087_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IProcessLock;
-
-
-    
-    struct __declspec(uuid("000001d5-0000-0000-C000-000000000046")) __declspec(novtable)
-    IProcessLock : public IUnknown
-    {
-    public:
-        virtual ULONG __stdcall AddRefOnProcess( void) = 0;
-        
-        virtual ULONG __stdcall ReleaseRefOnProcess( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ULONG __stdcall IProcessLock_AddRefOnProcess_Proxy( 
-    IProcessLock * This);
-
-
-void __stdcall IProcessLock_AddRefOnProcess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-ULONG __stdcall IProcessLock_ReleaseRefOnProcess_Proxy( 
-    IProcessLock * This);
-
-
-void __stdcall IProcessLock_ReleaseRefOnProcess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISurrogateService;
-
-
-    
-    struct __declspec(uuid("000001d4-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISurrogateService : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Init( 
-             const GUID & rguidProcessID,
-             IProcessLock *pProcessLock,
-             BOOL *pfApplicationAware) = 0;
-        
-        virtual HRESULT __stdcall ApplicationLaunch( 
-             const GUID & rguidApplID,
-             ApplicationType appType) = 0;
-        
-        virtual HRESULT __stdcall ApplicationFree( 
-             const GUID & rguidApplID) = 0;
-        
-        virtual HRESULT __stdcall CatalogRefresh( 
-             ULONG ulReserved) = 0;
-        
-        virtual HRESULT __stdcall ProcessShutdown( 
-             ShutdownType shutdownType) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISurrogateService_Init_Proxy( 
-    ISurrogateService * This,
-     const GUID & rguidProcessID,
-     IProcessLock *pProcessLock,
-     BOOL *pfApplicationAware);
-
-
-void __stdcall ISurrogateService_Init_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogateService_ApplicationLaunch_Proxy( 
-    ISurrogateService * This,
-     const GUID & rguidApplID,
-     ApplicationType appType);
-
-
-void __stdcall ISurrogateService_ApplicationLaunch_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogateService_ApplicationFree_Proxy( 
-    ISurrogateService * This,
-     const GUID & rguidApplID);
-
-
-void __stdcall ISurrogateService_ApplicationFree_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogateService_CatalogRefresh_Proxy( 
-    ISurrogateService * This,
-     ULONG ulReserved);
-
-
-void __stdcall ISurrogateService_CatalogRefresh_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogateService_ProcessShutdown_Proxy( 
-    ISurrogateService * This,
-     ShutdownType shutdownType);
-
-
-void __stdcall ISurrogateService_ProcessShutdown_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-typedef 
-enum _APTTYPE
-    {	APTTYPE_CURRENT	= -1,
-	APTTYPE_STA	= 0,
-	APTTYPE_MTA	= 1,
-	APTTYPE_NA	= 2,
-	APTTYPE_MAINSTA	= 3
-    } 	APTTYPE;
-
-typedef 
-enum _THDTYPE
-    {	THDTYPE_BLOCKMESSAGES	= 0,
-	THDTYPE_PROCESSMESSAGES	= 1
-    } 	THDTYPE;
-
-typedef DWORD APARTMENTID;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0089_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0089_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IComThreadingInfo;
-
-
-    
-    struct __declspec(uuid("000001ce-0000-0000-C000-000000000046")) __declspec(novtable)
-    IComThreadingInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetCurrentApartmentType( 
-             APTTYPE *pAptType) = 0;
-        
-        virtual HRESULT __stdcall GetCurrentThreadType( 
-             THDTYPE *pThreadType) = 0;
-        
-        virtual HRESULT __stdcall GetCurrentLogicalThreadId( 
-             GUID *pguidLogicalThreadId) = 0;
-        
-        virtual HRESULT __stdcall SetCurrentLogicalThreadId( 
-             const GUID & rguid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IComThreadingInfo_GetCurrentApartmentType_Proxy( 
-    IComThreadingInfo * This,
-     APTTYPE *pAptType);
-
-
-void __stdcall IComThreadingInfo_GetCurrentApartmentType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IComThreadingInfo_GetCurrentThreadType_Proxy( 
-    IComThreadingInfo * This,
-     THDTYPE *pThreadType);
-
-
-void __stdcall IComThreadingInfo_GetCurrentThreadType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IComThreadingInfo_GetCurrentLogicalThreadId_Proxy( 
-    IComThreadingInfo * This,
-     GUID *pguidLogicalThreadId);
-
-
-void __stdcall IComThreadingInfo_GetCurrentLogicalThreadId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IComThreadingInfo_SetCurrentLogicalThreadId_Proxy( 
-    IComThreadingInfo * This,
-     const GUID & rguid);
-
-
-void __stdcall IComThreadingInfo_SetCurrentLogicalThreadId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IProcessInitControl;
-
-
-    
-    struct __declspec(uuid("72380d55-8d2b-43a3-8513-2b6ef31434e9")) __declspec(novtable)
-    IProcessInitControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ResetInitializerTimeout( 
-             DWORD dwSecondsRemaining) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProcessInitControl_ResetInitializerTimeout_Proxy( 
-    IProcessInitControl * This,
-     DWORD dwSecondsRemaining);
-
-
-void __stdcall IProcessInitControl_ResetInitializerTimeout_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0091_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0091_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInitializeSpy *LPINITIALIZESPY;
-
-
-extern "C" const IID IID_IInitializeSpy;
-
-
-    
-    struct __declspec(uuid("00000034-0000-0000-C000-000000000046")) __declspec(novtable)
-    IInitializeSpy : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall PreInitialize( 
-             DWORD dwCoInit,
-             DWORD dwCurThreadAptRefs) = 0;
-        
-        virtual HRESULT __stdcall PostInitialize( 
-             HRESULT hrCoInit,
-             DWORD dwCoInit,
-             DWORD dwNewThreadAptRefs) = 0;
-        
-        virtual HRESULT __stdcall PreUninitialize( 
-             DWORD dwCurThreadAptRefs) = 0;
-        
-        virtual HRESULT __stdcall PostUninitialize( 
-             DWORD dwNewThreadAptRefs) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInitializeSpy_PreInitialize_Proxy( 
-    IInitializeSpy * This,
-     DWORD dwCoInit,
-     DWORD dwCurThreadAptRefs);
-
-
-void __stdcall IInitializeSpy_PreInitialize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInitializeSpy_PostInitialize_Proxy( 
-    IInitializeSpy * This,
-     HRESULT hrCoInit,
-     DWORD dwCoInit,
-     DWORD dwNewThreadAptRefs);
-
-
-void __stdcall IInitializeSpy_PostInitialize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInitializeSpy_PreUninitialize_Proxy( 
-    IInitializeSpy * This,
-     DWORD dwCurThreadAptRefs);
-
-
-void __stdcall IInitializeSpy_PreUninitialize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInitializeSpy_PostUninitialize_Proxy( 
-    IInitializeSpy * This,
-     DWORD dwNewThreadAptRefs);
-
-
-void __stdcall IInitializeSpy_PostUninitialize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0092_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0092_v0_0_s_ifspec;
-
-
-
-unsigned long             __stdcall  ASYNC_STGMEDIUM_UserSize(     unsigned long *, unsigned long            , ASYNC_STGMEDIUM * ); 
-unsigned char * __stdcall  ASYNC_STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, ASYNC_STGMEDIUM * ); 
-unsigned char * __stdcall  ASYNC_STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, ASYNC_STGMEDIUM * ); 
-void                      __stdcall  ASYNC_STGMEDIUM_UserFree(     unsigned long *, ASYNC_STGMEDIUM * ); 
-
-unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
-void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 
-
-unsigned long             __stdcall  FLAG_STGMEDIUM_UserSize(     unsigned long *, unsigned long            , FLAG_STGMEDIUM * ); 
-unsigned char * __stdcall  FLAG_STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, FLAG_STGMEDIUM * ); 
-unsigned char * __stdcall  FLAG_STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, FLAG_STGMEDIUM * ); 
-void                      __stdcall  FLAG_STGMEDIUM_UserFree(     unsigned long *, FLAG_STGMEDIUM * ); 
-
-unsigned long             __stdcall  HBITMAP_UserSize(     unsigned long *, unsigned long            , HBITMAP * ); 
-unsigned char * __stdcall  HBITMAP_UserMarshal(  unsigned long *, unsigned char *, HBITMAP * ); 
-unsigned char * __stdcall  HBITMAP_UserUnmarshal(unsigned long *, unsigned char *, HBITMAP * ); 
-void                      __stdcall  HBITMAP_UserFree(     unsigned long *, HBITMAP * ); 
-
-unsigned long             __stdcall  HDC_UserSize(     unsigned long *, unsigned long            , HDC * ); 
-unsigned char * __stdcall  HDC_UserMarshal(  unsigned long *, unsigned char *, HDC * ); 
-unsigned char * __stdcall  HDC_UserUnmarshal(unsigned long *, unsigned char *, HDC * ); 
-void                      __stdcall  HDC_UserFree(     unsigned long *, HDC * ); 
-
-unsigned long             __stdcall  HICON_UserSize(     unsigned long *, unsigned long            , HICON * ); 
-unsigned char * __stdcall  HICON_UserMarshal(  unsigned long *, unsigned char *, HICON * ); 
-unsigned char * __stdcall  HICON_UserUnmarshal(unsigned long *, unsigned char *, HICON * ); 
-void                      __stdcall  HICON_UserFree(     unsigned long *, HICON * ); 
-
-unsigned long             __stdcall  SNB_UserSize(     unsigned long *, unsigned long            , SNB * ); 
-unsigned char * __stdcall  SNB_UserMarshal(  unsigned long *, unsigned char *, SNB * ); 
-unsigned char * __stdcall  SNB_UserUnmarshal(unsigned long *, unsigned char *, SNB * ); 
-void                      __stdcall  SNB_UserFree(     unsigned long *, SNB * ); 
-
-unsigned long             __stdcall  STGMEDIUM_UserSize(     unsigned long *, unsigned long            , STGMEDIUM * ); 
-unsigned char * __stdcall  STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, STGMEDIUM * ); 
-unsigned char * __stdcall  STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, STGMEDIUM * ); 
-void                      __stdcall  STGMEDIUM_UserFree(     unsigned long *, STGMEDIUM * ); 
-
- HRESULT __stdcall IEnumUnknown_Next_Proxy( 
-    IEnumUnknown * This,
-     ULONG celt,
-     IUnknown **rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumUnknown_Next_Stub( 
-    IEnumUnknown * This,
-     ULONG celt,
-     IUnknown **rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall IBindCtx_SetBindOptions_Proxy( 
-    IBindCtx * This,
-     BIND_OPTS *pbindopts);
-
-
- HRESULT __stdcall IBindCtx_SetBindOptions_Stub( 
-    IBindCtx * This,
-     BIND_OPTS2 *pbindopts);
-
- HRESULT __stdcall IBindCtx_GetBindOptions_Proxy( 
-    IBindCtx * This,
-     BIND_OPTS *pbindopts);
-
-
- HRESULT __stdcall IBindCtx_GetBindOptions_Stub( 
-    IBindCtx * This,
-     BIND_OPTS2 *pbindopts);
-
- HRESULT __stdcall IEnumMoniker_Next_Proxy( 
-    IEnumMoniker * This,
-     ULONG celt,
-     IMoniker **rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumMoniker_Next_Stub( 
-    IEnumMoniker * This,
-     ULONG celt,
-     IMoniker **rgelt,
-     ULONG *pceltFetched);
-
- BOOL __stdcall IRunnableObject_IsRunning_Proxy( 
-    IRunnableObject * This);
-
-
- HRESULT __stdcall IRunnableObject_IsRunning_Stub( 
-    IRunnableObject * This);
-
- HRESULT __stdcall IMoniker_BindToObject_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riidResult,
-     void **ppvResult);
-
-
- HRESULT __stdcall IMoniker_BindToObject_Stub( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riidResult,
-     IUnknown **ppvResult);
-
- HRESULT __stdcall IMoniker_BindToStorage_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riid,
-     void **ppvObj);
-
-
- HRESULT __stdcall IMoniker_BindToStorage_Stub( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riid,
-     IUnknown **ppvObj);
-
- HRESULT __stdcall IEnumString_Next_Proxy( 
-    IEnumString * This,
-     ULONG celt,
-     LPOLESTR *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumString_Next_Stub( 
-    IEnumString * This,
-     ULONG celt,
-     LPOLESTR *rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall ISequentialStream_Read_Proxy( 
-    ISequentialStream * This,
-     void *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
- HRESULT __stdcall ISequentialStream_Read_Stub( 
-    ISequentialStream * This,
-     byte *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
- HRESULT __stdcall ISequentialStream_Write_Proxy( 
-    ISequentialStream * This,
-     const void *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
- HRESULT __stdcall ISequentialStream_Write_Stub( 
-    ISequentialStream * This,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
- HRESULT __stdcall IStream_Seek_Proxy( 
-    IStream * This,
-     LARGE_INTEGER dlibMove,
-     DWORD dwOrigin,
-     ULARGE_INTEGER *plibNewPosition);
-
-
- HRESULT __stdcall IStream_Seek_Stub( 
-    IStream * This,
-     LARGE_INTEGER dlibMove,
-     DWORD dwOrigin,
-     ULARGE_INTEGER *plibNewPosition);
-
- HRESULT __stdcall IStream_CopyTo_Proxy( 
-    IStream * This,
-     IStream *pstm,
-     ULARGE_INTEGER cb,
-     ULARGE_INTEGER *pcbRead,
-     ULARGE_INTEGER *pcbWritten);
-
-
- HRESULT __stdcall IStream_CopyTo_Stub( 
-    IStream * This,
-     IStream *pstm,
-     ULARGE_INTEGER cb,
-     ULARGE_INTEGER *pcbRead,
-     ULARGE_INTEGER *pcbWritten);
-
- HRESULT __stdcall IEnumSTATSTG_Next_Proxy( 
-    IEnumSTATSTG * This,
-     ULONG celt,
-     STATSTG *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumSTATSTG_Next_Stub( 
-    IEnumSTATSTG * This,
-     ULONG celt,
-     STATSTG *rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall IStorage_OpenStream_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     void *reserved1,
-     DWORD grfMode,
-     DWORD reserved2,
-     IStream **ppstm);
-
-
- HRESULT __stdcall IStorage_OpenStream_Stub( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     unsigned long cbReserved1,
-     byte *reserved1,
-     DWORD grfMode,
-     DWORD reserved2,
-     IStream **ppstm);
-
- HRESULT __stdcall IStorage_EnumElements_Proxy( 
-    IStorage * This,
-     DWORD reserved1,
-     void *reserved2,
-     DWORD reserved3,
-     IEnumSTATSTG **ppenum);
-
-
- HRESULT __stdcall IStorage_EnumElements_Stub( 
-    IStorage * This,
-     DWORD reserved1,
-     unsigned long cbReserved2,
-     byte *reserved2,
-     DWORD reserved3,
-     IEnumSTATSTG **ppenum);
-
- HRESULT __stdcall ILockBytes_ReadAt_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     void *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
- HRESULT __stdcall ILockBytes_ReadAt_Stub( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     byte *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
- HRESULT __stdcall ILockBytes_WriteAt_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const void *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
- HRESULT __stdcall ILockBytes_WriteAt_Stub( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
- HRESULT __stdcall IEnumFORMATETC_Next_Proxy( 
-    IEnumFORMATETC * This,
-     ULONG celt,
-     FORMATETC *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumFORMATETC_Next_Stub( 
-    IEnumFORMATETC * This,
-     ULONG celt,
-     FORMATETC *rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall IEnumSTATDATA_Next_Proxy( 
-    IEnumSTATDATA * This,
-     ULONG celt,
-     STATDATA *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumSTATDATA_Next_Stub( 
-    IEnumSTATDATA * This,
-     ULONG celt,
-     STATDATA *rgelt,
-     ULONG *pceltFetched);
-
- void __stdcall IAdviseSink_OnDataChange_Proxy( 
-    IAdviseSink * This,
-     FORMATETC *pFormatetc,
-     STGMEDIUM *pStgmed);
-
-
- HRESULT __stdcall IAdviseSink_OnDataChange_Stub( 
-    IAdviseSink * This,
-     FORMATETC *pFormatetc,
-     ASYNC_STGMEDIUM *pStgmed);
-
- void __stdcall IAdviseSink_OnViewChange_Proxy( 
-    IAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
-
- HRESULT __stdcall IAdviseSink_OnViewChange_Stub( 
-    IAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
- void __stdcall IAdviseSink_OnRename_Proxy( 
-    IAdviseSink * This,
-     IMoniker *pmk);
-
-
- HRESULT __stdcall IAdviseSink_OnRename_Stub( 
-    IAdviseSink * This,
-     IMoniker *pmk);
-
- void __stdcall IAdviseSink_OnSave_Proxy( 
-    IAdviseSink * This);
-
-
- HRESULT __stdcall IAdviseSink_OnSave_Stub( 
-    IAdviseSink * This);
-
- void __stdcall IAdviseSink_OnClose_Proxy( 
-    IAdviseSink * This);
-
-
- HRESULT __stdcall IAdviseSink_OnClose_Stub( 
-    IAdviseSink * This);
-
- void __stdcall IAdviseSink2_OnLinkSrcChange_Proxy( 
-    IAdviseSink2 * This,
-     IMoniker *pmk);
-
-
- HRESULT __stdcall IAdviseSink2_OnLinkSrcChange_Stub( 
-    IAdviseSink2 * This,
-     IMoniker *pmk);
-
- HRESULT __stdcall IDataObject_GetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetcIn,
-     STGMEDIUM *pmedium);
-
-
- HRESULT __stdcall IDataObject_GetData_Stub( 
-    IDataObject * This,
-     FORMATETC *pformatetcIn,
-     STGMEDIUM *pRemoteMedium);
-
- HRESULT __stdcall IDataObject_GetDataHere_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pmedium);
-
-
- HRESULT __stdcall IDataObject_GetDataHere_Stub( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pRemoteMedium);
-
- HRESULT __stdcall IDataObject_SetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pmedium,
-     BOOL fRelease);
-
-
- HRESULT __stdcall IDataObject_SetData_Stub( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     FLAG_STGMEDIUM *pmedium,
-     BOOL fRelease);
-
- HRESULT __stdcall IFillLockBytes_FillAppend_Proxy( 
-    IFillLockBytes * This,
-     const void *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
- HRESULT __stdcall IFillLockBytes_FillAppend_Stub( 
-    IFillLockBytes * This,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
- HRESULT __stdcall IFillLockBytes_FillAt_Proxy( 
-    IFillLockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const void *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
- HRESULT __stdcall IFillLockBytes_FillAt_Stub( 
-    IFillLockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
- void __stdcall AsyncIAdviseSink_Begin_OnDataChange_Proxy( 
-    AsyncIAdviseSink * This,
-     FORMATETC *pFormatetc,
-     STGMEDIUM *pStgmed);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnDataChange_Stub( 
-    AsyncIAdviseSink * This,
-     FORMATETC *pFormatetc,
-     ASYNC_STGMEDIUM *pStgmed);
-
- void __stdcall AsyncIAdviseSink_Finish_OnDataChange_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnDataChange_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Begin_OnViewChange_Proxy( 
-    AsyncIAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnViewChange_Stub( 
-    AsyncIAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
- void __stdcall AsyncIAdviseSink_Finish_OnViewChange_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnViewChange_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Begin_OnRename_Proxy( 
-    AsyncIAdviseSink * This,
-     IMoniker *pmk);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnRename_Stub( 
-    AsyncIAdviseSink * This,
-     IMoniker *pmk);
-
- void __stdcall AsyncIAdviseSink_Finish_OnRename_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnRename_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Begin_OnSave_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnSave_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Finish_OnSave_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnSave_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Begin_OnClose_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnClose_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Finish_OnClose_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnClose_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink2_Begin_OnLinkSrcChange_Proxy( 
-    AsyncIAdviseSink2 * This,
-     IMoniker *pmk);
-
-
- HRESULT __stdcall AsyncIAdviseSink2_Begin_OnLinkSrcChange_Stub( 
-    AsyncIAdviseSink2 * This,
-     IMoniker *pmk);
-
- void __stdcall AsyncIAdviseSink2_Finish_OnLinkSrcChange_Proxy( 
-    AsyncIAdviseSink2 * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink2_Finish_OnLinkSrcChange_Stub( 
-    AsyncIAdviseSink2 * This);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-extern const IID GUID_NULL;
-extern const IID CATID_MARSHALER;
-extern const IID IID_IRpcChannel;
-extern const IID IID_IRpcStub;
-extern const IID IID_IStubManager;
-extern const IID IID_IRpcProxy;
-extern const IID IID_IProxyManager;
-extern const IID IID_IPSFactory;
-extern const IID IID_IInternalMoniker;
-extern const IID IID_IDfReserved1;
-extern const IID IID_IDfReserved2;
-extern const IID IID_IDfReserved3;
-extern const CLSID CLSID_StdMarshal;
-extern const CLSID CLSID_AggStdMarshal;
-extern const CLSID CLSID_StdAsyncActManager;
-extern const IID IID_IStub;
-extern const IID IID_IProxy;
-extern const IID IID_IEnumGeneric;
-extern const IID IID_IEnumHolder;
-extern const IID IID_IEnumCallback;
-extern const IID IID_IOleManager;
-extern const IID IID_IOlePresObj;
-extern const IID IID_IDebug;
-extern const IID IID_IDebugStream;
-extern const CLSID CLSID_PSGenObject;
-extern const CLSID CLSID_PSClientSite;
-extern const CLSID CLSID_PSClassObject;
-extern const CLSID CLSID_PSInPlaceActive;
-extern const CLSID CLSID_PSInPlaceFrame;
-extern const CLSID CLSID_PSDragDrop;
-extern const CLSID CLSID_PSBindCtx;
-extern const CLSID CLSID_PSEnumerators;
-extern const CLSID CLSID_StaticMetafile;
-extern const CLSID CLSID_StaticDib;
-extern const CLSID CID_CDfsVolume;
-extern const CLSID CLSID_DCOMAccessControl;
-extern const CLSID CLSID_StdGlobalInterfaceTable;
-extern const CLSID CLSID_ComBinding;
-extern const CLSID CLSID_StdEvent;
-extern const CLSID CLSID_ManualResetEvent;
-extern const CLSID CLSID_SynchronizeContainer;
-extern const CLSID CLSID_AddrControl;
-
-
-
-
-
-
-
-
-
-
-extern const CLSID CLSID_CCDFormKrnl;
-extern const CLSID CLSID_CCDPropertyPage;
-extern const CLSID CLSID_CCDFormDialog;
-
-
-
-
-extern const CLSID CLSID_CCDCommandButton;
-extern const CLSID CLSID_CCDComboBox;
-extern const CLSID CLSID_CCDTextBox;
-extern const CLSID CLSID_CCDCheckBox;
-extern const CLSID CLSID_CCDLabel;
-extern const CLSID CLSID_CCDOptionButton;
-extern const CLSID CLSID_CCDListBox;
-extern const CLSID CLSID_CCDScrollBar;
-extern const CLSID CLSID_CCDGroupBox;
-
-
-
-
-extern const CLSID CLSID_CCDGeneralPropertyPage;
-extern const CLSID CLSID_CCDGenericPropertyPage;
-extern const CLSID CLSID_CCDFontPropertyPage;
-extern const CLSID CLSID_CCDColorPropertyPage;
-extern const CLSID CLSID_CCDLabelPropertyPage;
-extern const CLSID CLSID_CCDCheckBoxPropertyPage;
-extern const CLSID CLSID_CCDTextBoxPropertyPage;
-extern const CLSID CLSID_CCDOptionButtonPropertyPage;
-extern const CLSID CLSID_CCDListBoxPropertyPage;
-extern const CLSID CLSID_CCDCommandButtonPropertyPage;
-extern const CLSID CLSID_CCDComboBoxPropertyPage;
-extern const CLSID CLSID_CCDScrollBarPropertyPage;
-extern const CLSID CLSID_CCDGroupBoxPropertyPage;
-extern const CLSID CLSID_CCDXObjectPropertyPage;
-
-extern const CLSID CLSID_CStdPropertyFrame;
-
-extern const CLSID CLSID_CFormPropertyPage;
-extern const CLSID CLSID_CGridPropertyPage;
-
-extern const CLSID CLSID_CWSJArticlePage;
-extern const CLSID CLSID_CSystemPage;
-
-extern const CLSID CLSID_IdentityUnmarshal;
-extern const CLSID CLSID_InProcFreeMarshaler;
-
-extern const CLSID CLSID_Picture_Metafile;
-extern const CLSID CLSID_Picture_EnhMetafile;
-extern const CLSID CLSID_Picture_Dib;
-
-
-
-
-extern const GUID GUID_TRISTATE;
-
-
-}
-
-
-
-
-
-
-
-
-typedef enum tagCOINIT
-{
-  COINIT_APARTMENTTHREADED  = 0x2,      
-
-
-  
-  COINIT_MULTITHREADED      = 0x0,      
-  COINIT_DISABLE_OLE1DDE    = 0x4,      
-  COINIT_SPEED_OVER_MEMORY  = 0x8,      
-
-} COINIT;
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall CoBuildVersion( void );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoInitialize( LPVOID pvReserved);
-extern "C" __declspec(dllimport) void __stdcall  CoUninitialize(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetMalloc( DWORD dwMemContext,  LPMALLOC * ppMalloc);
-extern "C" __declspec(dllimport) DWORD __stdcall CoGetCurrentProcess(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterMallocSpy( LPMALLOCSPY pMallocSpy);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeMallocSpy(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoCreateStandardMalloc( DWORD memctx,  IMalloc * * ppMalloc);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoInitializeEx( LPVOID pvReserved,  DWORD dwCoInit);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetCallerTID( LPDWORD lpdwTID );
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterInitializeSpy( LPINITIALIZESPY pSpy,  ULARGE_INTEGER *puliCookie);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeInitializeSpy( ULARGE_INTEGER uliCookie);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetContextToken(ULONG_PTR* pToken);
-
-
-
-typedef enum tagCOMSD
-{
-    SD_LAUNCHPERMISSIONS = 0,   	
-    SD_ACCESSPERMISSIONS = 1,   	
-    SD_LAUNCHRESTRICTIONS = 2,   	
-    SD_ACCESSRESTRICTIONS = 3   	
-    
-} COMSD;
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetSystemSecurityPermissions(COMSD comSDType, PSECURITY_DESCRIPTOR *ppSD);
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSOleTlsDataPublic
-{
-    void *pvReserved0[2];
-    DWORD dwReserved0[3];
-    void *pvReserved1[1];
-    DWORD dwReserved1[3];
-    void *pvReserved2[4];
-    DWORD dwReserved2[1];
-    void *pCurrentCtx;
-} SOleTlsDataPublic;
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall     CoGetObjectContext( const IID & riid,  LPVOID * ppv);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetClassObject( const IID & rclsid,  DWORD dwClsContext,  LPVOID pvReserved,
-                     const IID & riid,  LPVOID * ppv);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterClassObject( const IID & rclsid,  LPUNKNOWN pUnk,
-                     DWORD dwClsContext,  DWORD flags,  LPDWORD lpdwRegister);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeClassObject( DWORD dwRegister);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoResumeClassObjects(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoSuspendClassObjects(void);
-extern "C" __declspec(dllimport) ULONG __stdcall CoAddRefServerProcess(void);
-extern "C" __declspec(dllimport) ULONG __stdcall CoReleaseServerProcess(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetPSClsid( const IID & riid,  CLSID *pClsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterPSClsid( const IID & riid,  const IID & rclsid);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterSurrogate( LPSURROGATE pSurrogate);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetMarshalSizeMax( ULONG *pulSize,  const IID & riid,  LPUNKNOWN pUnk,
-                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalInterface( LPSTREAM pStm,  const IID & riid,  LPUNKNOWN pUnk,
-                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoUnmarshalInterface( LPSTREAM pStm,  const IID & riid,  LPVOID * ppv);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalHresult( LPSTREAM pstm,  HRESULT hresult);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoUnmarshalHresult( LPSTREAM pstm,  HRESULT  * phresult);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoReleaseMarshalData( LPSTREAM pStm);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoDisconnectObject( LPUNKNOWN pUnk,  DWORD dwReserved);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoLockObjectExternal( LPUNKNOWN pUnk,  BOOL fLock,  BOOL fLastUnlockReleases);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetStandardMarshal( const IID & riid,  LPUNKNOWN pUnk,
-                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags,
-                     LPMARSHAL * ppMarshal);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetStdMarshalEx( LPUNKNOWN pUnkOuter,  DWORD smexflags,
-                             LPUNKNOWN * ppUnkInner);
-
-
-typedef enum tagSTDMSHLFLAGS
-{
-    SMEXF_SERVER     = 0x01,       
-    SMEXF_HANDLER    = 0x02        
-} STDMSHLFLAGS;
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall CoIsHandlerConnected( LPUNKNOWN pUnk);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalInterThreadInterfaceInStream( const IID & riid,  LPUNKNOWN pUnk,
-                     LPSTREAM *ppStm);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInterfaceAndReleaseStream( LPSTREAM pStm,  const IID & iid,
-                     LPVOID * ppv);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateFreeThreadedMarshaler( LPUNKNOWN  punkOuter,
-                     LPUNKNOWN *ppunkMarshal);
-
-
-
-extern "C" __declspec(dllimport) HINSTANCE __stdcall CoLoadLibrary( LPOLESTR lpszLibName,  BOOL bAutoFree);
-extern "C" __declspec(dllimport) void __stdcall CoFreeLibrary( HINSTANCE hInst);
-extern "C" __declspec(dllimport) void __stdcall CoFreeAllLibraries(void);
-extern "C" __declspec(dllimport) void __stdcall CoFreeUnusedLibraries(void);
-
-
-
-extern "C" __declspec(dllimport) void __stdcall CoFreeUnusedLibrariesEx( DWORD dwUnloadDelay,  DWORD dwReserved);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoInitializeSecurity(
-                     PSECURITY_DESCRIPTOR         pSecDesc,
-                     LONG                         cAuthSvc,
-                     SOLE_AUTHENTICATION_SERVICE *asAuthSvc,
-                     void                        *pReserved1,
-                     DWORD                        dwAuthnLevel,
-                     DWORD                        dwImpLevel,
-                     void                        *pAuthList,
-                     DWORD                        dwCapabilities,
-                     void                        *pReserved3 );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetCallContext(  const IID & riid,  void **ppInterface );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryProxyBlanket(
-      IUnknown                  *pProxy,
-     DWORD                     *pwAuthnSvc,
-     DWORD                     *pAuthzSvc,
-     OLECHAR                  **pServerPrincName,
-     DWORD                     *pAuthnLevel,
-     DWORD                     *pImpLevel,
-     RPC_AUTH_IDENTITY_HANDLE  *pAuthInfo,
-     DWORD                     *pCapabilites );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoSetProxyBlanket(
-     IUnknown                 *pProxy,
-     DWORD                     dwAuthnSvc,
-     DWORD                     dwAuthzSvc,
-     OLECHAR                  *pServerPrincName,
-     DWORD                     dwAuthnLevel,
-     DWORD                     dwImpLevel,
-     RPC_AUTH_IDENTITY_HANDLE  pAuthInfo,
-     DWORD                     dwCapabilities );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCopyProxy(
-      IUnknown    *pProxy,
-     IUnknown   **ppCopy );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryClientBlanket(
-     DWORD             *pAuthnSvc,
-     DWORD             *pAuthzSvc,
-     OLECHAR          **pServerPrincName,
-     DWORD             *pAuthnLevel,
-     DWORD             *pImpLevel,
-     RPC_AUTHZ_HANDLE  *pPrivs,
-     DWORD             *pCapabilities );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoImpersonateClient();
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoRevertToSelf();
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryAuthenticationServices(
-     DWORD *pcAuthSvc,
-     SOLE_AUTHENTICATION_SERVICE **asAuthSvc );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoSwitchCallContext(  IUnknown *pNewObject,  IUnknown **ppOldObject );
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateInstance( const IID & rclsid,  LPUNKNOWN pUnkOuter,
-                     DWORD dwClsContext,  const IID & riid,  LPVOID * ppv);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInstanceFromFile(
-     COSERVERINFO *              pServerInfo,
-     CLSID       *               pClsid,
-     IUnknown    *               punkOuter, 
-     DWORD                       dwClsCtx,
-     DWORD                       grfMode,
-     OLECHAR *                   pwszName,
-     DWORD                       dwCount,
-      MULTI_QI    *           pResults );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInstanceFromIStorage(
-     COSERVERINFO *              pServerInfo,
-     CLSID       *               pClsid,
-     IUnknown    *               punkOuter, 
-     DWORD                       dwClsCtx,
-     struct IStorage *           pstg,
-     DWORD                       dwCount,
-      MULTI_QI    *           pResults );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateInstanceEx(
-     const IID &                    Clsid,
-     IUnknown    *               punkOuter, 
-     DWORD                       dwClsCtx,
-     COSERVERINFO *              pServerInfo,
-     DWORD                       dwCount,
-      MULTI_QI    *           pResults );
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetCancelObject( DWORD dwThreadId,  const IID & iid,  void **ppUnk);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoSetCancelObject( IUnknown *pUnk);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCancelCall( DWORD dwThreadId,  ULONG ulTimeout);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoTestCancel();
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoEnableCallCancellation( LPVOID pReserved);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoDisableCallCancellation( LPVOID pReserved);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoAllowSetForegroundWindow( IUnknown *pUnk,  LPVOID lpvReserved);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DcomChannelSetHResult( LPVOID pvReserved,  ULONG* pulReserved,  HRESULT appsHR);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StringFromCLSID( const IID & rclsid,  LPOLESTR * lplpsz);
-extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromString( LPOLESTR lpsz,  LPCLSID pclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall StringFromIID( const IID & rclsid,  LPOLESTR * lplpsz);
-extern "C" __declspec(dllimport) HRESULT __stdcall IIDFromString( LPOLESTR lpsz,  LPIID lpiid);
-extern "C" __declspec(dllimport) BOOL __stdcall CoIsOle1Class( const IID & rclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall ProgIDFromCLSID ( const IID & clsid,  LPOLESTR * lplpszProgID);
-extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromProgID ( LPCOLESTR lpszProgID,  LPCLSID lpclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromProgIDEx ( LPCOLESTR lpszProgID,  LPCLSID lpclsid);
-extern "C" __declspec(dllimport) int __stdcall StringFromGUID2( const GUID & rguid,  LPOLESTR lpsz,  int cchMax);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateGuid( GUID  *pguid);
-
-extern "C" __declspec(dllimport) BOOL __stdcall CoFileTimeToDosDateTime(
-                  FILETIME * lpFileTime,  LPWORD lpDosDate,  LPWORD lpDosTime);
-extern "C" __declspec(dllimport) BOOL __stdcall CoDosDateTimeToFileTime(
-                        WORD nDosDate,  WORD nDosTime,  FILETIME * lpFileTime);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoFileTimeNow(  FILETIME * lpFileTime );
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoRegisterMessageFilter(  LPMESSAGEFILTER lpMessageFilter,
-                                 LPMESSAGEFILTER * lplpMessageFilter );
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoRegisterChannelHook(  const GUID & ExtensionUuid,  IChannelHook *pChannelHook );
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoWaitForMultipleHandles ( DWORD dwFlags,
-                                     DWORD dwTimeout,
-                                     ULONG cHandles,
-                                     LPHANDLE pHandles,
-                                     LPDWORD  lpdwindex);
-
-
-
-typedef enum tagCOWAIT_FLAGS
-{
-  COWAIT_WAITALL = 1,
-  COWAIT_ALERTABLE = 2,
-  COWAIT_INPUTAVAILABLE = 4
-}COWAIT_FLAGS;
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoInvalidateRemoteMachineBindings(LPOLESTR pszMachineName);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetTreatAsClass( const IID & clsidOld,  LPCLSID pClsidNew);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoTreatAsClass( const IID & clsidOld,  const IID & clsidNew);
-
-
-
-
-
-
-
-
-
-
-typedef HRESULT (__stdcall * LPFNGETCLASSOBJECT) (const IID &, const IID &, LPVOID *);
-
-
-
-
-
-typedef HRESULT (__stdcall * LPFNCANUNLOADNOW)(void);
-
-
-extern "C" HRESULT __stdcall  DllGetClassObject( const IID & rclsid,  const IID & riid,  LPVOID * ppv);
-
-extern "C" HRESULT __stdcall  DllCanUnloadNow(void);
-
-
-
-extern "C" __declspec(dllimport) LPVOID __stdcall CoTaskMemAlloc( SIZE_T cb);
-extern "C" __declspec(dllimport) LPVOID __stdcall CoTaskMemRealloc( LPVOID pv,  SIZE_T cb);
-extern "C" __declspec(dllimport) void __stdcall   CoTaskMemFree( LPVOID pv);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataAdviseHolder( LPDATAADVISEHOLDER * ppDAHolder);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataCache( LPUNKNOWN pUnkOuter,  const IID & rclsid,
-                                         const IID & iid,  LPVOID * ppv);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateDocfile( const OLECHAR * pwcsName,
-             DWORD grfMode,
-             DWORD reserved,
-             IStorage  *  *ppstgOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateDocfileOnILockBytes( ILockBytes  *plkbyt,
-                     DWORD grfMode,
-                     DWORD reserved,
-                     IStorage  *  *ppstgOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorage( const OLECHAR * pwcsName,
-                IStorage  *pstgPriority,
-                DWORD grfMode,
-                SNB snbExclude,
-                DWORD reserved,
-               IStorage  *  *ppstgOpen);
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorageOnILockBytes( ILockBytes  *plkbyt,
-                    IStorage  *pstgPriority,
-                    DWORD grfMode,
-                    SNB snbExclude,
-                    DWORD reserved,
-                   IStorage  *  *ppstgOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgIsStorageFile( const OLECHAR * pwcsName);
-extern "C" __declspec(dllimport) HRESULT __stdcall StgIsStorageILockBytes( ILockBytes * plkbyt);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgSetTimes( OLECHAR const * lpszName,
-                    FILETIME const * pctime,
-                    FILETIME const * patime,
-                    FILETIME const * pmtime);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenAsyncDocfileOnIFillLockBytes(  IFillLockBytes *pflb,
-               DWORD grfMode,
-               DWORD asyncFlags,
-              IStorage **ppstgOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgGetIFillLockBytesOnILockBytes(  ILockBytes *pilb,
-              IFillLockBytes **ppflb);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgGetIFillLockBytesOnFile( OLECHAR const *pwcsName,
-              IFillLockBytes **ppflb);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenLayoutDocfile( OLECHAR const *pwcsDfName,
-               DWORD grfMode,
-               DWORD reserved,
-              IStorage **ppstgOpen);
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSTGOPTIONS
-{
-    USHORT usVersion;            
-    USHORT reserved;             
-    ULONG ulSectorSize;          
-
-    const WCHAR *pwcsTemplateFile;  
-
-} STGOPTIONS;
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateStorageEx ( const WCHAR* pwcsName,
-              DWORD grfMode,
-              DWORD stgfmt,              
-              DWORD grfAttrs,             
-              STGOPTIONS * pStgOptions,
-              void * reserved,
-              const IID & riid,
-             void ** ppObjectOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorageEx ( const WCHAR* pwcsName,
-              DWORD grfMode,
-              DWORD stgfmt,              
-              DWORD grfAttrs,             
-              STGOPTIONS * pStgOptions,
-              void * reserved,
-              const IID & riid,
-             void ** ppObjectOpen);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  BindMoniker( LPMONIKER pmk,  DWORD grfOpt,  const IID & iidResult,  LPVOID * ppvResult);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoInstall(
-      IBindCtx     * pbc,
-      DWORD          dwFlags,
-      uCLSSPEC     * pClassSpec,
-      QUERYCONTEXT * pQuery,
-      LPWSTR         pszCodeBase);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetObject( LPCWSTR pszName,  BIND_OPTS *pBindOptions,  const IID & riid,  void **ppv);
-extern "C" __declspec(dllimport) HRESULT __stdcall  MkParseDisplayName( LPBC pbc,  LPCOLESTR szUserName,
-                 ULONG  * pchEaten,  LPMONIKER  * ppmk);
-extern "C" __declspec(dllimport) HRESULT __stdcall  MonikerRelativePathTo( LPMONIKER pmkSrc,  LPMONIKER pmkDest,  LPMONIKER
-                * ppmkRelPath,  BOOL dwReserved);
-extern "C" __declspec(dllimport) HRESULT __stdcall  MonikerCommonPrefixWith( LPMONIKER pmkThis,  LPMONIKER pmkOther,
-                 LPMONIKER * ppmkCommon);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateBindCtx( DWORD reserved,  LPBC * ppbc);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateGenericComposite( LPMONIKER pmkFirst,  LPMONIKER pmkRest,
-     LPMONIKER * ppmkComposite);
-extern "C" __declspec(dllimport) HRESULT __stdcall  GetClassFile ( LPCOLESTR szFilename,  CLSID * pclsid);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateClassMoniker( const IID & rclsid,  LPMONIKER * ppmk);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateFileMoniker( LPCOLESTR lpszPathName,  LPMONIKER * ppmk);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateItemMoniker( LPCOLESTR lpszDelim,  LPCOLESTR lpszItem,
-     LPMONIKER * ppmk);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateAntiMoniker( LPMONIKER * ppmk);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreatePointerMoniker( LPUNKNOWN punk,  LPMONIKER * ppmk);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateObjrefMoniker( LPUNKNOWN punk,  LPMONIKER  * ppmk);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  GetRunningObjectTable(  DWORD reserved,  LPRUNNINGOBJECTTABLE * pprot);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IPersistMoniker IPersistMoniker;
-
-
-
-
-
-typedef struct IMonikerProp IMonikerProp;
-
-
-
-
-
-typedef struct IBindProtocol IBindProtocol;
-
-
-
-
-
-typedef struct IBinding IBinding;
-
-
-
-
-
-typedef struct IBindStatusCallback IBindStatusCallback;
-
-
-
-
-
-typedef struct IAuthenticate IAuthenticate;
-
-
-
-
-
-typedef struct IHttpNegotiate IHttpNegotiate;
-
-
-
-
-
-typedef struct IHttpNegotiate2 IHttpNegotiate2;
-
-
-
-
-
-typedef struct IWinInetFileStream IWinInetFileStream;
-
-
-
-
-
-typedef struct IWindowForBindingUI IWindowForBindingUI;
-
-
-
-
-
-typedef struct ICodeInstall ICodeInstall;
-
-
-
-
-
-typedef struct IWinInetInfo IWinInetInfo;
-
-
-
-
-
-typedef struct IHttpSecurity IHttpSecurity;
-
-
-
-
-
-typedef struct IWinInetHttpInfo IWinInetHttpInfo;
-
-
-
-
-
-typedef struct IWinInetCacheHints IWinInetCacheHints;
-
-
-
-
-
-typedef struct IBindHost IBindHost;
-
-
-
-
-
-typedef struct IInternet IInternet;
-
-
-
-
-
-typedef struct IInternetBindInfo IInternetBindInfo;
-
-
-
-
-
-typedef struct IInternetProtocolRoot IInternetProtocolRoot;
-
-
-
-
-
-typedef struct IInternetProtocol IInternetProtocol;
-
-
-
-
-
-typedef struct IInternetProtocolSink IInternetProtocolSink;
-
-
-
-
-
-typedef struct IInternetProtocolSinkStackable IInternetProtocolSinkStackable;
-
-
-
-
-
-typedef struct IInternetSession IInternetSession;
-
-
-
-
-
-typedef struct IInternetThreadSwitch IInternetThreadSwitch;
-
-
-
-
-
-typedef struct IInternetPriority IInternetPriority;
-
-
-
-
-
-typedef struct IInternetProtocolInfo IInternetProtocolInfo;
-
-
-
-
-
-typedef struct IInternetSecurityMgrSite IInternetSecurityMgrSite;
-
-
-
-
-
-typedef struct IInternetSecurityManager IInternetSecurityManager;
-
-
-
-
-
-typedef struct IInternetSecurityManagerEx IInternetSecurityManagerEx;
-
-
-
-
-
-typedef struct IZoneIdentifier IZoneIdentifier;
-
-
-
-
-
-typedef struct IInternetHostSecurityManager IInternetHostSecurityManager;
-
-
-
-
-
-typedef struct IInternetZoneManager IInternetZoneManager;
-
-
-
-
-
-typedef struct IInternetZoneManagerEx IInternetZoneManagerEx;
-
-
-
-
-
-typedef struct ISoftDistExt ISoftDistExt;
-
-
-
-
-
-typedef struct ICatalogFileInfo ICatalogFileInfo;
-
-
-
-
-
-typedef struct IDataFilter IDataFilter;
-
-
-
-
-
-typedef struct IEncodingFilterFactory IEncodingFilterFactory;
-
-
-
-
-
-typedef struct IWrappedProtocol IWrappedProtocol;
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IOleAdviseHolder IOleAdviseHolder;
-
-
-
-
-
-typedef struct IOleCache IOleCache;
-
-
-
-
-
-typedef struct IOleCache2 IOleCache2;
-
-
-
-
-
-typedef struct IOleCacheControl IOleCacheControl;
-
-
-
-
-
-typedef struct IParseDisplayName IParseDisplayName;
-
-
-
-
-
-typedef struct IOleContainer IOleContainer;
-
-
-
-
-
-typedef struct IOleClientSite IOleClientSite;
-
-
-
-
-
-typedef struct IOleObject IOleObject;
-
-
-
-
-
-typedef struct IOleWindow IOleWindow;
-
-
-
-
-
-typedef struct IOleLink IOleLink;
-
-
-
-
-
-typedef struct IOleItemContainer IOleItemContainer;
-
-
-
-
-
-typedef struct IOleInPlaceUIWindow IOleInPlaceUIWindow;
-
-
-
-
-
-typedef struct IOleInPlaceActiveObject IOleInPlaceActiveObject;
-
-
-
-
-
-typedef struct IOleInPlaceFrame IOleInPlaceFrame;
-
-
-
-
-
-typedef struct IOleInPlaceObject IOleInPlaceObject;
-
-
-
-
-
-typedef struct IOleInPlaceSite IOleInPlaceSite;
-
-
-
-
-
-typedef struct IContinue IContinue;
-
-
-
-
-
-typedef struct IViewObject IViewObject;
-
-
-
-
-
-typedef struct IViewObject2 IViewObject2;
-
-
-
-
-
-typedef struct IDropSource IDropSource;
-
-
-
-
-
-typedef struct IDropTarget IDropTarget;
-
-
-
-
-
-typedef struct IEnumOLEVERB IEnumOLEVERB;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oleidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oleidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IOleAdviseHolder *LPOLEADVISEHOLDER;
-
-
-extern "C" const IID IID_IOleAdviseHolder;
-
-
-    
-    struct __declspec(uuid("00000111-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleAdviseHolder : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Advise( 
-             IAdviseSink *pAdvise,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall Unadvise( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumAdvise( 
-             IEnumSTATDATA **ppenumAdvise) = 0;
-        
-        virtual HRESULT __stdcall SendOnRename( 
-             IMoniker *pmk) = 0;
-        
-        virtual HRESULT __stdcall SendOnSave( void) = 0;
-        
-        virtual HRESULT __stdcall SendOnClose( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleAdviseHolder_Advise_Proxy( 
-    IOleAdviseHolder * This,
-     IAdviseSink *pAdvise,
-     DWORD *pdwConnection);
-
-
-void __stdcall IOleAdviseHolder_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_Unadvise_Proxy( 
-    IOleAdviseHolder * This,
-     DWORD dwConnection);
-
-
-void __stdcall IOleAdviseHolder_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_EnumAdvise_Proxy( 
-    IOleAdviseHolder * This,
-     IEnumSTATDATA **ppenumAdvise);
-
-
-void __stdcall IOleAdviseHolder_EnumAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_SendOnRename_Proxy( 
-    IOleAdviseHolder * This,
-     IMoniker *pmk);
-
-
-void __stdcall IOleAdviseHolder_SendOnRename_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_SendOnSave_Proxy( 
-    IOleAdviseHolder * This);
-
-
-void __stdcall IOleAdviseHolder_SendOnSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_SendOnClose_Proxy( 
-    IOleAdviseHolder * This);
-
-
-void __stdcall IOleAdviseHolder_SendOnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleCache *LPOLECACHE;
-
-
-extern "C" const IID IID_IOleCache;
-
-
-    
-    struct __declspec(uuid("0000011e-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleCache : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Cache( 
-             FORMATETC *pformatetc,
-             DWORD advf,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall Uncache( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumCache( 
-             IEnumSTATDATA **ppenumSTATDATA) = 0;
-        
-        virtual HRESULT __stdcall InitCache( 
-             IDataObject *pDataObject) = 0;
-        
-        virtual HRESULT __stdcall SetData( 
-             FORMATETC *pformatetc,
-             STGMEDIUM *pmedium,
-             BOOL fRelease) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleCache_Cache_Proxy( 
-    IOleCache * This,
-     FORMATETC *pformatetc,
-     DWORD advf,
-     DWORD *pdwConnection);
-
-
-void __stdcall IOleCache_Cache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache_Uncache_Proxy( 
-    IOleCache * This,
-     DWORD dwConnection);
-
-
-void __stdcall IOleCache_Uncache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache_EnumCache_Proxy( 
-    IOleCache * This,
-     IEnumSTATDATA **ppenumSTATDATA);
-
-
-void __stdcall IOleCache_EnumCache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache_InitCache_Proxy( 
-    IOleCache * This,
-     IDataObject *pDataObject);
-
-
-void __stdcall IOleCache_InitCache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache_SetData_Proxy( 
-    IOleCache * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pmedium,
-     BOOL fRelease);
-
-
-void __stdcall IOleCache_SetData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleCache2 *LPOLECACHE2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  
-enum tagDISCARDCACHE
-    {	DISCARDCACHE_SAVEIFDIRTY	= 0,
-	DISCARDCACHE_NOSAVE	= 1
-    } 	DISCARDCACHE;
-
-
-extern "C" const IID IID_IOleCache2;
-
-
-    
-    struct __declspec(uuid("00000128-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleCache2 : public IOleCache
-    {
-    public:
-        virtual  HRESULT __stdcall UpdateCache( 
-             LPDATAOBJECT pDataObject,
-             DWORD grfUpdf,
-             LPVOID pReserved) = 0;
-        
-        virtual HRESULT __stdcall DiscardCache( 
-             DWORD dwDiscardOptions) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IOleCache2_RemoteUpdateCache_Proxy( 
-    IOleCache2 * This,
-     LPDATAOBJECT pDataObject,
-     DWORD grfUpdf,
-     LONG_PTR pReserved);
-
-
-void __stdcall IOleCache2_RemoteUpdateCache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache2_DiscardCache_Proxy( 
-    IOleCache2 * This,
-     DWORD dwDiscardOptions);
-
-
-void __stdcall IOleCache2_DiscardCache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleCacheControl *LPOLECACHECONTROL;
-
-
-extern "C" const IID IID_IOleCacheControl;
-
-
-    
-    struct __declspec(uuid("00000129-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleCacheControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnRun( 
-            LPDATAOBJECT pDataObject) = 0;
-        
-        virtual HRESULT __stdcall OnStop( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleCacheControl_OnRun_Proxy( 
-    IOleCacheControl * This,
-    LPDATAOBJECT pDataObject);
-
-
-void __stdcall IOleCacheControl_OnRun_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCacheControl_OnStop_Proxy( 
-    IOleCacheControl * This);
-
-
-void __stdcall IOleCacheControl_OnStop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IParseDisplayName *LPPARSEDISPLAYNAME;
-
-
-extern "C" const IID IID_IParseDisplayName;
-
-
-    
-    struct __declspec(uuid("0000011a-0000-0000-C000-000000000046")) __declspec(novtable)
-    IParseDisplayName : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ParseDisplayName( 
-             IBindCtx *pbc,
-             LPOLESTR pszDisplayName,
-             ULONG *pchEaten,
-             IMoniker **ppmkOut) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IParseDisplayName_ParseDisplayName_Proxy( 
-    IParseDisplayName * This,
-     IBindCtx *pbc,
-     LPOLESTR pszDisplayName,
-     ULONG *pchEaten,
-     IMoniker **ppmkOut);
-
-
-void __stdcall IParseDisplayName_ParseDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleContainer *LPOLECONTAINER;
-
-
-extern "C" const IID IID_IOleContainer;
-
-
-    
-    struct __declspec(uuid("0000011b-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleContainer : public IParseDisplayName
-    {
-    public:
-        virtual HRESULT __stdcall EnumObjects( 
-             DWORD grfFlags,
-             IEnumUnknown **ppenum) = 0;
-        
-        virtual HRESULT __stdcall LockContainer( 
-             BOOL fLock) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleContainer_EnumObjects_Proxy( 
-    IOleContainer * This,
-     DWORD grfFlags,
-     IEnumUnknown **ppenum);
-
-
-void __stdcall IOleContainer_EnumObjects_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleContainer_LockContainer_Proxy( 
-    IOleContainer * This,
-     BOOL fLock);
-
-
-void __stdcall IOleContainer_LockContainer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleClientSite *LPOLECLIENTSITE;
-
-
-extern "C" const IID IID_IOleClientSite;
-
-
-    
-    struct __declspec(uuid("00000118-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleClientSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SaveObject( void) = 0;
-        
-        virtual HRESULT __stdcall GetMoniker( 
-             DWORD dwAssign,
-             DWORD dwWhichMoniker,
-             IMoniker **ppmk) = 0;
-        
-        virtual HRESULT __stdcall GetContainer( 
-             IOleContainer **ppContainer) = 0;
-        
-        virtual HRESULT __stdcall ShowObject( void) = 0;
-        
-        virtual HRESULT __stdcall OnShowWindow( 
-             BOOL fShow) = 0;
-        
-        virtual HRESULT __stdcall RequestNewObjectLayout( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleClientSite_SaveObject_Proxy( 
-    IOleClientSite * This);
-
-
-void __stdcall IOleClientSite_SaveObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_GetMoniker_Proxy( 
-    IOleClientSite * This,
-     DWORD dwAssign,
-     DWORD dwWhichMoniker,
-     IMoniker **ppmk);
-
-
-void __stdcall IOleClientSite_GetMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_GetContainer_Proxy( 
-    IOleClientSite * This,
-     IOleContainer **ppContainer);
-
-
-void __stdcall IOleClientSite_GetContainer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_ShowObject_Proxy( 
-    IOleClientSite * This);
-
-
-void __stdcall IOleClientSite_ShowObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_OnShowWindow_Proxy( 
-    IOleClientSite * This,
-     BOOL fShow);
-
-
-void __stdcall IOleClientSite_OnShowWindow_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_RequestNewObjectLayout_Proxy( 
-    IOleClientSite * This);
-
-
-void __stdcall IOleClientSite_RequestNewObjectLayout_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleObject *LPOLEOBJECT;
-
-typedef 
-enum tagOLEGETMONIKER
-    {	OLEGETMONIKER_ONLYIFTHERE	= 1,
-	OLEGETMONIKER_FORCEASSIGN	= 2,
-	OLEGETMONIKER_UNASSIGN	= 3,
-	OLEGETMONIKER_TEMPFORUSER	= 4
-    } 	OLEGETMONIKER;
-
-typedef 
-enum tagOLEWHICHMK
-    {	OLEWHICHMK_CONTAINER	= 1,
-	OLEWHICHMK_OBJREL	= 2,
-	OLEWHICHMK_OBJFULL	= 3
-    } 	OLEWHICHMK;
-
-typedef 
-enum tagUSERCLASSTYPE
-    {	USERCLASSTYPE_FULL	= 1,
-	USERCLASSTYPE_SHORT	= 2,
-	USERCLASSTYPE_APPNAME	= 3
-    } 	USERCLASSTYPE;
-
-typedef 
-enum tagOLEMISC
-    {	OLEMISC_RECOMPOSEONRESIZE	= 0x1,
-	OLEMISC_ONLYICONIC	= 0x2,
-	OLEMISC_INSERTNOTREPLACE	= 0x4,
-	OLEMISC_STATIC	= 0x8,
-	OLEMISC_CANTLINKINSIDE	= 0x10,
-	OLEMISC_CANLINKBYOLE1	= 0x20,
-	OLEMISC_ISLINKOBJECT	= 0x40,
-	OLEMISC_INSIDEOUT	= 0x80,
-	OLEMISC_ACTIVATEWHENVISIBLE	= 0x100,
-	OLEMISC_RENDERINGISDEVICEINDEPENDENT	= 0x200,
-	OLEMISC_INVISIBLEATRUNTIME	= 0x400,
-	OLEMISC_ALWAYSRUN	= 0x800,
-	OLEMISC_ACTSLIKEBUTTON	= 0x1000,
-	OLEMISC_ACTSLIKELABEL	= 0x2000,
-	OLEMISC_NOUIACTIVATE	= 0x4000,
-	OLEMISC_ALIGNABLE	= 0x8000,
-	OLEMISC_SIMPLEFRAME	= 0x10000,
-	OLEMISC_SETCLIENTSITEFIRST	= 0x20000,
-	OLEMISC_IMEMODE	= 0x40000,
-	OLEMISC_IGNOREACTIVATEWHENVISIBLE	= 0x80000,
-	OLEMISC_WANTSTOMENUMERGE	= 0x100000,
-	OLEMISC_SUPPORTSMULTILEVELUNDO	= 0x200000
-    } 	OLEMISC;
-
-typedef 
-enum tagOLECLOSE
-    {	OLECLOSE_SAVEIFDIRTY	= 0,
-	OLECLOSE_NOSAVE	= 1,
-	OLECLOSE_PROMPTSAVE	= 2
-    } 	OLECLOSE;
-
-
-extern "C" const IID IID_IOleObject;
-
-
-    
-    struct __declspec(uuid("00000112-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleObject : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetClientSite( 
-             IOleClientSite *pClientSite) = 0;
-        
-        virtual HRESULT __stdcall GetClientSite( 
-             IOleClientSite **ppClientSite) = 0;
-        
-        virtual HRESULT __stdcall SetHostNames( 
-             LPCOLESTR szContainerApp,
-             LPCOLESTR szContainerObj) = 0;
-        
-        virtual HRESULT __stdcall Close( 
-             DWORD dwSaveOption) = 0;
-        
-        virtual HRESULT __stdcall SetMoniker( 
-             DWORD dwWhichMoniker,
-             IMoniker *pmk) = 0;
-        
-        virtual HRESULT __stdcall GetMoniker( 
-             DWORD dwAssign,
-             DWORD dwWhichMoniker,
-             IMoniker **ppmk) = 0;
-        
-        virtual HRESULT __stdcall InitFromData( 
-             IDataObject *pDataObject,
-             BOOL fCreation,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall GetClipboardData( 
-             DWORD dwReserved,
-             IDataObject **ppDataObject) = 0;
-        
-        virtual HRESULT __stdcall DoVerb( 
-             LONG iVerb,
-             LPMSG lpmsg,
-             IOleClientSite *pActiveSite,
-             LONG lindex,
-             HWND hwndParent,
-             LPCRECT lprcPosRect) = 0;
-        
-        virtual HRESULT __stdcall EnumVerbs( 
-             IEnumOLEVERB **ppEnumOleVerb) = 0;
-        
-        virtual HRESULT __stdcall Update( void) = 0;
-        
-        virtual HRESULT __stdcall IsUpToDate( void) = 0;
-        
-        virtual HRESULT __stdcall GetUserClassID( 
-             CLSID *pClsid) = 0;
-        
-        virtual HRESULT __stdcall GetUserType( 
-             DWORD dwFormOfType,
-             LPOLESTR *pszUserType) = 0;
-        
-        virtual HRESULT __stdcall SetExtent( 
-             DWORD dwDrawAspect,
-             SIZEL *psizel) = 0;
-        
-        virtual HRESULT __stdcall GetExtent( 
-             DWORD dwDrawAspect,
-             SIZEL *psizel) = 0;
-        
-        virtual HRESULT __stdcall Advise( 
-             IAdviseSink *pAdvSink,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall Unadvise( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumAdvise( 
-             IEnumSTATDATA **ppenumAdvise) = 0;
-        
-        virtual HRESULT __stdcall GetMiscStatus( 
-             DWORD dwAspect,
-             DWORD *pdwStatus) = 0;
-        
-        virtual HRESULT __stdcall SetColorScheme( 
-             LOGPALETTE *pLogpal) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleObject_SetClientSite_Proxy( 
-    IOleObject * This,
-     IOleClientSite *pClientSite);
-
-
-void __stdcall IOleObject_SetClientSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetClientSite_Proxy( 
-    IOleObject * This,
-     IOleClientSite **ppClientSite);
-
-
-void __stdcall IOleObject_GetClientSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_SetHostNames_Proxy( 
-    IOleObject * This,
-     LPCOLESTR szContainerApp,
-     LPCOLESTR szContainerObj);
-
-
-void __stdcall IOleObject_SetHostNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_Close_Proxy( 
-    IOleObject * This,
-     DWORD dwSaveOption);
-
-
-void __stdcall IOleObject_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_SetMoniker_Proxy( 
-    IOleObject * This,
-     DWORD dwWhichMoniker,
-     IMoniker *pmk);
-
-
-void __stdcall IOleObject_SetMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetMoniker_Proxy( 
-    IOleObject * This,
-     DWORD dwAssign,
-     DWORD dwWhichMoniker,
-     IMoniker **ppmk);
-
-
-void __stdcall IOleObject_GetMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_InitFromData_Proxy( 
-    IOleObject * This,
-     IDataObject *pDataObject,
-     BOOL fCreation,
-     DWORD dwReserved);
-
-
-void __stdcall IOleObject_InitFromData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetClipboardData_Proxy( 
-    IOleObject * This,
-     DWORD dwReserved,
-     IDataObject **ppDataObject);
-
-
-void __stdcall IOleObject_GetClipboardData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_DoVerb_Proxy( 
-    IOleObject * This,
-     LONG iVerb,
-     LPMSG lpmsg,
-     IOleClientSite *pActiveSite,
-     LONG lindex,
-     HWND hwndParent,
-     LPCRECT lprcPosRect);
-
-
-void __stdcall IOleObject_DoVerb_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_EnumVerbs_Proxy( 
-    IOleObject * This,
-     IEnumOLEVERB **ppEnumOleVerb);
-
-
-void __stdcall IOleObject_EnumVerbs_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_Update_Proxy( 
-    IOleObject * This);
-
-
-void __stdcall IOleObject_Update_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_IsUpToDate_Proxy( 
-    IOleObject * This);
-
-
-void __stdcall IOleObject_IsUpToDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetUserClassID_Proxy( 
-    IOleObject * This,
-     CLSID *pClsid);
-
-
-void __stdcall IOleObject_GetUserClassID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetUserType_Proxy( 
-    IOleObject * This,
-     DWORD dwFormOfType,
-     LPOLESTR *pszUserType);
-
-
-void __stdcall IOleObject_GetUserType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_SetExtent_Proxy( 
-    IOleObject * This,
-     DWORD dwDrawAspect,
-     SIZEL *psizel);
-
-
-void __stdcall IOleObject_SetExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetExtent_Proxy( 
-    IOleObject * This,
-     DWORD dwDrawAspect,
-     SIZEL *psizel);
-
-
-void __stdcall IOleObject_GetExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_Advise_Proxy( 
-    IOleObject * This,
-     IAdviseSink *pAdvSink,
-     DWORD *pdwConnection);
-
-
-void __stdcall IOleObject_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_Unadvise_Proxy( 
-    IOleObject * This,
-     DWORD dwConnection);
-
-
-void __stdcall IOleObject_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_EnumAdvise_Proxy( 
-    IOleObject * This,
-     IEnumSTATDATA **ppenumAdvise);
-
-
-void __stdcall IOleObject_EnumAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetMiscStatus_Proxy( 
-    IOleObject * This,
-     DWORD dwAspect,
-     DWORD *pdwStatus);
-
-
-void __stdcall IOleObject_GetMiscStatus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_SetColorScheme_Proxy( 
-    IOleObject * This,
-     LOGPALETTE *pLogpal);
-
-
-void __stdcall IOleObject_SetColorScheme_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef 
-enum tagOLERENDER
-    {	OLERENDER_NONE	= 0,
-	OLERENDER_DRAW	= 1,
-	OLERENDER_FORMAT	= 2,
-	OLERENDER_ASIS	= 3
-    } 	OLERENDER;
-
-typedef OLERENDER *LPOLERENDER;
-
-typedef struct tagOBJECTDESCRIPTOR
-    {
-    ULONG cbSize;
-    CLSID clsid;
-    DWORD dwDrawAspect;
-    SIZEL sizel;
-    POINTL pointl;
-    DWORD dwStatus;
-    DWORD dwFullUserTypeName;
-    DWORD dwSrcOfCopy;
-    } 	OBJECTDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR *POBJECTDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR *LPOBJECTDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR LINKSRCDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR *PLINKSRCDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR *LPLINKSRCDESCRIPTOR;
-
-
-
-extern RPC_IF_HANDLE IOLETypes_v0_0_c_ifspec;
-extern RPC_IF_HANDLE IOLETypes_v0_0_s_ifspec;
-
-
-
-
-
-
- 
-
-typedef  IOleWindow *LPOLEWINDOW;
-
-
-extern "C" const IID IID_IOleWindow;
-
-
-    
-    struct __declspec(uuid("00000114-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleWindow : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall GetWindow( 
-             HWND *phwnd) = 0;
-        
-        virtual HRESULT __stdcall ContextSensitiveHelp( 
-             BOOL fEnterMode) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IOleWindow_GetWindow_Proxy( 
-    IOleWindow * This,
-     HWND *phwnd);
-
-
-void __stdcall IOleWindow_GetWindow_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleWindow_ContextSensitiveHelp_Proxy( 
-    IOleWindow * This,
-     BOOL fEnterMode);
-
-
-void __stdcall IOleWindow_ContextSensitiveHelp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleLink *LPOLELINK;
-
-typedef 
-enum tagOLEUPDATE
-    {	OLEUPDATE_ALWAYS	= 1,
-	OLEUPDATE_ONCALL	= 3
-    } 	OLEUPDATE;
-
-typedef OLEUPDATE *LPOLEUPDATE;
-
-typedef OLEUPDATE *POLEUPDATE;
-
-typedef 
-enum tagOLELINKBIND
-    {	OLELINKBIND_EVENIFCLASSDIFF	= 1
-    } 	OLELINKBIND;
-
-
-extern "C" const IID IID_IOleLink;
-
-
-    
-    struct __declspec(uuid("0000011d-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleLink : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetUpdateOptions( 
-             DWORD dwUpdateOpt) = 0;
-        
-        virtual HRESULT __stdcall GetUpdateOptions( 
-             DWORD *pdwUpdateOpt) = 0;
-        
-        virtual HRESULT __stdcall SetSourceMoniker( 
-             IMoniker *pmk,
-             const IID & rclsid) = 0;
-        
-        virtual HRESULT __stdcall GetSourceMoniker( 
-             IMoniker **ppmk) = 0;
-        
-        virtual HRESULT __stdcall SetSourceDisplayName( 
-             LPCOLESTR pszStatusText) = 0;
-        
-        virtual HRESULT __stdcall GetSourceDisplayName( 
-             LPOLESTR *ppszDisplayName) = 0;
-        
-        virtual HRESULT __stdcall BindToSource( 
-             DWORD bindflags,
-             IBindCtx *pbc) = 0;
-        
-        virtual HRESULT __stdcall BindIfRunning( void) = 0;
-        
-        virtual HRESULT __stdcall GetBoundSource( 
-             IUnknown **ppunk) = 0;
-        
-        virtual HRESULT __stdcall UnbindSource( void) = 0;
-        
-        virtual HRESULT __stdcall Update( 
-             IBindCtx *pbc) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleLink_SetUpdateOptions_Proxy( 
-    IOleLink * This,
-     DWORD dwUpdateOpt);
-
-
-void __stdcall IOleLink_SetUpdateOptions_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_GetUpdateOptions_Proxy( 
-    IOleLink * This,
-     DWORD *pdwUpdateOpt);
-
-
-void __stdcall IOleLink_GetUpdateOptions_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_SetSourceMoniker_Proxy( 
-    IOleLink * This,
-     IMoniker *pmk,
-     const IID & rclsid);
-
-
-void __stdcall IOleLink_SetSourceMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_GetSourceMoniker_Proxy( 
-    IOleLink * This,
-     IMoniker **ppmk);
-
-
-void __stdcall IOleLink_GetSourceMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_SetSourceDisplayName_Proxy( 
-    IOleLink * This,
-     LPCOLESTR pszStatusText);
-
-
-void __stdcall IOleLink_SetSourceDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_GetSourceDisplayName_Proxy( 
-    IOleLink * This,
-     LPOLESTR *ppszDisplayName);
-
-
-void __stdcall IOleLink_GetSourceDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_BindToSource_Proxy( 
-    IOleLink * This,
-     DWORD bindflags,
-     IBindCtx *pbc);
-
-
-void __stdcall IOleLink_BindToSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_BindIfRunning_Proxy( 
-    IOleLink * This);
-
-
-void __stdcall IOleLink_BindIfRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_GetBoundSource_Proxy( 
-    IOleLink * This,
-     IUnknown **ppunk);
-
-
-void __stdcall IOleLink_GetBoundSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_UnbindSource_Proxy( 
-    IOleLink * This);
-
-
-void __stdcall IOleLink_UnbindSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_Update_Proxy( 
-    IOleLink * This,
-     IBindCtx *pbc);
-
-
-void __stdcall IOleLink_Update_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleItemContainer *LPOLEITEMCONTAINER;
-
-typedef 
-enum tagBINDSPEED
-    {	BINDSPEED_INDEFINITE	= 1,
-	BINDSPEED_MODERATE	= 2,
-	BINDSPEED_IMMEDIATE	= 3
-    } 	BINDSPEED;
-
-typedef  
-enum tagOLECONTF
-    {	OLECONTF_EMBEDDINGS	= 1,
-	OLECONTF_LINKS	= 2,
-	OLECONTF_OTHERS	= 4,
-	OLECONTF_ONLYUSER	= 8,
-	OLECONTF_ONLYIFRUNNING	= 16
-    } 	OLECONTF;
-
-
-extern "C" const IID IID_IOleItemContainer;
-
-
-    
-    struct __declspec(uuid("0000011c-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleItemContainer : public IOleContainer
-    {
-    public:
-        virtual HRESULT __stdcall GetObjectW( 
-             LPOLESTR pszItem,
-             DWORD dwSpeedNeeded,
-             IBindCtx *pbc,
-             const IID & riid,
-             void **ppvObject) = 0;
-        
-        virtual HRESULT __stdcall GetObjectStorage( 
-             LPOLESTR pszItem,
-             IBindCtx *pbc,
-             const IID & riid,
-             void **ppvStorage) = 0;
-        
-        virtual HRESULT __stdcall IsRunning( 
-             LPOLESTR pszItem) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleItemContainer_GetObject_Proxy( 
-    IOleItemContainer * This,
-     LPOLESTR pszItem,
-     DWORD dwSpeedNeeded,
-     IBindCtx *pbc,
-     const IID & riid,
-     void **ppvObject);
-
-
-void __stdcall IOleItemContainer_GetObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleItemContainer_GetObjectStorage_Proxy( 
-    IOleItemContainer * This,
-     LPOLESTR pszItem,
-     IBindCtx *pbc,
-     const IID & riid,
-     void **ppvStorage);
-
-
-void __stdcall IOleItemContainer_GetObjectStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleItemContainer_IsRunning_Proxy( 
-    IOleItemContainer * This,
-     LPOLESTR pszItem);
-
-
-void __stdcall IOleItemContainer_IsRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceUIWindow *LPOLEINPLACEUIWINDOW;
-
-typedef RECT BORDERWIDTHS;
-
-typedef LPRECT LPBORDERWIDTHS;
-
-typedef LPCRECT LPCBORDERWIDTHS;
-
-
-extern "C" const IID IID_IOleInPlaceUIWindow;
-
-
-    
-    struct __declspec(uuid("00000115-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceUIWindow : public IOleWindow
-    {
-    public:
-        virtual  HRESULT __stdcall GetBorder( 
-             LPRECT lprectBorder) = 0;
-        
-        virtual  HRESULT __stdcall RequestBorderSpace( 
-             LPCBORDERWIDTHS pborderwidths) = 0;
-        
-        virtual  HRESULT __stdcall SetBorderSpace( 
-             LPCBORDERWIDTHS pborderwidths) = 0;
-        
-        virtual HRESULT __stdcall SetActiveObject( 
-             IOleInPlaceActiveObject *pActiveObject,
-             LPCOLESTR pszObjName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IOleInPlaceUIWindow_GetBorder_Proxy( 
-    IOleInPlaceUIWindow * This,
-     LPRECT lprectBorder);
-
-
-void __stdcall IOleInPlaceUIWindow_GetBorder_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceUIWindow_RequestBorderSpace_Proxy( 
-    IOleInPlaceUIWindow * This,
-     LPCBORDERWIDTHS pborderwidths);
-
-
-void __stdcall IOleInPlaceUIWindow_RequestBorderSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceUIWindow_SetBorderSpace_Proxy( 
-    IOleInPlaceUIWindow * This,
-     LPCBORDERWIDTHS pborderwidths);
-
-
-void __stdcall IOleInPlaceUIWindow_SetBorderSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceUIWindow_SetActiveObject_Proxy( 
-    IOleInPlaceUIWindow * This,
-     IOleInPlaceActiveObject *pActiveObject,
-     LPCOLESTR pszObjName);
-
-
-void __stdcall IOleInPlaceUIWindow_SetActiveObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceActiveObject *LPOLEINPLACEACTIVEOBJECT;
-
-
-extern "C" const IID IID_IOleInPlaceActiveObject;
-
-
-    
-    struct __declspec(uuid("00000117-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceActiveObject : public IOleWindow
-    {
-    public:
-        virtual  HRESULT __stdcall TranslateAcceleratorW( 
-             LPMSG lpmsg) = 0;
-        
-        virtual  HRESULT __stdcall OnFrameWindowActivate( 
-             BOOL fActivate) = 0;
-        
-        virtual  HRESULT __stdcall OnDocWindowActivate( 
-             BOOL fActivate) = 0;
-        
-        virtual  HRESULT __stdcall ResizeBorder( 
-             LPCRECT prcBorder,
-             IOleInPlaceUIWindow *pUIWindow,
-             BOOL fFrameWindow) = 0;
-        
-        virtual HRESULT __stdcall EnableModeless( 
-             BOOL fEnable) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_RemoteTranslateAccelerator_Proxy( 
-    IOleInPlaceActiveObject * This);
-
-
-void __stdcall IOleInPlaceActiveObject_RemoteTranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_OnFrameWindowActivate_Proxy( 
-    IOleInPlaceActiveObject * This,
-     BOOL fActivate);
-
-
-void __stdcall IOleInPlaceActiveObject_OnFrameWindowActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_OnDocWindowActivate_Proxy( 
-    IOleInPlaceActiveObject * This,
-     BOOL fActivate);
-
-
-void __stdcall IOleInPlaceActiveObject_OnDocWindowActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_RemoteResizeBorder_Proxy( 
-    IOleInPlaceActiveObject * This,
-     LPCRECT prcBorder,
-     const IID & riid,
-     IOleInPlaceUIWindow *pUIWindow,
-     BOOL fFrameWindow);
-
-
-void __stdcall IOleInPlaceActiveObject_RemoteResizeBorder_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceActiveObject_EnableModeless_Proxy( 
-    IOleInPlaceActiveObject * This,
-     BOOL fEnable);
-
-
-void __stdcall IOleInPlaceActiveObject_EnableModeless_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceFrame *LPOLEINPLACEFRAME;
-
-typedef struct tagOIFI
-    {
-    UINT cb;
-    BOOL fMDIApp;
-    HWND hwndFrame;
-    HACCEL haccel;
-    UINT cAccelEntries;
-    } 	OLEINPLACEFRAMEINFO;
-
-typedef struct tagOIFI *LPOLEINPLACEFRAMEINFO;
-
-typedef struct tagOleMenuGroupWidths
-    {
-    LONG width[ 6 ];
-    } 	OLEMENUGROUPWIDTHS;
-
-typedef struct tagOleMenuGroupWidths *LPOLEMENUGROUPWIDTHS;
-
-typedef HGLOBAL HOLEMENU;
-
-
-extern "C" const IID IID_IOleInPlaceFrame;
-
-
-    
-    struct __declspec(uuid("00000116-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceFrame : public IOleInPlaceUIWindow
-    {
-    public:
-        virtual HRESULT __stdcall InsertMenus( 
-             HMENU hmenuShared,
-             LPOLEMENUGROUPWIDTHS lpMenuWidths) = 0;
-        
-        virtual  HRESULT __stdcall SetMenu( 
-             HMENU hmenuShared,
-             HOLEMENU holemenu,
-             HWND hwndActiveObject) = 0;
-        
-        virtual HRESULT __stdcall RemoveMenus( 
-             HMENU hmenuShared) = 0;
-        
-        virtual  HRESULT __stdcall SetStatusText( 
-             LPCOLESTR pszStatusText) = 0;
-        
-        virtual HRESULT __stdcall EnableModeless( 
-             BOOL fEnable) = 0;
-        
-        virtual HRESULT __stdcall TranslateAcceleratorW( 
-             LPMSG lpmsg,
-             WORD wID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceFrame_InsertMenus_Proxy( 
-    IOleInPlaceFrame * This,
-     HMENU hmenuShared,
-     LPOLEMENUGROUPWIDTHS lpMenuWidths);
-
-
-void __stdcall IOleInPlaceFrame_InsertMenus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceFrame_SetMenu_Proxy( 
-    IOleInPlaceFrame * This,
-     HMENU hmenuShared,
-     HOLEMENU holemenu,
-     HWND hwndActiveObject);
-
-
-void __stdcall IOleInPlaceFrame_SetMenu_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceFrame_RemoveMenus_Proxy( 
-    IOleInPlaceFrame * This,
-     HMENU hmenuShared);
-
-
-void __stdcall IOleInPlaceFrame_RemoveMenus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceFrame_SetStatusText_Proxy( 
-    IOleInPlaceFrame * This,
-     LPCOLESTR pszStatusText);
-
-
-void __stdcall IOleInPlaceFrame_SetStatusText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceFrame_EnableModeless_Proxy( 
-    IOleInPlaceFrame * This,
-     BOOL fEnable);
-
-
-void __stdcall IOleInPlaceFrame_EnableModeless_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceFrame_TranslateAccelerator_Proxy( 
-    IOleInPlaceFrame * This,
-     LPMSG lpmsg,
-     WORD wID);
-
-
-void __stdcall IOleInPlaceFrame_TranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceObject *LPOLEINPLACEOBJECT;
-
-
-extern "C" const IID IID_IOleInPlaceObject;
-
-
-    
-    struct __declspec(uuid("00000113-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceObject : public IOleWindow
-    {
-    public:
-        virtual HRESULT __stdcall InPlaceDeactivate( void) = 0;
-        
-        virtual HRESULT __stdcall UIDeactivate( void) = 0;
-        
-        virtual  HRESULT __stdcall SetObjectRects( 
-             LPCRECT lprcPosRect,
-             LPCRECT lprcClipRect) = 0;
-        
-        virtual HRESULT __stdcall ReactivateAndUndo( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceObject_InPlaceDeactivate_Proxy( 
-    IOleInPlaceObject * This);
-
-
-void __stdcall IOleInPlaceObject_InPlaceDeactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceObject_UIDeactivate_Proxy( 
-    IOleInPlaceObject * This);
-
-
-void __stdcall IOleInPlaceObject_UIDeactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceObject_SetObjectRects_Proxy( 
-    IOleInPlaceObject * This,
-     LPCRECT lprcPosRect,
-     LPCRECT lprcClipRect);
-
-
-void __stdcall IOleInPlaceObject_SetObjectRects_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceObject_ReactivateAndUndo_Proxy( 
-    IOleInPlaceObject * This);
-
-
-void __stdcall IOleInPlaceObject_ReactivateAndUndo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceSite *LPOLEINPLACESITE;
-
-
-extern "C" const IID IID_IOleInPlaceSite;
-
-
-    
-    struct __declspec(uuid("00000119-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceSite : public IOleWindow
-    {
-    public:
-        virtual HRESULT __stdcall CanInPlaceActivate( void) = 0;
-        
-        virtual HRESULT __stdcall OnInPlaceActivate( void) = 0;
-        
-        virtual HRESULT __stdcall OnUIActivate( void) = 0;
-        
-        virtual HRESULT __stdcall GetWindowContext( 
-             IOleInPlaceFrame **ppFrame,
-             IOleInPlaceUIWindow **ppDoc,
-             LPRECT lprcPosRect,
-             LPRECT lprcClipRect,
-             LPOLEINPLACEFRAMEINFO lpFrameInfo) = 0;
-        
-        virtual HRESULT __stdcall Scroll( 
-             SIZE scrollExtant) = 0;
-        
-        virtual HRESULT __stdcall OnUIDeactivate( 
-             BOOL fUndoable) = 0;
-        
-        virtual HRESULT __stdcall OnInPlaceDeactivate( void) = 0;
-        
-        virtual HRESULT __stdcall DiscardUndoState( void) = 0;
-        
-        virtual HRESULT __stdcall DeactivateAndUndo( void) = 0;
-        
-        virtual HRESULT __stdcall OnPosRectChange( 
-             LPCRECT lprcPosRect) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceSite_CanInPlaceActivate_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_CanInPlaceActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnInPlaceActivate_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_OnInPlaceActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnUIActivate_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_OnUIActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_GetWindowContext_Proxy( 
-    IOleInPlaceSite * This,
-     IOleInPlaceFrame **ppFrame,
-     IOleInPlaceUIWindow **ppDoc,
-     LPRECT lprcPosRect,
-     LPRECT lprcClipRect,
-     LPOLEINPLACEFRAMEINFO lpFrameInfo);
-
-
-void __stdcall IOleInPlaceSite_GetWindowContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_Scroll_Proxy( 
-    IOleInPlaceSite * This,
-     SIZE scrollExtant);
-
-
-void __stdcall IOleInPlaceSite_Scroll_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnUIDeactivate_Proxy( 
-    IOleInPlaceSite * This,
-     BOOL fUndoable);
-
-
-void __stdcall IOleInPlaceSite_OnUIDeactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnInPlaceDeactivate_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_OnInPlaceDeactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_DiscardUndoState_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_DiscardUndoState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_DeactivateAndUndo_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_DeactivateAndUndo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnPosRectChange_Proxy( 
-    IOleInPlaceSite * This,
-     LPCRECT lprcPosRect);
-
-
-void __stdcall IOleInPlaceSite_OnPosRectChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IContinue;
-
-
-    
-    struct __declspec(uuid("0000012a-0000-0000-C000-000000000046")) __declspec(novtable)
-    IContinue : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall FContinue( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IContinue_FContinue_Proxy( 
-    IContinue * This);
-
-
-void __stdcall IContinue_FContinue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IViewObject *LPVIEWOBJECT;
-
-
-extern "C" const IID IID_IViewObject;
-
-
-    
-    struct __declspec(uuid("0000010d-0000-0000-C000-000000000046")) __declspec(novtable)
-    IViewObject : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Draw( 
-             DWORD dwDrawAspect,
-             LONG lindex,
-             void *pvAspect,
-             DVTARGETDEVICE *ptd,
-             HDC hdcTargetDev,
-             HDC hdcDraw,
-             LPCRECTL lprcBounds,
-             LPCRECTL lprcWBounds,
-             BOOL ( __stdcall *pfnContinue )( 
-                ULONG_PTR dwContinue),
-             ULONG_PTR dwContinue) = 0;
-        
-        virtual  HRESULT __stdcall GetColorSet( 
-             DWORD dwDrawAspect,
-             LONG lindex,
-             void *pvAspect,
-             DVTARGETDEVICE *ptd,
-             HDC hicTargetDev,
-             LOGPALETTE **ppColorSet) = 0;
-        
-        virtual  HRESULT __stdcall Freeze( 
-             DWORD dwDrawAspect,
-             LONG lindex,
-             void *pvAspect,
-             DWORD *pdwFreeze) = 0;
-        
-        virtual HRESULT __stdcall Unfreeze( 
-             DWORD dwFreeze) = 0;
-        
-        virtual HRESULT __stdcall SetAdvise( 
-             DWORD aspects,
-             DWORD advf,
-             IAdviseSink *pAdvSink) = 0;
-        
-        virtual  HRESULT __stdcall GetAdvise( 
-             DWORD *pAspects,
-             DWORD *pAdvf,
-             IAdviseSink **ppAdvSink) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IViewObject_RemoteDraw_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DVTARGETDEVICE *ptd,
-     ULONG_PTR hdcTargetDev,
-     ULONG_PTR hdcDraw,
-     LPCRECTL lprcBounds,
-     LPCRECTL lprcWBounds,
-     IContinue *pContinue);
-
-
-void __stdcall IViewObject_RemoteDraw_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IViewObject_RemoteGetColorSet_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DVTARGETDEVICE *ptd,
-     ULONG_PTR hicTargetDev,
-     LOGPALETTE **ppColorSet);
-
-
-void __stdcall IViewObject_RemoteGetColorSet_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IViewObject_RemoteFreeze_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DWORD *pdwFreeze);
-
-
-void __stdcall IViewObject_RemoteFreeze_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObject_Unfreeze_Proxy( 
-    IViewObject * This,
-     DWORD dwFreeze);
-
-
-void __stdcall IViewObject_Unfreeze_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObject_SetAdvise_Proxy( 
-    IViewObject * This,
-     DWORD aspects,
-     DWORD advf,
-     IAdviseSink *pAdvSink);
-
-
-void __stdcall IViewObject_SetAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IViewObject_RemoteGetAdvise_Proxy( 
-    IViewObject * This,
-     DWORD *pAspects,
-     DWORD *pAdvf,
-     IAdviseSink **ppAdvSink);
-
-
-void __stdcall IViewObject_RemoteGetAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IViewObject2 *LPVIEWOBJECT2;
-
-
-extern "C" const IID IID_IViewObject2;
-
-
-    
-    struct __declspec(uuid("00000127-0000-0000-C000-000000000046")) __declspec(novtable)
-    IViewObject2 : public IViewObject
-    {
-    public:
-        virtual HRESULT __stdcall GetExtent( 
-             DWORD dwDrawAspect,
-             LONG lindex,
-             DVTARGETDEVICE *ptd,
-             LPSIZEL lpsizel) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IViewObject2_GetExtent_Proxy( 
-    IViewObject2 * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     DVTARGETDEVICE *ptd,
-     LPSIZEL lpsizel);
-
-
-void __stdcall IViewObject2_GetExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDropSource *LPDROPSOURCE;
-
-
-extern "C" const IID IID_IDropSource;
-
-
-    
-    struct __declspec(uuid("00000121-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDropSource : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryContinueDrag( 
-             BOOL fEscapePressed,
-             DWORD grfKeyState) = 0;
-        
-        virtual HRESULT __stdcall GiveFeedback( 
-             DWORD dwEffect) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDropSource_QueryContinueDrag_Proxy( 
-    IDropSource * This,
-     BOOL fEscapePressed,
-     DWORD grfKeyState);
-
-
-void __stdcall IDropSource_QueryContinueDrag_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDropSource_GiveFeedback_Proxy( 
-    IDropSource * This,
-     DWORD dwEffect);
-
-
-void __stdcall IDropSource_GiveFeedback_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDropTarget *LPDROPTARGET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IDropTarget;
-
-
-    
-    struct __declspec(uuid("00000122-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDropTarget : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall DragEnter( 
-             IDataObject *pDataObj,
-             DWORD grfKeyState,
-             POINTL pt,
-             DWORD *pdwEffect) = 0;
-        
-        virtual HRESULT __stdcall DragOver( 
-             DWORD grfKeyState,
-             POINTL pt,
-             DWORD *pdwEffect) = 0;
-        
-        virtual HRESULT __stdcall DragLeave( void) = 0;
-        
-        virtual HRESULT __stdcall Drop( 
-             IDataObject *pDataObj,
-             DWORD grfKeyState,
-             POINTL pt,
-             DWORD *pdwEffect) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDropTarget_DragEnter_Proxy( 
-    IDropTarget * This,
-     IDataObject *pDataObj,
-     DWORD grfKeyState,
-     POINTL pt,
-     DWORD *pdwEffect);
-
-
-void __stdcall IDropTarget_DragEnter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDropTarget_DragOver_Proxy( 
-    IDropTarget * This,
-     DWORD grfKeyState,
-     POINTL pt,
-     DWORD *pdwEffect);
-
-
-void __stdcall IDropTarget_DragOver_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDropTarget_DragLeave_Proxy( 
-    IDropTarget * This);
-
-
-void __stdcall IDropTarget_DragLeave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDropTarget_Drop_Proxy( 
-    IDropTarget * This,
-     IDataObject *pDataObj,
-     DWORD grfKeyState,
-     POINTL pt,
-     DWORD *pdwEffect);
-
-
-void __stdcall IDropTarget_Drop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumOLEVERB *LPENUMOLEVERB;
-
-typedef struct tagOLEVERB
-    {
-    LONG lVerb;
-    LPOLESTR lpszVerbName;
-    DWORD fuFlags;
-    DWORD grfAttribs;
-    } 	OLEVERB;
-
-typedef struct tagOLEVERB *LPOLEVERB;
-
-typedef  
-enum tagOLEVERBATTRIB
-    {	OLEVERBATTRIB_NEVERDIRTIES	= 1,
-	OLEVERBATTRIB_ONCONTAINERMENU	= 2
-    } 	OLEVERBATTRIB;
-
-
-extern "C" const IID IID_IEnumOLEVERB;
-
-
-    
-    struct __declspec(uuid("00000104-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumOLEVERB : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             LPOLEVERB rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumOLEVERB **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumOLEVERB_RemoteNext_Proxy( 
-    IEnumOLEVERB * This,
-     ULONG celt,
-     LPOLEVERB rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumOLEVERB_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOLEVERB_Skip_Proxy( 
-    IEnumOLEVERB * This,
-     ULONG celt);
-
-
-void __stdcall IEnumOLEVERB_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOLEVERB_Reset_Proxy( 
-    IEnumOLEVERB * This);
-
-
-void __stdcall IEnumOLEVERB_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOLEVERB_Clone_Proxy( 
-    IEnumOLEVERB * This,
-     IEnumOLEVERB **ppenum);
-
-
-void __stdcall IEnumOLEVERB_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
-void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 
-
-unsigned long             __stdcall  HACCEL_UserSize(     unsigned long *, unsigned long            , HACCEL * ); 
-unsigned char * __stdcall  HACCEL_UserMarshal(  unsigned long *, unsigned char *, HACCEL * ); 
-unsigned char * __stdcall  HACCEL_UserUnmarshal(unsigned long *, unsigned char *, HACCEL * ); 
-void                      __stdcall  HACCEL_UserFree(     unsigned long *, HACCEL * ); 
-
-unsigned long             __stdcall  HGLOBAL_UserSize(     unsigned long *, unsigned long            , HGLOBAL * ); 
-unsigned char * __stdcall  HGLOBAL_UserMarshal(  unsigned long *, unsigned char *, HGLOBAL * ); 
-unsigned char * __stdcall  HGLOBAL_UserUnmarshal(unsigned long *, unsigned char *, HGLOBAL * ); 
-void                      __stdcall  HGLOBAL_UserFree(     unsigned long *, HGLOBAL * ); 
-
-unsigned long             __stdcall  HMENU_UserSize(     unsigned long *, unsigned long            , HMENU * ); 
-unsigned char * __stdcall  HMENU_UserMarshal(  unsigned long *, unsigned char *, HMENU * ); 
-unsigned char * __stdcall  HMENU_UserUnmarshal(unsigned long *, unsigned char *, HMENU * ); 
-void                      __stdcall  HMENU_UserFree(     unsigned long *, HMENU * ); 
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
-unsigned long             __stdcall  STGMEDIUM_UserSize(     unsigned long *, unsigned long            , STGMEDIUM * ); 
-unsigned char * __stdcall  STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, STGMEDIUM * ); 
-unsigned char * __stdcall  STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, STGMEDIUM * ); 
-void                      __stdcall  STGMEDIUM_UserFree(     unsigned long *, STGMEDIUM * ); 
-
- HRESULT __stdcall IOleCache2_UpdateCache_Proxy( 
-    IOleCache2 * This,
-     LPDATAOBJECT pDataObject,
-     DWORD grfUpdf,
-     LPVOID pReserved);
-
-
- HRESULT __stdcall IOleCache2_UpdateCache_Stub( 
-    IOleCache2 * This,
-     LPDATAOBJECT pDataObject,
-     DWORD grfUpdf,
-     LONG_PTR pReserved);
-
- HRESULT __stdcall IOleInPlaceActiveObject_TranslateAccelerator_Proxy( 
-    IOleInPlaceActiveObject * This,
-     LPMSG lpmsg);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_TranslateAccelerator_Stub( 
-    IOleInPlaceActiveObject * This);
-
- HRESULT __stdcall IOleInPlaceActiveObject_ResizeBorder_Proxy( 
-    IOleInPlaceActiveObject * This,
-     LPCRECT prcBorder,
-     IOleInPlaceUIWindow *pUIWindow,
-     BOOL fFrameWindow);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_ResizeBorder_Stub( 
-    IOleInPlaceActiveObject * This,
-     LPCRECT prcBorder,
-     const IID & riid,
-     IOleInPlaceUIWindow *pUIWindow,
-     BOOL fFrameWindow);
-
- HRESULT __stdcall IViewObject_Draw_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     void *pvAspect,
-     DVTARGETDEVICE *ptd,
-     HDC hdcTargetDev,
-     HDC hdcDraw,
-     LPCRECTL lprcBounds,
-     LPCRECTL lprcWBounds,
-     BOOL ( __stdcall *pfnContinue )( 
-        ULONG_PTR dwContinue),
-     ULONG_PTR dwContinue);
-
-
- HRESULT __stdcall IViewObject_Draw_Stub( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DVTARGETDEVICE *ptd,
-     ULONG_PTR hdcTargetDev,
-     ULONG_PTR hdcDraw,
-     LPCRECTL lprcBounds,
-     LPCRECTL lprcWBounds,
-     IContinue *pContinue);
-
- HRESULT __stdcall IViewObject_GetColorSet_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     void *pvAspect,
-     DVTARGETDEVICE *ptd,
-     HDC hicTargetDev,
-     LOGPALETTE **ppColorSet);
-
-
- HRESULT __stdcall IViewObject_GetColorSet_Stub( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DVTARGETDEVICE *ptd,
-     ULONG_PTR hicTargetDev,
-     LOGPALETTE **ppColorSet);
-
- HRESULT __stdcall IViewObject_Freeze_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     void *pvAspect,
-     DWORD *pdwFreeze);
-
-
- HRESULT __stdcall IViewObject_Freeze_Stub( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DWORD *pdwFreeze);
-
- HRESULT __stdcall IViewObject_GetAdvise_Proxy( 
-    IViewObject * This,
-     DWORD *pAspects,
-     DWORD *pAdvf,
-     IAdviseSink **ppAdvSink);
-
-
- HRESULT __stdcall IViewObject_GetAdvise_Stub( 
-    IViewObject * This,
-     DWORD *pAspects,
-     DWORD *pAdvf,
-     IAdviseSink **ppAdvSink);
-
- HRESULT __stdcall IEnumOLEVERB_Next_Proxy( 
-    IEnumOLEVERB * This,
-     ULONG celt,
-     LPOLEVERB rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumOLEVERB_Next_Stub( 
-    IEnumOLEVERB * This,
-     ULONG celt,
-     LPOLEVERB rgelt,
-     ULONG *pceltFetched);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IServiceProvider IServiceProvider;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(lib,"uuid.lib")
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_servprov_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_servprov_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IServiceProvider *LPSERVICEPROVIDER;
-
-
-    extern "C" const IID IID_IServiceProvider;
-    extern "C++"
-    {
-        struct __declspec(uuid("6d5140c1-7436-11ce-8034-00aa006009fa")) __declspec(novtable)
-        IServiceProvider : public IUnknown
-        {
-        public:
-            virtual  HRESULT __stdcall QueryService( 
-                 const GUID & guidService,
-                 const IID & riid,
-                 void  * *ppvObject) = 0;
-            
-            template <class Q>
-            HRESULT __stdcall QueryService(const GUID & guidService, Q** pp)
-            {
-                return QueryService(guidService, __uuidof(Q), (void **)pp);
-            }
-        };
-    }
-
-     HRESULT __stdcall IServiceProvider_RemoteQueryService_Proxy( 
-        IServiceProvider  * This,
-         const GUID & guidService,
-         const IID & riid,
-         IUnknown  * *ppvObject);
-
-    void __stdcall IServiceProvider_RemoteQueryService_Stub(
-        IRpcStubBuffer *This,
-        IRpcChannelBuffer *_pRpcChannelBuffer,
-        PRPC_MESSAGE _pRpcMessage,
-        DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_servprov_0093_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_servprov_0093_v0_0_s_ifspec;
-
-
-
- HRESULT __stdcall IServiceProvider_QueryService_Proxy( 
-    IServiceProvider * This,
-     const GUID & guidService,
-     const IID & riid,
-     void **ppvObject);
-
-
- HRESULT __stdcall IServiceProvider_QueryService_Stub( 
-    IServiceProvider * This,
-     const GUID & guidService,
-     const IID & riid,
-     IUnknown **ppvObject);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IXMLDOMImplementation IXMLDOMImplementation;
-
-
-
-
-
-typedef struct IXMLDOMNode IXMLDOMNode;
-
-
-
-
-
-typedef struct IXMLDOMDocumentFragment IXMLDOMDocumentFragment;
-
-
-
-
-
-typedef struct IXMLDOMDocument IXMLDOMDocument;
-
-
-
-
-
-typedef struct IXMLDOMNodeList IXMLDOMNodeList;
-
-
-
-
-
-typedef struct IXMLDOMNamedNodeMap IXMLDOMNamedNodeMap;
-
-
-
-
-
-typedef struct IXMLDOMCharacterData IXMLDOMCharacterData;
-
-
-
-
-
-typedef struct IXMLDOMAttribute IXMLDOMAttribute;
-
-
-
-
-
-typedef struct IXMLDOMElement IXMLDOMElement;
-
-
-
-
-
-typedef struct IXMLDOMText IXMLDOMText;
-
-
-
-
-
-typedef struct IXMLDOMComment IXMLDOMComment;
-
-
-
-
-
-typedef struct IXMLDOMProcessingInstruction IXMLDOMProcessingInstruction;
-
-
-
-
-
-typedef struct IXMLDOMCDATASection IXMLDOMCDATASection;
-
-
-
-
-
-typedef struct IXMLDOMDocumentType IXMLDOMDocumentType;
-
-
-
-
-
-typedef struct IXMLDOMNotation IXMLDOMNotation;
-
-
-
-
-
-typedef struct IXMLDOMEntity IXMLDOMEntity;
-
-
-
-
-
-typedef struct IXMLDOMEntityReference IXMLDOMEntityReference;
-
-
-
-
-
-typedef struct IXMLDOMParseError IXMLDOMParseError;
-
-
-
-
-
-typedef struct IXTLRuntime IXTLRuntime;
-
-
-
-
-
-typedef struct XMLDOMDocumentEvents XMLDOMDocumentEvents;
-
-
-
-
-
-
-
-typedef class DOMDocument DOMDocument;
-
-
-
-
-
-
-
-
-
-
-
-typedef class DOMFreeThreadedDocument DOMFreeThreadedDocument;
-
-
-
-
-
-
-
-
-
-typedef struct IXMLHttpRequest IXMLHttpRequest;
-
-
-
-
-
-
-
-typedef class XMLHTTPRequest XMLHTTPRequest;
-
-
-
-
-
-
-
-
-
-typedef struct IXMLDSOControl IXMLDSOControl;
-
-
-
-
-
-
-
-typedef class XMLDSOControl XMLDSOControl;
-
-
-
-
-
-
-
-
-
-typedef struct IXMLElementCollection IXMLElementCollection;
-
-
-
-
-
-typedef struct IXMLDocument IXMLDocument;
-
-
-
-
-
-typedef struct IXMLDocument2 IXMLDocument2;
-
-
-
-
-
-typedef struct IXMLElement IXMLElement;
-
-
-
-
-
-typedef struct IXMLElement2 IXMLElement2;
-
-
-
-
-
-typedef struct IXMLAttribute IXMLAttribute;
-
-
-
-
-
-typedef struct IXMLError IXMLError;
-
-
-
-
-
-
-
-typedef class XMLDocument XMLDocument;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct ICreateTypeInfo ICreateTypeInfo;
-
-
-
-
-
-typedef struct ICreateTypeInfo2 ICreateTypeInfo2;
-
-
-
-
-
-typedef struct ICreateTypeLib ICreateTypeLib;
-
-
-
-
-
-typedef struct ICreateTypeLib2 ICreateTypeLib2;
-
-
-
-
-
-typedef struct IDispatch IDispatch;
-
-
-
-
-
-typedef struct IEnumVARIANT IEnumVARIANT;
-
-
-
-
-
-typedef struct ITypeComp ITypeComp;
-
-
-
-
-
-typedef struct ITypeInfo ITypeInfo;
-
-
-
-
-
-typedef struct ITypeInfo2 ITypeInfo2;
-
-
-
-
-
-typedef struct ITypeLib ITypeLib;
-
-
-
-
-
-typedef struct ITypeLib2 ITypeLib2;
-
-
-
-
-
-typedef struct ITypeChangeEvents ITypeChangeEvents;
-
-
-
-
-
-typedef struct IErrorInfo IErrorInfo;
-
-
-
-
-
-typedef struct ICreateErrorInfo ICreateErrorInfo;
-
-
-
-
-
-typedef struct ISupportErrorInfo ISupportErrorInfo;
-
-
-
-
-
-typedef struct ITypeFactory ITypeFactory;
-
-
-
-
-
-typedef struct ITypeMarshal ITypeMarshal;
-
-
-
-
-
-typedef struct IRecordInfo IRecordInfo;
-
-
-
-
-
-typedef struct IErrorLog IErrorLog;
-
-
-
-
-
-typedef struct IPropertyBag IPropertyBag;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)    
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oaidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oaidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef CY CURRENCY;
-
-typedef struct tagSAFEARRAYBOUND
-    {
-    ULONG cElements;
-    LONG lLbound;
-    } 	SAFEARRAYBOUND;
-
-typedef struct tagSAFEARRAYBOUND *LPSAFEARRAYBOUND;
-
-
-typedef  struct _wireVARIANT *wireVARIANT;
-
-typedef  struct _wireBRECORD *wireBRECORD;
-
-typedef struct _wireSAFEARR_BSTR
-    {
-    ULONG Size;
-     wireBSTR *aBstr;
-    } 	SAFEARR_BSTR;
-
-typedef struct _wireSAFEARR_UNKNOWN
-    {
-    ULONG Size;
-     IUnknown **apUnknown;
-    } 	SAFEARR_UNKNOWN;
-
-typedef struct _wireSAFEARR_DISPATCH
-    {
-    ULONG Size;
-     IDispatch **apDispatch;
-    } 	SAFEARR_DISPATCH;
-
-typedef struct _wireSAFEARR_VARIANT
-    {
-    ULONG Size;
-     wireVARIANT *aVariant;
-    } 	SAFEARR_VARIANT;
-
-typedef struct _wireSAFEARR_BRECORD
-    {
-    ULONG Size;
-     wireBRECORD *aRecord;
-    } 	SAFEARR_BRECORD;
-
-typedef struct _wireSAFEARR_HAVEIID
-    {
-    ULONG Size;
-     IUnknown **apUnknown;
-    IID iid;
-    } 	SAFEARR_HAVEIID;
-
-typedef  
-enum tagSF_TYPE
-    {	SF_ERROR	= VT_ERROR,
-	SF_I1	= VT_I1,
-	SF_I2	= VT_I2,
-	SF_I4	= VT_I4,
-	SF_I8	= VT_I8,
-	SF_BSTR	= VT_BSTR,
-	SF_UNKNOWN	= VT_UNKNOWN,
-	SF_DISPATCH	= VT_DISPATCH,
-	SF_VARIANT	= VT_VARIANT,
-	SF_RECORD	= VT_RECORD,
-	SF_HAVEIID	= VT_UNKNOWN | VT_RESERVED
-    } 	SF_TYPE;
-
-typedef struct _wireSAFEARRAY_UNION
-    {
-    ULONG sfType;
-      union __MIDL_IOleAutomationTypes_0001
-        {
-         SAFEARR_BSTR BstrStr;
-         SAFEARR_UNKNOWN UnknownStr;
-         SAFEARR_DISPATCH DispatchStr;
-         SAFEARR_VARIANT VariantStr;
-         SAFEARR_BRECORD RecordStr;
-         SAFEARR_HAVEIID HaveIidStr;
-         BYTE_SIZEDARR ByteStr;
-         WORD_SIZEDARR WordStr;
-         DWORD_SIZEDARR LongStr;
-         HYPER_SIZEDARR HyperStr;
-        } 	u;
-    } 	SAFEARRAYUNION;
-
-typedef  struct _wireSAFEARRAY
-    {
-    USHORT cDims;
-    USHORT fFeatures;
-    ULONG cbElements;
-    ULONG cLocks;
-    SAFEARRAYUNION uArrayStructs;
-     SAFEARRAYBOUND rgsabound[ 1 ];
-    } 	*wireSAFEARRAY;
-
-typedef  wireSAFEARRAY *wirePSAFEARRAY;
-
-typedef struct tagSAFEARRAY
-    {
-    USHORT cDims;
-    USHORT fFeatures;
-    ULONG cbElements;
-    ULONG cLocks;
-    PVOID pvData;
-    SAFEARRAYBOUND rgsabound[ 1 ];
-    } 	SAFEARRAY;
-
-typedef  SAFEARRAY *LPSAFEARRAY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  struct tagVARIANT VARIANT;
-
-struct tagVARIANT
-    {
-    union 
-        {
-        struct 
-            {
-            VARTYPE vt;
-            WORD wReserved1;
-            WORD wReserved2;
-            WORD wReserved3;
-            union 
-                {
-                LONGLONG llVal;
-                LONG lVal;
-                BYTE bVal;
-                SHORT iVal;
-                FLOAT fltVal;
-                DOUBLE dblVal;
-                VARIANT_BOOL boolVal;
-                
-                SCODE scode;
-                CY cyVal;
-                DATE date;
-                BSTR bstrVal;
-                IUnknown *punkVal;
-                IDispatch *pdispVal;
-                SAFEARRAY *parray;
-                BYTE *pbVal;
-                SHORT *piVal;
-                LONG *plVal;
-                LONGLONG *pllVal;
-                FLOAT *pfltVal;
-                DOUBLE *pdblVal;
-                VARIANT_BOOL *pboolVal;
-                
-                SCODE *pscode;
-                CY *pcyVal;
-                DATE *pdate;
-                BSTR *pbstrVal;
-                IUnknown **ppunkVal;
-                IDispatch **ppdispVal;
-                SAFEARRAY **pparray;
-                VARIANT *pvarVal;
-                PVOID byref;
-                CHAR cVal;
-                USHORT uiVal;
-                ULONG ulVal;
-                ULONGLONG ullVal;
-                INT intVal;
-                UINT uintVal;
-                DECIMAL *pdecVal;
-                CHAR *pcVal;
-                USHORT *puiVal;
-                ULONG *pulVal;
-                ULONGLONG *pullVal;
-                INT *pintVal;
-                UINT *puintVal;
-                struct 
-                    {
-                    PVOID pvRecord;
-                    IRecordInfo *pRecInfo;
-                    } 	;
-                } 	;
-            } 	;
-        DECIMAL decVal;
-        } 	;
-    } ;
-typedef VARIANT *LPVARIANT;
-
-typedef VARIANT VARIANTARG;
-
-typedef VARIANT *LPVARIANTARG;
-
-
-struct _wireBRECORD
-    {
-    ULONG fFlags;
-    ULONG clSize;
-    IRecordInfo *pRecInfo;
-     byte *pRecord;
-    } ;
-struct _wireVARIANT
-    {
-    DWORD clSize;
-    DWORD rpcReserved;
-    USHORT vt;
-    USHORT wReserved1;
-    USHORT wReserved2;
-    USHORT wReserved3;
-     union 
-        {
-         LONGLONG llVal;
-         LONG lVal;
-         BYTE bVal;
-         SHORT iVal;
-         FLOAT fltVal;
-         DOUBLE dblVal;
-         VARIANT_BOOL boolVal;
-         SCODE scode;
-         CY cyVal;
-         DATE date;
-         wireBSTR bstrVal;
-         IUnknown *punkVal;
-         IDispatch *pdispVal;
-         wirePSAFEARRAY parray;
-         wireBRECORD brecVal;
-         BYTE *pbVal;
-         SHORT *piVal;
-         LONG *plVal;
-         LONGLONG *pllVal;
-         FLOAT *pfltVal;
-         DOUBLE *pdblVal;
-         VARIANT_BOOL *pboolVal;
-         SCODE *pscode;
-         CY *pcyVal;
-         DATE *pdate;
-         wireBSTR *pbstrVal;
-         IUnknown **ppunkVal;
-         IDispatch **ppdispVal;
-         wirePSAFEARRAY *pparray;
-         wireVARIANT *pvarVal;
-         CHAR cVal;
-         USHORT uiVal;
-         ULONG ulVal;
-         ULONGLONG ullVal;
-         INT intVal;
-         UINT uintVal;
-         DECIMAL decVal;
-         DECIMAL *pdecVal;
-         CHAR *pcVal;
-         USHORT *puiVal;
-         ULONG *pulVal;
-         ULONGLONG *pullVal;
-         INT *pintVal;
-         UINT *puintVal;
-           
-           
-        } 	;
-    } ;
-typedef LONG DISPID;
-
-typedef DISPID MEMBERID;
-
-typedef DWORD HREFTYPE;
-
-typedef  
-enum tagTYPEKIND
-    {	TKIND_ENUM	= 0,
-	TKIND_RECORD	= TKIND_ENUM + 1,
-	TKIND_MODULE	= TKIND_RECORD + 1,
-	TKIND_INTERFACE	= TKIND_MODULE + 1,
-	TKIND_DISPATCH	= TKIND_INTERFACE + 1,
-	TKIND_COCLASS	= TKIND_DISPATCH + 1,
-	TKIND_ALIAS	= TKIND_COCLASS + 1,
-	TKIND_UNION	= TKIND_ALIAS + 1,
-	TKIND_MAX	= TKIND_UNION + 1
-    } 	TYPEKIND;
-
-typedef struct tagTYPEDESC
-    {
-     union 
-        {
-         struct tagTYPEDESC *lptdesc;
-         struct tagARRAYDESC *lpadesc;
-         HREFTYPE hreftype;
-           
-        } 	;
-    VARTYPE vt;
-    } 	TYPEDESC;
-
-typedef struct tagARRAYDESC
-    {
-    TYPEDESC tdescElem;
-    USHORT cDims;
-     SAFEARRAYBOUND rgbounds[ 1 ];
-    } 	ARRAYDESC;
-
-typedef struct tagPARAMDESCEX
-    {
-    ULONG cBytes;
-    VARIANTARG varDefaultValue;
-    } 	PARAMDESCEX;
-
-typedef struct tagPARAMDESCEX *LPPARAMDESCEX;
-
-typedef struct tagPARAMDESC
-    {
-    LPPARAMDESCEX pparamdescex;
-    USHORT wParamFlags;
-    } 	PARAMDESC;
-
-typedef struct tagPARAMDESC *LPPARAMDESC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagIDLDESC
-    {
-    ULONG_PTR dwReserved;
-    USHORT wIDLFlags;
-    } 	IDLDESC;
-
-typedef struct tagIDLDESC *LPIDLDESC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagELEMDESC {
-    TYPEDESC tdesc;             
-    union {
-        IDLDESC idldesc;        
-        PARAMDESC paramdesc;    
-    };
-} ELEMDESC, * LPELEMDESC;
-
-
-
-typedef struct tagTYPEATTR
-    {
-    GUID guid;
-    LCID lcid;
-    DWORD dwReserved;
-    MEMBERID memidConstructor;
-    MEMBERID memidDestructor;
-    LPOLESTR lpstrSchema;
-    ULONG cbSizeInstance;
-    TYPEKIND typekind;
-    WORD cFuncs;
-    WORD cVars;
-    WORD cImplTypes;
-    WORD cbSizeVft;
-    WORD cbAlignment;
-    WORD wTypeFlags;
-    WORD wMajorVerNum;
-    WORD wMinorVerNum;
-    TYPEDESC tdescAlias;
-    IDLDESC idldescType;
-    } 	TYPEATTR;
-
-typedef struct tagTYPEATTR *LPTYPEATTR;
-
-typedef struct tagDISPPARAMS
-    {
-     VARIANTARG *rgvarg;
-     DISPID *rgdispidNamedArgs;
-    UINT cArgs;
-    UINT cNamedArgs;
-    } 	DISPPARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagEXCEPINFO {
-    WORD  wCode;
-    WORD  wReserved;
-    BSTR  bstrSource;
-    BSTR  bstrDescription;
-    BSTR  bstrHelpFile;
-    DWORD dwHelpContext;
-    PVOID pvReserved;
-    HRESULT (__stdcall *pfnDeferredFillIn)(struct tagEXCEPINFO *);
-    SCODE scode;
-} EXCEPINFO, * LPEXCEPINFO;
-
-
-
-typedef  
-enum tagCALLCONV
-    {	CC_FASTCALL	= 0,
-	CC_CDECL	= 1,
-	CC_MSCPASCAL	= CC_CDECL + 1,
-	CC_PASCAL	= CC_MSCPASCAL,
-	CC_MACPASCAL	= CC_PASCAL + 1,
-	CC_STDCALL	= CC_MACPASCAL + 1,
-	CC_FPFASTCALL	= CC_STDCALL + 1,
-	CC_SYSCALL	= CC_FPFASTCALL + 1,
-	CC_MPWCDECL	= CC_SYSCALL + 1,
-	CC_MPWPASCAL	= CC_MPWCDECL + 1,
-	CC_MAX	= CC_MPWPASCAL + 1
-    } 	CALLCONV;
-
-typedef  
-enum tagFUNCKIND
-    {	FUNC_VIRTUAL	= 0,
-	FUNC_PUREVIRTUAL	= FUNC_VIRTUAL + 1,
-	FUNC_NONVIRTUAL	= FUNC_PUREVIRTUAL + 1,
-	FUNC_STATIC	= FUNC_NONVIRTUAL + 1,
-	FUNC_DISPATCH	= FUNC_STATIC + 1
-    } 	FUNCKIND;
-
-typedef  
-enum tagINVOKEKIND
-    {	INVOKE_FUNC	= 1,
-	INVOKE_PROPERTYGET	= 2,
-	INVOKE_PROPERTYPUT	= 4,
-	INVOKE_PROPERTYPUTREF	= 8
-    } 	INVOKEKIND;
-
-typedef struct tagFUNCDESC
-    {
-    MEMBERID memid;
-     SCODE *lprgscode;
-     ELEMDESC *lprgelemdescParam;
-    FUNCKIND funckind;
-    INVOKEKIND invkind;
-    CALLCONV callconv;
-    SHORT cParams;
-    SHORT cParamsOpt;
-    SHORT oVft;
-    SHORT cScodes;
-    ELEMDESC elemdescFunc;
-    WORD wFuncFlags;
-    } 	FUNCDESC;
-
-typedef struct tagFUNCDESC *LPFUNCDESC;
-
-typedef  
-enum tagVARKIND
-    {	VAR_PERINSTANCE	= 0,
-	VAR_STATIC	= VAR_PERINSTANCE + 1,
-	VAR_CONST	= VAR_STATIC + 1,
-	VAR_DISPATCH	= VAR_CONST + 1
-    } 	VARKIND;
-
-
-
-
-
-
-
-
-
-typedef struct tagVARDESC
-    {
-    MEMBERID memid;
-    LPOLESTR lpstrSchema;
-     union 
-        {
-         ULONG oInst;
-         VARIANT *lpvarValue;
-        } 	;
-    ELEMDESC elemdescVar;
-    WORD wVarFlags;
-    VARKIND varkind;
-    } 	VARDESC;
-
-typedef struct tagVARDESC *LPVARDESC;
-
-typedef 
-enum tagTYPEFLAGS
-    {	TYPEFLAG_FAPPOBJECT	= 0x1,
-	TYPEFLAG_FCANCREATE	= 0x2,
-	TYPEFLAG_FLICENSED	= 0x4,
-	TYPEFLAG_FPREDECLID	= 0x8,
-	TYPEFLAG_FHIDDEN	= 0x10,
-	TYPEFLAG_FCONTROL	= 0x20,
-	TYPEFLAG_FDUAL	= 0x40,
-	TYPEFLAG_FNONEXTENSIBLE	= 0x80,
-	TYPEFLAG_FOLEAUTOMATION	= 0x100,
-	TYPEFLAG_FRESTRICTED	= 0x200,
-	TYPEFLAG_FAGGREGATABLE	= 0x400,
-	TYPEFLAG_FREPLACEABLE	= 0x800,
-	TYPEFLAG_FDISPATCHABLE	= 0x1000,
-	TYPEFLAG_FREVERSEBIND	= 0x2000,
-	TYPEFLAG_FPROXY	= 0x4000
-    } 	TYPEFLAGS;
-
-typedef 
-enum tagFUNCFLAGS
-    {	FUNCFLAG_FRESTRICTED	= 0x1,
-	FUNCFLAG_FSOURCE	= 0x2,
-	FUNCFLAG_FBINDABLE	= 0x4,
-	FUNCFLAG_FREQUESTEDIT	= 0x8,
-	FUNCFLAG_FDISPLAYBIND	= 0x10,
-	FUNCFLAG_FDEFAULTBIND	= 0x20,
-	FUNCFLAG_FHIDDEN	= 0x40,
-	FUNCFLAG_FUSESGETLASTERROR	= 0x80,
-	FUNCFLAG_FDEFAULTCOLLELEM	= 0x100,
-	FUNCFLAG_FUIDEFAULT	= 0x200,
-	FUNCFLAG_FNONBROWSABLE	= 0x400,
-	FUNCFLAG_FREPLACEABLE	= 0x800,
-	FUNCFLAG_FIMMEDIATEBIND	= 0x1000
-    } 	FUNCFLAGS;
-
-typedef 
-enum tagVARFLAGS
-    {	VARFLAG_FREADONLY	= 0x1,
-	VARFLAG_FSOURCE	= 0x2,
-	VARFLAG_FBINDABLE	= 0x4,
-	VARFLAG_FREQUESTEDIT	= 0x8,
-	VARFLAG_FDISPLAYBIND	= 0x10,
-	VARFLAG_FDEFAULTBIND	= 0x20,
-	VARFLAG_FHIDDEN	= 0x40,
-	VARFLAG_FRESTRICTED	= 0x80,
-	VARFLAG_FDEFAULTCOLLELEM	= 0x100,
-	VARFLAG_FUIDEFAULT	= 0x200,
-	VARFLAG_FNONBROWSABLE	= 0x400,
-	VARFLAG_FREPLACEABLE	= 0x800,
-	VARFLAG_FIMMEDIATEBIND	= 0x1000
-    } 	VARFLAGS;
-
-typedef  struct tagCLEANLOCALSTORAGE
-    {
-    IUnknown *pInterface;
-    PVOID pStorage;
-    DWORD flags;
-    } 	CLEANLOCALSTORAGE;
-
-typedef struct tagCUSTDATAITEM
-    {
-    GUID guid;
-    VARIANTARG varValue;
-    } 	CUSTDATAITEM;
-
-typedef struct tagCUSTDATAITEM *LPCUSTDATAITEM;
-
-typedef struct tagCUSTDATA
-    {
-    DWORD cCustData;
-     LPCUSTDATAITEM prgCustData;
-    } 	CUSTDATA;
-
-typedef struct tagCUSTDATA *LPCUSTDATA;
-
-
-
-extern RPC_IF_HANDLE IOleAutomationTypes_v1_0_c_ifspec;
-extern RPC_IF_HANDLE IOleAutomationTypes_v1_0_s_ifspec;
-
-
-
-
-
-
- 
-
-typedef  ICreateTypeInfo *LPCREATETYPEINFO;
-
-
-extern "C" const IID IID_ICreateTypeInfo;
-
-
-    
-    struct __declspec(uuid("00020405-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICreateTypeInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetGuid( 
-             const GUID & guid) = 0;
-        
-        virtual HRESULT __stdcall SetTypeFlags( 
-             UINT uTypeFlags) = 0;
-        
-        virtual HRESULT __stdcall SetDocString( 
-             LPOLESTR pStrDoc) = 0;
-        
-        virtual HRESULT __stdcall SetHelpContext( 
-             DWORD dwHelpContext) = 0;
-        
-        virtual HRESULT __stdcall SetVersion( 
-             WORD wMajorVerNum,
-             WORD wMinorVerNum) = 0;
-        
-        virtual HRESULT __stdcall AddRefTypeInfo( 
-             ITypeInfo *pTInfo,
-             HREFTYPE *phRefType) = 0;
-        
-        virtual HRESULT __stdcall AddFuncDesc( 
-             UINT index,
-             FUNCDESC *pFuncDesc) = 0;
-        
-        virtual HRESULT __stdcall AddImplType( 
-             UINT index,
-             HREFTYPE hRefType) = 0;
-        
-        virtual HRESULT __stdcall SetImplTypeFlags( 
-             UINT index,
-             INT implTypeFlags) = 0;
-        
-        virtual HRESULT __stdcall SetAlignment( 
-             WORD cbAlignment) = 0;
-        
-        virtual HRESULT __stdcall SetSchema( 
-             LPOLESTR pStrSchema) = 0;
-        
-        virtual HRESULT __stdcall AddVarDesc( 
-             UINT index,
-             VARDESC *pVarDesc) = 0;
-        
-        virtual HRESULT __stdcall SetFuncAndParamNames( 
-             UINT index,
-             LPOLESTR *rgszNames,
-             UINT cNames) = 0;
-        
-        virtual HRESULT __stdcall SetVarName( 
-             UINT index,
-             LPOLESTR szName) = 0;
-        
-        virtual HRESULT __stdcall SetTypeDescAlias( 
-             TYPEDESC *pTDescAlias) = 0;
-        
-        virtual HRESULT __stdcall DefineFuncAsDllEntry( 
-             UINT index,
-             LPOLESTR szDllName,
-             LPOLESTR szProcName) = 0;
-        
-        virtual HRESULT __stdcall SetFuncDocString( 
-             UINT index,
-             LPOLESTR szDocString) = 0;
-        
-        virtual HRESULT __stdcall SetVarDocString( 
-             UINT index,
-             LPOLESTR szDocString) = 0;
-        
-        virtual HRESULT __stdcall SetFuncHelpContext( 
-             UINT index,
-             DWORD dwHelpContext) = 0;
-        
-        virtual HRESULT __stdcall SetVarHelpContext( 
-             UINT index,
-             DWORD dwHelpContext) = 0;
-        
-        virtual HRESULT __stdcall SetMops( 
-             UINT index,
-             BSTR bstrMops) = 0;
-        
-        virtual HRESULT __stdcall SetTypeIdldesc( 
-             IDLDESC *pIdlDesc) = 0;
-        
-        virtual HRESULT __stdcall LayOut( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateTypeInfo_SetGuid_Proxy( 
-    ICreateTypeInfo * This,
-     const GUID & guid);
-
-
-void __stdcall ICreateTypeInfo_SetGuid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetTypeFlags_Proxy( 
-    ICreateTypeInfo * This,
-     UINT uTypeFlags);
-
-
-void __stdcall ICreateTypeInfo_SetTypeFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetDocString_Proxy( 
-    ICreateTypeInfo * This,
-     LPOLESTR pStrDoc);
-
-
-void __stdcall ICreateTypeInfo_SetDocString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetHelpContext_Proxy( 
-    ICreateTypeInfo * This,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateTypeInfo_SetHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetVersion_Proxy( 
-    ICreateTypeInfo * This,
-     WORD wMajorVerNum,
-     WORD wMinorVerNum);
-
-
-void __stdcall ICreateTypeInfo_SetVersion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_AddRefTypeInfo_Proxy( 
-    ICreateTypeInfo * This,
-     ITypeInfo *pTInfo,
-     HREFTYPE *phRefType);
-
-
-void __stdcall ICreateTypeInfo_AddRefTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_AddFuncDesc_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     FUNCDESC *pFuncDesc);
-
-
-void __stdcall ICreateTypeInfo_AddFuncDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_AddImplType_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     HREFTYPE hRefType);
-
-
-void __stdcall ICreateTypeInfo_AddImplType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetImplTypeFlags_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     INT implTypeFlags);
-
-
-void __stdcall ICreateTypeInfo_SetImplTypeFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetAlignment_Proxy( 
-    ICreateTypeInfo * This,
-     WORD cbAlignment);
-
-
-void __stdcall ICreateTypeInfo_SetAlignment_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetSchema_Proxy( 
-    ICreateTypeInfo * This,
-     LPOLESTR pStrSchema);
-
-
-void __stdcall ICreateTypeInfo_SetSchema_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_AddVarDesc_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     VARDESC *pVarDesc);
-
-
-void __stdcall ICreateTypeInfo_AddVarDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetFuncAndParamNames_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR *rgszNames,
-     UINT cNames);
-
-
-void __stdcall ICreateTypeInfo_SetFuncAndParamNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetVarName_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR szName);
-
-
-void __stdcall ICreateTypeInfo_SetVarName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetTypeDescAlias_Proxy( 
-    ICreateTypeInfo * This,
-     TYPEDESC *pTDescAlias);
-
-
-void __stdcall ICreateTypeInfo_SetTypeDescAlias_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_DefineFuncAsDllEntry_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR szDllName,
-     LPOLESTR szProcName);
-
-
-void __stdcall ICreateTypeInfo_DefineFuncAsDllEntry_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetFuncDocString_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR szDocString);
-
-
-void __stdcall ICreateTypeInfo_SetFuncDocString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetVarDocString_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR szDocString);
-
-
-void __stdcall ICreateTypeInfo_SetVarDocString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetFuncHelpContext_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateTypeInfo_SetFuncHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetVarHelpContext_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateTypeInfo_SetVarHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetMops_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     BSTR bstrMops);
-
-
-void __stdcall ICreateTypeInfo_SetMops_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetTypeIdldesc_Proxy( 
-    ICreateTypeInfo * This,
-     IDLDESC *pIdlDesc);
-
-
-void __stdcall ICreateTypeInfo_SetTypeIdldesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_LayOut_Proxy( 
-    ICreateTypeInfo * This);
-
-
-void __stdcall ICreateTypeInfo_LayOut_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICreateTypeInfo2 *LPCREATETYPEINFO2;
-
-
-extern "C" const IID IID_ICreateTypeInfo2;
-
-
-    
-    struct __declspec(uuid("0002040E-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICreateTypeInfo2 : public ICreateTypeInfo
-    {
-    public:
-        virtual HRESULT __stdcall DeleteFuncDesc( 
-             UINT index) = 0;
-        
-        virtual HRESULT __stdcall DeleteFuncDescByMemId( 
-             MEMBERID memid,
-             INVOKEKIND invKind) = 0;
-        
-        virtual HRESULT __stdcall DeleteVarDesc( 
-             UINT index) = 0;
-        
-        virtual HRESULT __stdcall DeleteVarDescByMemId( 
-             MEMBERID memid) = 0;
-        
-        virtual HRESULT __stdcall DeleteImplType( 
-             UINT index) = 0;
-        
-        virtual HRESULT __stdcall SetCustData( 
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetFuncCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetParamCustData( 
-             UINT indexFunc,
-             UINT indexParam,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetVarCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetImplTypeCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetHelpStringContext( 
-             ULONG dwHelpStringContext) = 0;
-        
-        virtual HRESULT __stdcall SetFuncHelpStringContext( 
-             UINT index,
-             ULONG dwHelpStringContext) = 0;
-        
-        virtual HRESULT __stdcall SetVarHelpStringContext( 
-             UINT index,
-             ULONG dwHelpStringContext) = 0;
-        
-        virtual HRESULT __stdcall Invalidate( void) = 0;
-        
-        virtual HRESULT __stdcall SetName( 
-             LPOLESTR szName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteFuncDesc_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index);
-
-
-void __stdcall ICreateTypeInfo2_DeleteFuncDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteFuncDescByMemId_Proxy( 
-    ICreateTypeInfo2 * This,
-     MEMBERID memid,
-     INVOKEKIND invKind);
-
-
-void __stdcall ICreateTypeInfo2_DeleteFuncDescByMemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteVarDesc_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index);
-
-
-void __stdcall ICreateTypeInfo2_DeleteVarDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteVarDescByMemId_Proxy( 
-    ICreateTypeInfo2 * This,
-     MEMBERID memid);
-
-
-void __stdcall ICreateTypeInfo2_DeleteVarDescByMemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteImplType_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index);
-
-
-void __stdcall ICreateTypeInfo2_DeleteImplType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetFuncCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetFuncCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetParamCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT indexFunc,
-     UINT indexParam,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetParamCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetVarCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetVarCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetImplTypeCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetImplTypeCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetHelpStringContext_Proxy( 
-    ICreateTypeInfo2 * This,
-     ULONG dwHelpStringContext);
-
-
-void __stdcall ICreateTypeInfo2_SetHelpStringContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetFuncHelpStringContext_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     ULONG dwHelpStringContext);
-
-
-void __stdcall ICreateTypeInfo2_SetFuncHelpStringContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetVarHelpStringContext_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     ULONG dwHelpStringContext);
-
-
-void __stdcall ICreateTypeInfo2_SetVarHelpStringContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_Invalidate_Proxy( 
-    ICreateTypeInfo2 * This);
-
-
-void __stdcall ICreateTypeInfo2_Invalidate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetName_Proxy( 
-    ICreateTypeInfo2 * This,
-     LPOLESTR szName);
-
-
-void __stdcall ICreateTypeInfo2_SetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICreateTypeLib *LPCREATETYPELIB;
-
-
-extern "C" const IID IID_ICreateTypeLib;
-
-
-    
-    struct __declspec(uuid("00020406-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICreateTypeLib : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateTypeInfo( 
-             LPOLESTR szName,
-             TYPEKIND tkind,
-             ICreateTypeInfo **ppCTInfo) = 0;
-        
-        virtual HRESULT __stdcall SetName( 
-             LPOLESTR szName) = 0;
-        
-        virtual HRESULT __stdcall SetVersion( 
-             WORD wMajorVerNum,
-             WORD wMinorVerNum) = 0;
-        
-        virtual HRESULT __stdcall SetGuid( 
-             const GUID & guid) = 0;
-        
-        virtual HRESULT __stdcall SetDocString( 
-             LPOLESTR szDoc) = 0;
-        
-        virtual HRESULT __stdcall SetHelpFileName( 
-             LPOLESTR szHelpFileName) = 0;
-        
-        virtual HRESULT __stdcall SetHelpContext( 
-             DWORD dwHelpContext) = 0;
-        
-        virtual HRESULT __stdcall SetLcid( 
-             LCID lcid) = 0;
-        
-        virtual HRESULT __stdcall SetLibFlags( 
-             UINT uLibFlags) = 0;
-        
-        virtual HRESULT __stdcall SaveAllChanges( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateTypeLib_CreateTypeInfo_Proxy( 
-    ICreateTypeLib * This,
-     LPOLESTR szName,
-     TYPEKIND tkind,
-     ICreateTypeInfo **ppCTInfo);
-
-
-void __stdcall ICreateTypeLib_CreateTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetName_Proxy( 
-    ICreateTypeLib * This,
-     LPOLESTR szName);
-
-
-void __stdcall ICreateTypeLib_SetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetVersion_Proxy( 
-    ICreateTypeLib * This,
-     WORD wMajorVerNum,
-     WORD wMinorVerNum);
-
-
-void __stdcall ICreateTypeLib_SetVersion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetGuid_Proxy( 
-    ICreateTypeLib * This,
-     const GUID & guid);
-
-
-void __stdcall ICreateTypeLib_SetGuid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetDocString_Proxy( 
-    ICreateTypeLib * This,
-     LPOLESTR szDoc);
-
-
-void __stdcall ICreateTypeLib_SetDocString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetHelpFileName_Proxy( 
-    ICreateTypeLib * This,
-     LPOLESTR szHelpFileName);
-
-
-void __stdcall ICreateTypeLib_SetHelpFileName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetHelpContext_Proxy( 
-    ICreateTypeLib * This,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateTypeLib_SetHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetLcid_Proxy( 
-    ICreateTypeLib * This,
-     LCID lcid);
-
-
-void __stdcall ICreateTypeLib_SetLcid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetLibFlags_Proxy( 
-    ICreateTypeLib * This,
-     UINT uLibFlags);
-
-
-void __stdcall ICreateTypeLib_SetLibFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SaveAllChanges_Proxy( 
-    ICreateTypeLib * This);
-
-
-void __stdcall ICreateTypeLib_SaveAllChanges_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICreateTypeLib2 *LPCREATETYPELIB2;
-
-
-extern "C" const IID IID_ICreateTypeLib2;
-
-
-    
-    struct __declspec(uuid("0002040F-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICreateTypeLib2 : public ICreateTypeLib
-    {
-    public:
-        virtual HRESULT __stdcall DeleteTypeInfo( 
-             LPOLESTR szName) = 0;
-        
-        virtual HRESULT __stdcall SetCustData( 
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetHelpStringContext( 
-             ULONG dwHelpStringContext) = 0;
-        
-        virtual HRESULT __stdcall SetHelpStringDll( 
-             LPOLESTR szFileName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateTypeLib2_DeleteTypeInfo_Proxy( 
-    ICreateTypeLib2 * This,
-     LPOLESTR szName);
-
-
-void __stdcall ICreateTypeLib2_DeleteTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib2_SetCustData_Proxy( 
-    ICreateTypeLib2 * This,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeLib2_SetCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib2_SetHelpStringContext_Proxy( 
-    ICreateTypeLib2 * This,
-     ULONG dwHelpStringContext);
-
-
-void __stdcall ICreateTypeLib2_SetHelpStringContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib2_SetHelpStringDll_Proxy( 
-    ICreateTypeLib2 * This,
-     LPOLESTR szFileName);
-
-
-void __stdcall ICreateTypeLib2_SetHelpStringDll_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDispatch *LPDISPATCH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IDispatch;
-
-
-    
-    struct __declspec(uuid("00020400-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDispatch : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetTypeInfoCount( 
-             UINT *pctinfo) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfo( 
-             UINT iTInfo,
-             LCID lcid,
-             ITypeInfo **ppTInfo) = 0;
-        
-        virtual HRESULT __stdcall GetIDsOfNames( 
-             const IID & riid,
-             LPOLESTR *rgszNames,
-             UINT cNames,
-             LCID lcid,
-             DISPID *rgDispId) = 0;
-        
-        virtual  HRESULT __stdcall Invoke( 
-             DISPID dispIdMember,
-             const IID & riid,
-             LCID lcid,
-             WORD wFlags,
-             DISPPARAMS *pDispParams,
-             VARIANT *pVarResult,
-             EXCEPINFO *pExcepInfo,
-             UINT *puArgErr) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDispatch_GetTypeInfoCount_Proxy( 
-    IDispatch * This,
-     UINT *pctinfo);
-
-
-void __stdcall IDispatch_GetTypeInfoCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDispatch_GetTypeInfo_Proxy( 
-    IDispatch * This,
-     UINT iTInfo,
-     LCID lcid,
-     ITypeInfo **ppTInfo);
-
-
-void __stdcall IDispatch_GetTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDispatch_GetIDsOfNames_Proxy( 
-    IDispatch * This,
-     const IID & riid,
-     LPOLESTR *rgszNames,
-     UINT cNames,
-     LCID lcid,
-     DISPID *rgDispId);
-
-
-void __stdcall IDispatch_GetIDsOfNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IDispatch_RemoteInvoke_Proxy( 
-    IDispatch * This,
-     DISPID dispIdMember,
-     const IID & riid,
-     LCID lcid,
-     DWORD dwFlags,
-     DISPPARAMS *pDispParams,
-     VARIANT *pVarResult,
-     EXCEPINFO *pExcepInfo,
-     UINT *pArgErr,
-     UINT cVarRef,
-     UINT *rgVarRefIdx,
-     VARIANTARG *rgVarRef);
-
-
-void __stdcall IDispatch_RemoteInvoke_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumVARIANT *LPENUMVARIANT;
-
-
-extern "C" const IID IID_IEnumVARIANT;
-
-
-    
-    struct __declspec(uuid("00020404-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumVARIANT : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             VARIANT *rgVar,
-             ULONG *pCeltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumVARIANT **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumVARIANT_RemoteNext_Proxy( 
-    IEnumVARIANT * This,
-     ULONG celt,
-     VARIANT *rgVar,
-     ULONG *pCeltFetched);
-
-
-void __stdcall IEnumVARIANT_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumVARIANT_Skip_Proxy( 
-    IEnumVARIANT * This,
-     ULONG celt);
-
-
-void __stdcall IEnumVARIANT_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumVARIANT_Reset_Proxy( 
-    IEnumVARIANT * This);
-
-
-void __stdcall IEnumVARIANT_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumVARIANT_Clone_Proxy( 
-    IEnumVARIANT * This,
-     IEnumVARIANT **ppEnum);
-
-
-void __stdcall IEnumVARIANT_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeComp *LPTYPECOMP;
-
-typedef  
-enum tagDESCKIND
-    {	DESCKIND_NONE	= 0,
-	DESCKIND_FUNCDESC	= DESCKIND_NONE + 1,
-	DESCKIND_VARDESC	= DESCKIND_FUNCDESC + 1,
-	DESCKIND_TYPECOMP	= DESCKIND_VARDESC + 1,
-	DESCKIND_IMPLICITAPPOBJ	= DESCKIND_TYPECOMP + 1,
-	DESCKIND_MAX	= DESCKIND_IMPLICITAPPOBJ + 1
-    } 	DESCKIND;
-
-typedef union tagBINDPTR
-    {
-    FUNCDESC *lpfuncdesc;
-    VARDESC *lpvardesc;
-    ITypeComp *lptcomp;
-    } 	BINDPTR;
-
-typedef union tagBINDPTR *LPBINDPTR;
-
-
-extern "C" const IID IID_ITypeComp;
-
-
-    
-    struct __declspec(uuid("00020403-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeComp : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Bind( 
-             LPOLESTR szName,
-             ULONG lHashVal,
-             WORD wFlags,
-             ITypeInfo **ppTInfo,
-             DESCKIND *pDescKind,
-             BINDPTR *pBindPtr) = 0;
-        
-        virtual  HRESULT __stdcall BindType( 
-             LPOLESTR szName,
-             ULONG lHashVal,
-             ITypeInfo **ppTInfo,
-             ITypeComp **ppTComp) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ITypeComp_RemoteBind_Proxy( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     WORD wFlags,
-     ITypeInfo **ppTInfo,
-     DESCKIND *pDescKind,
-     LPFUNCDESC *ppFuncDesc,
-     LPVARDESC *ppVarDesc,
-     ITypeComp **ppTypeComp,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeComp_RemoteBind_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeComp_RemoteBindType_Proxy( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo);
-
-
-void __stdcall ITypeComp_RemoteBindType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeInfo *LPTYPEINFO;
-
-
-extern "C" const IID IID_ITypeInfo;
-
-
-    
-    struct __declspec(uuid("00020401-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeInfo : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall GetTypeAttr( 
-             TYPEATTR **ppTypeAttr) = 0;
-        
-        virtual HRESULT __stdcall GetTypeComp( 
-             ITypeComp **ppTComp) = 0;
-        
-        virtual  HRESULT __stdcall GetFuncDesc( 
-             UINT index,
-             FUNCDESC **ppFuncDesc) = 0;
-        
-        virtual  HRESULT __stdcall GetVarDesc( 
-             UINT index,
-             VARDESC **ppVarDesc) = 0;
-        
-        virtual  HRESULT __stdcall GetNames( 
-             MEMBERID memid,
-             BSTR *rgBstrNames,
-             UINT cMaxNames,
-             UINT *pcNames) = 0;
-        
-        virtual HRESULT __stdcall GetRefTypeOfImplType( 
-             UINT index,
-             HREFTYPE *pRefType) = 0;
-        
-        virtual HRESULT __stdcall GetImplTypeFlags( 
-             UINT index,
-             INT *pImplTypeFlags) = 0;
-        
-        virtual  HRESULT __stdcall GetIDsOfNames( 
-             LPOLESTR *rgszNames,
-             UINT cNames,
-             MEMBERID *pMemId) = 0;
-        
-        virtual  HRESULT __stdcall Invoke( 
-             PVOID pvInstance,
-             MEMBERID memid,
-             WORD wFlags,
-             DISPPARAMS *pDispParams,
-             VARIANT *pVarResult,
-             EXCEPINFO *pExcepInfo,
-             UINT *puArgErr) = 0;
-        
-        virtual  HRESULT __stdcall GetDocumentation( 
-             MEMBERID memid,
-             BSTR *pBstrName,
-             BSTR *pBstrDocString,
-             DWORD *pdwHelpContext,
-             BSTR *pBstrHelpFile) = 0;
-        
-        virtual  HRESULT __stdcall GetDllEntry( 
-             MEMBERID memid,
-             INVOKEKIND invKind,
-             BSTR *pBstrDllName,
-             BSTR *pBstrName,
-             WORD *pwOrdinal) = 0;
-        
-        virtual HRESULT __stdcall GetRefTypeInfo( 
-             HREFTYPE hRefType,
-             ITypeInfo **ppTInfo) = 0;
-        
-        virtual  HRESULT __stdcall AddressOfMember( 
-             MEMBERID memid,
-             INVOKEKIND invKind,
-             PVOID *ppv) = 0;
-        
-        virtual  HRESULT __stdcall CreateInstance( 
-             IUnknown *pUnkOuter,
-             const IID & riid,
-             PVOID *ppvObj) = 0;
-        
-        virtual HRESULT __stdcall GetMops( 
-             MEMBERID memid,
-             BSTR *pBstrMops) = 0;
-        
-        virtual  HRESULT __stdcall GetContainingTypeLib( 
-             ITypeLib **ppTLib,
-             UINT *pIndex) = 0;
-        
-        virtual  void __stdcall ReleaseTypeAttr( 
-             TYPEATTR *pTypeAttr) = 0;
-        
-        virtual  void __stdcall ReleaseFuncDesc( 
-             FUNCDESC *pFuncDesc) = 0;
-        
-        virtual  void __stdcall ReleaseVarDesc( 
-             VARDESC *pVarDesc) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetTypeAttr_Proxy( 
-    ITypeInfo * This,
-     LPTYPEATTR *ppTypeAttr,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeInfo_RemoteGetTypeAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetTypeComp_Proxy( 
-    ITypeInfo * This,
-     ITypeComp **ppTComp);
-
-
-void __stdcall ITypeInfo_GetTypeComp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetFuncDesc_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     LPFUNCDESC *ppFuncDesc,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeInfo_RemoteGetFuncDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetVarDesc_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     LPVARDESC *ppVarDesc,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeInfo_RemoteGetVarDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetNames_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *rgBstrNames,
-     UINT cMaxNames,
-     UINT *pcNames);
-
-
-void __stdcall ITypeInfo_RemoteGetNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetRefTypeOfImplType_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     HREFTYPE *pRefType);
-
-
-void __stdcall ITypeInfo_GetRefTypeOfImplType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetImplTypeFlags_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     INT *pImplTypeFlags);
-
-
-void __stdcall ITypeInfo_GetImplTypeFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalGetIDsOfNames_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalGetIDsOfNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalInvoke_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalInvoke_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetDocumentation_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     DWORD refPtrFlags,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
-
-void __stdcall ITypeInfo_RemoteGetDocumentation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetDllEntry_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     DWORD refPtrFlags,
-     BSTR *pBstrDllName,
-     BSTR *pBstrName,
-     WORD *pwOrdinal);
-
-
-void __stdcall ITypeInfo_RemoteGetDllEntry_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetRefTypeInfo_Proxy( 
-    ITypeInfo * This,
-     HREFTYPE hRefType,
-     ITypeInfo **ppTInfo);
-
-
-void __stdcall ITypeInfo_GetRefTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalAddressOfMember_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalAddressOfMember_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteCreateInstance_Proxy( 
-    ITypeInfo * This,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-void __stdcall ITypeInfo_RemoteCreateInstance_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetMops_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *pBstrMops);
-
-
-void __stdcall ITypeInfo_GetMops_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetContainingTypeLib_Proxy( 
-    ITypeInfo * This,
-     ITypeLib **ppTLib,
-     UINT *pIndex);
-
-
-void __stdcall ITypeInfo_RemoteGetContainingTypeLib_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalReleaseTypeAttr_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalReleaseTypeAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalReleaseFuncDesc_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalReleaseFuncDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalReleaseVarDesc_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalReleaseVarDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeInfo2 *LPTYPEINFO2;
-
-
-extern "C" const IID IID_ITypeInfo2;
-
-
-    
-    struct __declspec(uuid("00020412-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeInfo2 : public ITypeInfo
-    {
-    public:
-        virtual HRESULT __stdcall GetTypeKind( 
-             TYPEKIND *pTypeKind) = 0;
-        
-        virtual HRESULT __stdcall GetTypeFlags( 
-             ULONG *pTypeFlags) = 0;
-        
-        virtual HRESULT __stdcall GetFuncIndexOfMemId( 
-             MEMBERID memid,
-             INVOKEKIND invKind,
-             UINT *pFuncIndex) = 0;
-        
-        virtual HRESULT __stdcall GetVarIndexOfMemId( 
-             MEMBERID memid,
-             UINT *pVarIndex) = 0;
-        
-        virtual HRESULT __stdcall GetCustData( 
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall GetFuncCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall GetParamCustData( 
-             UINT indexFunc,
-             UINT indexParam,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall GetVarCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall GetImplTypeCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual  HRESULT __stdcall GetDocumentation2( 
-             MEMBERID memid,
-             LCID lcid,
-             BSTR *pbstrHelpString,
-             DWORD *pdwHelpStringContext,
-             BSTR *pbstrHelpStringDll) = 0;
-        
-        virtual HRESULT __stdcall GetAllCustData( 
-             CUSTDATA *pCustData) = 0;
-        
-        virtual HRESULT __stdcall GetAllFuncCustData( 
-             UINT index,
-             CUSTDATA *pCustData) = 0;
-        
-        virtual HRESULT __stdcall GetAllParamCustData( 
-             UINT indexFunc,
-             UINT indexParam,
-             CUSTDATA *pCustData) = 0;
-        
-        virtual HRESULT __stdcall GetAllVarCustData( 
-             UINT index,
-             CUSTDATA *pCustData) = 0;
-        
-        virtual HRESULT __stdcall GetAllImplTypeCustData( 
-             UINT index,
-             CUSTDATA *pCustData) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeInfo2_GetTypeKind_Proxy( 
-    ITypeInfo2 * This,
-     TYPEKIND *pTypeKind);
-
-
-void __stdcall ITypeInfo2_GetTypeKind_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetTypeFlags_Proxy( 
-    ITypeInfo2 * This,
-     ULONG *pTypeFlags);
-
-
-void __stdcall ITypeInfo2_GetTypeFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetFuncIndexOfMemId_Proxy( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     UINT *pFuncIndex);
-
-
-void __stdcall ITypeInfo2_GetFuncIndexOfMemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetVarIndexOfMemId_Proxy( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     UINT *pVarIndex);
-
-
-void __stdcall ITypeInfo2_GetVarIndexOfMemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetCustData_Proxy( 
-    ITypeInfo2 * This,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetFuncCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetFuncCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetParamCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT indexFunc,
-     UINT indexParam,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetParamCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetVarCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetVarCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetImplTypeCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetImplTypeCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo2_RemoteGetDocumentation2_Proxy( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     LCID lcid,
-     DWORD refPtrFlags,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
-
-void __stdcall ITypeInfo2_RemoteGetDocumentation2_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllCustData_Proxy( 
-    ITypeInfo2 * This,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllFuncCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllFuncCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllParamCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT indexFunc,
-     UINT indexParam,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllParamCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllVarCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllVarCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllImplTypeCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllImplTypeCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  
-enum tagSYSKIND
-    {	SYS_WIN16	= 0,
-	SYS_WIN32	= SYS_WIN16 + 1,
-	SYS_MAC	= SYS_WIN32 + 1,
-	SYS_WIN64	= SYS_MAC + 1
-    } 	SYSKIND;
-
-typedef  
-enum tagLIBFLAGS
-    {	LIBFLAG_FRESTRICTED	= 0x1,
-	LIBFLAG_FCONTROL	= 0x2,
-	LIBFLAG_FHIDDEN	= 0x4,
-	LIBFLAG_FHASDISKIMAGE	= 0x8
-    } 	LIBFLAGS;
-
-typedef  ITypeLib *LPTYPELIB;
-
-typedef struct tagTLIBATTR
-    {
-    GUID guid;
-    LCID lcid;
-    SYSKIND syskind;
-    WORD wMajorVerNum;
-    WORD wMinorVerNum;
-    WORD wLibFlags;
-    } 	TLIBATTR;
-
-typedef struct tagTLIBATTR *LPTLIBATTR;
-
-
-extern "C" const IID IID_ITypeLib;
-
-
-    
-    struct __declspec(uuid("00020402-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeLib : public IUnknown
-    {
-    public:
-        virtual  UINT __stdcall GetTypeInfoCount( void) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfo( 
-             UINT index,
-             ITypeInfo **ppTInfo) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfoType( 
-             UINT index,
-             TYPEKIND *pTKind) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfoOfGuid( 
-             const GUID & guid,
-             ITypeInfo **ppTinfo) = 0;
-        
-        virtual  HRESULT __stdcall GetLibAttr( 
-             TLIBATTR **ppTLibAttr) = 0;
-        
-        virtual HRESULT __stdcall GetTypeComp( 
-             ITypeComp **ppTComp) = 0;
-        
-        virtual  HRESULT __stdcall GetDocumentation( 
-             INT index,
-             BSTR *pBstrName,
-             BSTR *pBstrDocString,
-             DWORD *pdwHelpContext,
-             BSTR *pBstrHelpFile) = 0;
-        
-        virtual  HRESULT __stdcall IsName( 
-             LPOLESTR szNameBuf,
-             ULONG lHashVal,
-             BOOL *pfName) = 0;
-        
-        virtual  HRESULT __stdcall FindName( 
-             LPOLESTR szNameBuf,
-             ULONG lHashVal,
-             ITypeInfo **ppTInfo,
-             MEMBERID *rgMemId,
-             USHORT *pcFound) = 0;
-        
-        virtual  void __stdcall ReleaseTLibAttr( 
-             TLIBATTR *pTLibAttr) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ITypeLib_RemoteGetTypeInfoCount_Proxy( 
-    ITypeLib * This,
-     UINT *pcTInfo);
-
-
-void __stdcall ITypeLib_RemoteGetTypeInfoCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib_GetTypeInfo_Proxy( 
-    ITypeLib * This,
-     UINT index,
-     ITypeInfo **ppTInfo);
-
-
-void __stdcall ITypeLib_GetTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib_GetTypeInfoType_Proxy( 
-    ITypeLib * This,
-     UINT index,
-     TYPEKIND *pTKind);
-
-
-void __stdcall ITypeLib_GetTypeInfoType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib_GetTypeInfoOfGuid_Proxy( 
-    ITypeLib * This,
-     const GUID & guid,
-     ITypeInfo **ppTinfo);
-
-
-void __stdcall ITypeLib_GetTypeInfoOfGuid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_RemoteGetLibAttr_Proxy( 
-    ITypeLib * This,
-     LPTLIBATTR *ppTLibAttr,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeLib_RemoteGetLibAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib_GetTypeComp_Proxy( 
-    ITypeLib * This,
-     ITypeComp **ppTComp);
-
-
-void __stdcall ITypeLib_GetTypeComp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_RemoteGetDocumentation_Proxy( 
-    ITypeLib * This,
-     INT index,
-     DWORD refPtrFlags,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
-
-void __stdcall ITypeLib_RemoteGetDocumentation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_RemoteIsName_Proxy( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     BOOL *pfName,
-     BSTR *pBstrLibName);
-
-
-void __stdcall ITypeLib_RemoteIsName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_RemoteFindName_Proxy( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo,
-     MEMBERID *rgMemId,
-     USHORT *pcFound,
-     BSTR *pBstrLibName);
-
-
-void __stdcall ITypeLib_RemoteFindName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_LocalReleaseTLibAttr_Proxy( 
-    ITypeLib * This);
-
-
-void __stdcall ITypeLib_LocalReleaseTLibAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeLib2 *LPTYPELIB2;
-
-
-extern "C" const IID IID_ITypeLib2;
-
-
-    
-    struct __declspec(uuid("00020411-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeLib2 : public ITypeLib
-    {
-    public:
-        virtual HRESULT __stdcall GetCustData( 
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual  HRESULT __stdcall GetLibStatistics( 
-             ULONG *pcUniqueNames,
-             ULONG *pcchUniqueNames) = 0;
-        
-        virtual  HRESULT __stdcall GetDocumentation2( 
-             INT index,
-             LCID lcid,
-             BSTR *pbstrHelpString,
-             DWORD *pdwHelpStringContext,
-             BSTR *pbstrHelpStringDll) = 0;
-        
-        virtual HRESULT __stdcall GetAllCustData( 
-             CUSTDATA *pCustData) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeLib2_GetCustData_Proxy( 
-    ITypeLib2 * This,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeLib2_GetCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib2_RemoteGetLibStatistics_Proxy( 
-    ITypeLib2 * This,
-     ULONG *pcUniqueNames,
-     ULONG *pcchUniqueNames);
-
-
-void __stdcall ITypeLib2_RemoteGetLibStatistics_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib2_RemoteGetDocumentation2_Proxy( 
-    ITypeLib2 * This,
-     INT index,
-     LCID lcid,
-     DWORD refPtrFlags,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
-
-void __stdcall ITypeLib2_RemoteGetDocumentation2_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib2_GetAllCustData_Proxy( 
-    ITypeLib2 * This,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeLib2_GetAllCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeChangeEvents *LPTYPECHANGEEVENTS;
-
-typedef 
-enum tagCHANGEKIND
-    {	CHANGEKIND_ADDMEMBER	= 0,
-	CHANGEKIND_DELETEMEMBER	= CHANGEKIND_ADDMEMBER + 1,
-	CHANGEKIND_SETNAMES	= CHANGEKIND_DELETEMEMBER + 1,
-	CHANGEKIND_SETDOCUMENTATION	= CHANGEKIND_SETNAMES + 1,
-	CHANGEKIND_GENERAL	= CHANGEKIND_SETDOCUMENTATION + 1,
-	CHANGEKIND_INVALIDATE	= CHANGEKIND_GENERAL + 1,
-	CHANGEKIND_CHANGEFAILED	= CHANGEKIND_INVALIDATE + 1,
-	CHANGEKIND_MAX	= CHANGEKIND_CHANGEFAILED + 1
-    } 	CHANGEKIND;
-
-
-extern "C" const IID IID_ITypeChangeEvents;
-
-
-    
-    struct __declspec(uuid("00020410-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeChangeEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RequestTypeChange( 
-             CHANGEKIND changeKind,
-             ITypeInfo *pTInfoBefore,
-             LPOLESTR pStrName,
-             INT *pfCancel) = 0;
-        
-        virtual HRESULT __stdcall AfterTypeChange( 
-             CHANGEKIND changeKind,
-             ITypeInfo *pTInfoAfter,
-             LPOLESTR pStrName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeChangeEvents_RequestTypeChange_Proxy( 
-    ITypeChangeEvents * This,
-     CHANGEKIND changeKind,
-     ITypeInfo *pTInfoBefore,
-     LPOLESTR pStrName,
-     INT *pfCancel);
-
-
-void __stdcall ITypeChangeEvents_RequestTypeChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeChangeEvents_AfterTypeChange_Proxy( 
-    ITypeChangeEvents * This,
-     CHANGEKIND changeKind,
-     ITypeInfo *pTInfoAfter,
-     LPOLESTR pStrName);
-
-
-void __stdcall ITypeChangeEvents_AfterTypeChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IErrorInfo *LPERRORINFO;
-
-
-extern "C" const IID IID_IErrorInfo;
-
-
-    
-    struct __declspec(uuid("1CF2B120-547D-101B-8E65-08002B2BD119")) __declspec(novtable)
-    IErrorInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetGUID( 
-             GUID *pGUID) = 0;
-        
-        virtual HRESULT __stdcall GetSource( 
-             BSTR *pBstrSource) = 0;
-        
-        virtual HRESULT __stdcall GetDescription( 
-             BSTR *pBstrDescription) = 0;
-        
-        virtual HRESULT __stdcall GetHelpFile( 
-             BSTR *pBstrHelpFile) = 0;
-        
-        virtual HRESULT __stdcall GetHelpContext( 
-             DWORD *pdwHelpContext) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IErrorInfo_GetGUID_Proxy( 
-    IErrorInfo * This,
-     GUID *pGUID);
-
-
-void __stdcall IErrorInfo_GetGUID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IErrorInfo_GetSource_Proxy( 
-    IErrorInfo * This,
-     BSTR *pBstrSource);
-
-
-void __stdcall IErrorInfo_GetSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IErrorInfo_GetDescription_Proxy( 
-    IErrorInfo * This,
-     BSTR *pBstrDescription);
-
-
-void __stdcall IErrorInfo_GetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IErrorInfo_GetHelpFile_Proxy( 
-    IErrorInfo * This,
-     BSTR *pBstrHelpFile);
-
-
-void __stdcall IErrorInfo_GetHelpFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IErrorInfo_GetHelpContext_Proxy( 
-    IErrorInfo * This,
-     DWORD *pdwHelpContext);
-
-
-void __stdcall IErrorInfo_GetHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICreateErrorInfo *LPCREATEERRORINFO;
-
-
-extern "C" const IID IID_ICreateErrorInfo;
-
-
-    
-    struct __declspec(uuid("22F03340-547D-101B-8E65-08002B2BD119")) __declspec(novtable)
-    ICreateErrorInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetGUID( 
-             const GUID & rguid) = 0;
-        
-        virtual HRESULT __stdcall SetSource( 
-             LPOLESTR szSource) = 0;
-        
-        virtual HRESULT __stdcall SetDescription( 
-             LPOLESTR szDescription) = 0;
-        
-        virtual HRESULT __stdcall SetHelpFile( 
-             LPOLESTR szHelpFile) = 0;
-        
-        virtual HRESULT __stdcall SetHelpContext( 
-             DWORD dwHelpContext) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateErrorInfo_SetGUID_Proxy( 
-    ICreateErrorInfo * This,
-     const GUID & rguid);
-
-
-void __stdcall ICreateErrorInfo_SetGUID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateErrorInfo_SetSource_Proxy( 
-    ICreateErrorInfo * This,
-     LPOLESTR szSource);
-
-
-void __stdcall ICreateErrorInfo_SetSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateErrorInfo_SetDescription_Proxy( 
-    ICreateErrorInfo * This,
-     LPOLESTR szDescription);
-
-
-void __stdcall ICreateErrorInfo_SetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateErrorInfo_SetHelpFile_Proxy( 
-    ICreateErrorInfo * This,
-     LPOLESTR szHelpFile);
-
-
-void __stdcall ICreateErrorInfo_SetHelpFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateErrorInfo_SetHelpContext_Proxy( 
-    ICreateErrorInfo * This,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateErrorInfo_SetHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ISupportErrorInfo *LPSUPPORTERRORINFO;
-
-
-extern "C" const IID IID_ISupportErrorInfo;
-
-
-    
-    struct __declspec(uuid("DF0B3D60-548F-101B-8E65-08002B2BD119")) __declspec(novtable)
-    ISupportErrorInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall InterfaceSupportsErrorInfo( 
-             const IID & riid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISupportErrorInfo_InterfaceSupportsErrorInfo_Proxy( 
-    ISupportErrorInfo * This,
-     const IID & riid);
-
-
-void __stdcall ISupportErrorInfo_InterfaceSupportsErrorInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ITypeFactory;
-
-
-    
-    struct __declspec(uuid("0000002E-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeFactory : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateFromTypeInfo( 
-             ITypeInfo *pTypeInfo,
-             const IID & riid,
-             IUnknown **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeFactory_CreateFromTypeInfo_Proxy( 
-    ITypeFactory * This,
-     ITypeInfo *pTypeInfo,
-     const IID & riid,
-     IUnknown **ppv);
-
-
-void __stdcall ITypeFactory_CreateFromTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ITypeMarshal;
-
-
-    
-    struct __declspec(uuid("0000002D-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeMarshal : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Size( 
-             PVOID pvType,
-             DWORD dwDestContext,
-             PVOID pvDestContext,
-             ULONG *pSize) = 0;
-        
-        virtual HRESULT __stdcall Marshal( 
-             PVOID pvType,
-             DWORD dwDestContext,
-             PVOID pvDestContext,
-             ULONG cbBufferLength,
-             BYTE *pBuffer,
-             ULONG *pcbWritten) = 0;
-        
-        virtual HRESULT __stdcall Unmarshal( 
-             PVOID pvType,
-             DWORD dwFlags,
-             ULONG cbBufferLength,
-             BYTE *pBuffer,
-             ULONG *pcbRead) = 0;
-        
-        virtual HRESULT __stdcall Free( 
-             PVOID pvType) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeMarshal_Size_Proxy( 
-    ITypeMarshal * This,
-     PVOID pvType,
-     DWORD dwDestContext,
-     PVOID pvDestContext,
-     ULONG *pSize);
-
-
-void __stdcall ITypeMarshal_Size_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeMarshal_Marshal_Proxy( 
-    ITypeMarshal * This,
-     PVOID pvType,
-     DWORD dwDestContext,
-     PVOID pvDestContext,
-     ULONG cbBufferLength,
-     BYTE *pBuffer,
-     ULONG *pcbWritten);
-
-
-void __stdcall ITypeMarshal_Marshal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeMarshal_Unmarshal_Proxy( 
-    ITypeMarshal * This,
-     PVOID pvType,
-     DWORD dwFlags,
-     ULONG cbBufferLength,
-     BYTE *pBuffer,
-     ULONG *pcbRead);
-
-
-void __stdcall ITypeMarshal_Unmarshal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeMarshal_Free_Proxy( 
-    ITypeMarshal * This,
-     PVOID pvType);
-
-
-void __stdcall ITypeMarshal_Free_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IRecordInfo *LPRECORDINFO;
-
-
-extern "C" const IID IID_IRecordInfo;
-
-
-    
-    struct __declspec(uuid("0000002F-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRecordInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RecordInit( 
-             PVOID pvNew) = 0;
-        
-        virtual HRESULT __stdcall RecordClear( 
-             PVOID pvExisting) = 0;
-        
-        virtual HRESULT __stdcall RecordCopy( 
-             PVOID pvExisting,
-             PVOID pvNew) = 0;
-        
-        virtual HRESULT __stdcall GetGuid( 
-             GUID *pguid) = 0;
-        
-        virtual HRESULT __stdcall GetName( 
-             BSTR *pbstrName) = 0;
-        
-        virtual HRESULT __stdcall GetSize( 
-             ULONG *pcbSize) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfo( 
-             ITypeInfo **ppTypeInfo) = 0;
-        
-        virtual HRESULT __stdcall GetField( 
-             PVOID pvData,
-             LPCOLESTR szFieldName,
-             VARIANT *pvarField) = 0;
-        
-        virtual HRESULT __stdcall GetFieldNoCopy( 
-             PVOID pvData,
-             LPCOLESTR szFieldName,
-             VARIANT *pvarField,
-             PVOID *ppvDataCArray) = 0;
-        
-        virtual HRESULT __stdcall PutField( 
-             ULONG wFlags,
-             PVOID pvData,
-             LPCOLESTR szFieldName,
-             VARIANT *pvarField) = 0;
-        
-        virtual HRESULT __stdcall PutFieldNoCopy( 
-             ULONG wFlags,
-             PVOID pvData,
-             LPCOLESTR szFieldName,
-             VARIANT *pvarField) = 0;
-        
-        virtual HRESULT __stdcall GetFieldNames( 
-             ULONG *pcNames,
-             BSTR *rgBstrNames) = 0;
-        
-        virtual BOOL __stdcall IsMatchingType( 
-             IRecordInfo *pRecordInfo) = 0;
-        
-        virtual PVOID __stdcall RecordCreate( void) = 0;
-        
-        virtual HRESULT __stdcall RecordCreateCopy( 
-             PVOID pvSource,
-             PVOID *ppvDest) = 0;
-        
-        virtual HRESULT __stdcall RecordDestroy( 
-             PVOID pvRecord) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRecordInfo_RecordInit_Proxy( 
-    IRecordInfo * This,
-     PVOID pvNew);
-
-
-void __stdcall IRecordInfo_RecordInit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_RecordClear_Proxy( 
-    IRecordInfo * This,
-     PVOID pvExisting);
-
-
-void __stdcall IRecordInfo_RecordClear_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_RecordCopy_Proxy( 
-    IRecordInfo * This,
-     PVOID pvExisting,
-     PVOID pvNew);
-
-
-void __stdcall IRecordInfo_RecordCopy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetGuid_Proxy( 
-    IRecordInfo * This,
-     GUID *pguid);
-
-
-void __stdcall IRecordInfo_GetGuid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetName_Proxy( 
-    IRecordInfo * This,
-     BSTR *pbstrName);
-
-
-void __stdcall IRecordInfo_GetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetSize_Proxy( 
-    IRecordInfo * This,
-     ULONG *pcbSize);
-
-
-void __stdcall IRecordInfo_GetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetTypeInfo_Proxy( 
-    IRecordInfo * This,
-     ITypeInfo **ppTypeInfo);
-
-
-void __stdcall IRecordInfo_GetTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetField_Proxy( 
-    IRecordInfo * This,
-     PVOID pvData,
-     LPCOLESTR szFieldName,
-     VARIANT *pvarField);
-
-
-void __stdcall IRecordInfo_GetField_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetFieldNoCopy_Proxy( 
-    IRecordInfo * This,
-     PVOID pvData,
-     LPCOLESTR szFieldName,
-     VARIANT *pvarField,
-     PVOID *ppvDataCArray);
-
-
-void __stdcall IRecordInfo_GetFieldNoCopy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_PutField_Proxy( 
-    IRecordInfo * This,
-     ULONG wFlags,
-     PVOID pvData,
-     LPCOLESTR szFieldName,
-     VARIANT *pvarField);
-
-
-void __stdcall IRecordInfo_PutField_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_PutFieldNoCopy_Proxy( 
-    IRecordInfo * This,
-     ULONG wFlags,
-     PVOID pvData,
-     LPCOLESTR szFieldName,
-     VARIANT *pvarField);
-
-
-void __stdcall IRecordInfo_PutFieldNoCopy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetFieldNames_Proxy( 
-    IRecordInfo * This,
-     ULONG *pcNames,
-     BSTR *rgBstrNames);
-
-
-void __stdcall IRecordInfo_GetFieldNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-BOOL __stdcall IRecordInfo_IsMatchingType_Proxy( 
-    IRecordInfo * This,
-     IRecordInfo *pRecordInfo);
-
-
-void __stdcall IRecordInfo_IsMatchingType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-PVOID __stdcall IRecordInfo_RecordCreate_Proxy( 
-    IRecordInfo * This);
-
-
-void __stdcall IRecordInfo_RecordCreate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_RecordCreateCopy_Proxy( 
-    IRecordInfo * This,
-     PVOID pvSource,
-     PVOID *ppvDest);
-
-
-void __stdcall IRecordInfo_RecordCreateCopy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_RecordDestroy_Proxy( 
-    IRecordInfo * This,
-     PVOID pvRecord);
-
-
-void __stdcall IRecordInfo_RecordDestroy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IErrorLog *LPERRORLOG;
-
-
-extern "C" const IID IID_IErrorLog;
-
-
-    
-    struct __declspec(uuid("3127CA40-446E-11CE-8135-00AA004BB851")) __declspec(novtable)
-    IErrorLog : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AddError( 
-             LPCOLESTR pszPropName,
-             EXCEPINFO *pExcepInfo) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IErrorLog_AddError_Proxy( 
-    IErrorLog * This,
-     LPCOLESTR pszPropName,
-     EXCEPINFO *pExcepInfo);
-
-
-void __stdcall IErrorLog_AddError_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyBag *LPPROPERTYBAG;
-
-
-extern "C" const IID IID_IPropertyBag;
-
-
-    
-    struct __declspec(uuid("55272A00-42CB-11CE-8135-00AA004BB851")) __declspec(novtable)
-    IPropertyBag : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Read( 
-             LPCOLESTR pszPropName,
-             VARIANT *pVar,
-             IErrorLog *pErrorLog) = 0;
-        
-        virtual HRESULT __stdcall Write( 
-             LPCOLESTR pszPropName,
-             VARIANT *pVar) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IPropertyBag_RemoteRead_Proxy( 
-    IPropertyBag * This,
-     LPCOLESTR pszPropName,
-     VARIANT *pVar,
-     IErrorLog *pErrorLog,
-     DWORD varType,
-     IUnknown *pUnkObj);
-
-
-void __stdcall IPropertyBag_RemoteRead_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag_Write_Proxy( 
-    IPropertyBag * This,
-     LPCOLESTR pszPropName,
-     VARIANT *pVar);
-
-
-void __stdcall IPropertyBag_Write_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oaidl_0114_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oaidl_0114_v0_0_s_ifspec;
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  CLEANLOCALSTORAGE_UserSize(     unsigned long *, unsigned long            , CLEANLOCALSTORAGE * ); 
-unsigned char * __stdcall  CLEANLOCALSTORAGE_UserMarshal(  unsigned long *, unsigned char *, CLEANLOCALSTORAGE * ); 
-unsigned char * __stdcall  CLEANLOCALSTORAGE_UserUnmarshal(unsigned long *, unsigned char *, CLEANLOCALSTORAGE * ); 
-void                      __stdcall  CLEANLOCALSTORAGE_UserFree(     unsigned long *, CLEANLOCALSTORAGE * ); 
-
-unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
-void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 
-
- HRESULT __stdcall IDispatch_Invoke_Proxy( 
-    IDispatch * This,
-     DISPID dispIdMember,
-     const IID & riid,
-     LCID lcid,
-     WORD wFlags,
-     DISPPARAMS *pDispParams,
-     VARIANT *pVarResult,
-     EXCEPINFO *pExcepInfo,
-     UINT *puArgErr);
-
-
- HRESULT __stdcall IDispatch_Invoke_Stub( 
-    IDispatch * This,
-     DISPID dispIdMember,
-     const IID & riid,
-     LCID lcid,
-     DWORD dwFlags,
-     DISPPARAMS *pDispParams,
-     VARIANT *pVarResult,
-     EXCEPINFO *pExcepInfo,
-     UINT *pArgErr,
-     UINT cVarRef,
-     UINT *rgVarRefIdx,
-     VARIANTARG *rgVarRef);
-
- HRESULT __stdcall IEnumVARIANT_Next_Proxy( 
-    IEnumVARIANT * This,
-     ULONG celt,
-     VARIANT *rgVar,
-     ULONG *pCeltFetched);
-
-
- HRESULT __stdcall IEnumVARIANT_Next_Stub( 
-    IEnumVARIANT * This,
-     ULONG celt,
-     VARIANT *rgVar,
-     ULONG *pCeltFetched);
-
- HRESULT __stdcall ITypeComp_Bind_Proxy( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     WORD wFlags,
-     ITypeInfo **ppTInfo,
-     DESCKIND *pDescKind,
-     BINDPTR *pBindPtr);
-
-
- HRESULT __stdcall ITypeComp_Bind_Stub( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     WORD wFlags,
-     ITypeInfo **ppTInfo,
-     DESCKIND *pDescKind,
-     LPFUNCDESC *ppFuncDesc,
-     LPVARDESC *ppVarDesc,
-     ITypeComp **ppTypeComp,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeComp_BindType_Proxy( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo,
-     ITypeComp **ppTComp);
-
-
- HRESULT __stdcall ITypeComp_BindType_Stub( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo);
-
- HRESULT __stdcall ITypeInfo_GetTypeAttr_Proxy( 
-    ITypeInfo * This,
-     TYPEATTR **ppTypeAttr);
-
-
- HRESULT __stdcall ITypeInfo_GetTypeAttr_Stub( 
-    ITypeInfo * This,
-     LPTYPEATTR *ppTypeAttr,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeInfo_GetFuncDesc_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     FUNCDESC **ppFuncDesc);
-
-
- HRESULT __stdcall ITypeInfo_GetFuncDesc_Stub( 
-    ITypeInfo * This,
-     UINT index,
-     LPFUNCDESC *ppFuncDesc,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeInfo_GetVarDesc_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     VARDESC **ppVarDesc);
-
-
- HRESULT __stdcall ITypeInfo_GetVarDesc_Stub( 
-    ITypeInfo * This,
-     UINT index,
-     LPVARDESC *ppVarDesc,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeInfo_GetNames_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *rgBstrNames,
-     UINT cMaxNames,
-     UINT *pcNames);
-
-
- HRESULT __stdcall ITypeInfo_GetNames_Stub( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *rgBstrNames,
-     UINT cMaxNames,
-     UINT *pcNames);
-
- HRESULT __stdcall ITypeInfo_GetIDsOfNames_Proxy( 
-    ITypeInfo * This,
-     LPOLESTR *rgszNames,
-     UINT cNames,
-     MEMBERID *pMemId);
-
-
- HRESULT __stdcall ITypeInfo_GetIDsOfNames_Stub( 
-    ITypeInfo * This);
-
- HRESULT __stdcall ITypeInfo_Invoke_Proxy( 
-    ITypeInfo * This,
-     PVOID pvInstance,
-     MEMBERID memid,
-     WORD wFlags,
-     DISPPARAMS *pDispParams,
-     VARIANT *pVarResult,
-     EXCEPINFO *pExcepInfo,
-     UINT *puArgErr);
-
-
- HRESULT __stdcall ITypeInfo_Invoke_Stub( 
-    ITypeInfo * This);
-
- HRESULT __stdcall ITypeInfo_GetDocumentation_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
-
- HRESULT __stdcall ITypeInfo_GetDocumentation_Stub( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     DWORD refPtrFlags,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
- HRESULT __stdcall ITypeInfo_GetDllEntry_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     BSTR *pBstrDllName,
-     BSTR *pBstrName,
-     WORD *pwOrdinal);
-
-
- HRESULT __stdcall ITypeInfo_GetDllEntry_Stub( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     DWORD refPtrFlags,
-     BSTR *pBstrDllName,
-     BSTR *pBstrName,
-     WORD *pwOrdinal);
-
- HRESULT __stdcall ITypeInfo_AddressOfMember_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     PVOID *ppv);
-
-
- HRESULT __stdcall ITypeInfo_AddressOfMember_Stub( 
-    ITypeInfo * This);
-
- HRESULT __stdcall ITypeInfo_CreateInstance_Proxy( 
-    ITypeInfo * This,
-     IUnknown *pUnkOuter,
-     const IID & riid,
-     PVOID *ppvObj);
-
-
- HRESULT __stdcall ITypeInfo_CreateInstance_Stub( 
-    ITypeInfo * This,
-     const IID & riid,
-     IUnknown **ppvObj);
-
- HRESULT __stdcall ITypeInfo_GetContainingTypeLib_Proxy( 
-    ITypeInfo * This,
-     ITypeLib **ppTLib,
-     UINT *pIndex);
-
-
- HRESULT __stdcall ITypeInfo_GetContainingTypeLib_Stub( 
-    ITypeInfo * This,
-     ITypeLib **ppTLib,
-     UINT *pIndex);
-
- void __stdcall ITypeInfo_ReleaseTypeAttr_Proxy( 
-    ITypeInfo * This,
-     TYPEATTR *pTypeAttr);
-
-
- HRESULT __stdcall ITypeInfo_ReleaseTypeAttr_Stub( 
-    ITypeInfo * This);
-
- void __stdcall ITypeInfo_ReleaseFuncDesc_Proxy( 
-    ITypeInfo * This,
-     FUNCDESC *pFuncDesc);
-
-
- HRESULT __stdcall ITypeInfo_ReleaseFuncDesc_Stub( 
-    ITypeInfo * This);
-
- void __stdcall ITypeInfo_ReleaseVarDesc_Proxy( 
-    ITypeInfo * This,
-     VARDESC *pVarDesc);
-
-
- HRESULT __stdcall ITypeInfo_ReleaseVarDesc_Stub( 
-    ITypeInfo * This);
-
- HRESULT __stdcall ITypeInfo2_GetDocumentation2_Proxy( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     LCID lcid,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
-
- HRESULT __stdcall ITypeInfo2_GetDocumentation2_Stub( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     LCID lcid,
-     DWORD refPtrFlags,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
- UINT __stdcall ITypeLib_GetTypeInfoCount_Proxy( 
-    ITypeLib * This);
-
-
- HRESULT __stdcall ITypeLib_GetTypeInfoCount_Stub( 
-    ITypeLib * This,
-     UINT *pcTInfo);
-
- HRESULT __stdcall ITypeLib_GetLibAttr_Proxy( 
-    ITypeLib * This,
-     TLIBATTR **ppTLibAttr);
-
-
- HRESULT __stdcall ITypeLib_GetLibAttr_Stub( 
-    ITypeLib * This,
-     LPTLIBATTR *ppTLibAttr,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeLib_GetDocumentation_Proxy( 
-    ITypeLib * This,
-     INT index,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
-
- HRESULT __stdcall ITypeLib_GetDocumentation_Stub( 
-    ITypeLib * This,
-     INT index,
-     DWORD refPtrFlags,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
- HRESULT __stdcall ITypeLib_IsName_Proxy( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     BOOL *pfName);
-
-
- HRESULT __stdcall ITypeLib_IsName_Stub( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     BOOL *pfName,
-     BSTR *pBstrLibName);
-
- HRESULT __stdcall ITypeLib_FindName_Proxy( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo,
-     MEMBERID *rgMemId,
-     USHORT *pcFound);
-
-
- HRESULT __stdcall ITypeLib_FindName_Stub( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo,
-     MEMBERID *rgMemId,
-     USHORT *pcFound,
-     BSTR *pBstrLibName);
-
- void __stdcall ITypeLib_ReleaseTLibAttr_Proxy( 
-    ITypeLib * This,
-     TLIBATTR *pTLibAttr);
-
-
- HRESULT __stdcall ITypeLib_ReleaseTLibAttr_Stub( 
-    ITypeLib * This);
-
- HRESULT __stdcall ITypeLib2_GetLibStatistics_Proxy( 
-    ITypeLib2 * This,
-     ULONG *pcUniqueNames,
-     ULONG *pcchUniqueNames);
-
-
- HRESULT __stdcall ITypeLib2_GetLibStatistics_Stub( 
-    ITypeLib2 * This,
-     ULONG *pcUniqueNames,
-     ULONG *pcchUniqueNames);
-
- HRESULT __stdcall ITypeLib2_GetDocumentation2_Proxy( 
-    ITypeLib2 * This,
-     INT index,
-     LCID lcid,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
-
- HRESULT __stdcall ITypeLib2_GetDocumentation2_Stub( 
-    ITypeLib2 * This,
-     INT index,
-     LCID lcid,
-     DWORD refPtrFlags,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
- HRESULT __stdcall IPropertyBag_Read_Proxy( 
-    IPropertyBag * This,
-     LPCOLESTR pszPropName,
-     VARIANT *pVar,
-     IErrorLog *pErrorLog);
-
-
- HRESULT __stdcall IPropertyBag_Read_Stub( 
-    IPropertyBag * This,
-     LPCOLESTR pszPropName,
-     VARIANT *pVar,
-     IErrorLog *pErrorLog,
-     DWORD varType,
-     IUnknown *pUnkObj);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-typedef struct _xml_error
-    {
-    unsigned int _nLine;
-    BSTR _pchBuf;
-    unsigned int _cchBuf;
-    unsigned int _ich;
-    BSTR _pszFound;
-    BSTR _pszExpected;
-    DWORD _reserved1;
-    DWORD _reserved2;
-    } 	XML_ERROR;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_msxml_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_msxml_0000_v0_0_s_ifspec;
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  
-enum tagDOMNodeType
-    {	NODE_INVALID	= 0,
-	NODE_ELEMENT	= NODE_INVALID + 1,
-	NODE_ATTRIBUTE	= NODE_ELEMENT + 1,
-	NODE_TEXT	= NODE_ATTRIBUTE + 1,
-	NODE_CDATA_SECTION	= NODE_TEXT + 1,
-	NODE_ENTITY_REFERENCE	= NODE_CDATA_SECTION + 1,
-	NODE_ENTITY	= NODE_ENTITY_REFERENCE + 1,
-	NODE_PROCESSING_INSTRUCTION	= NODE_ENTITY + 1,
-	NODE_COMMENT	= NODE_PROCESSING_INSTRUCTION + 1,
-	NODE_DOCUMENT	= NODE_COMMENT + 1,
-	NODE_DOCUMENT_TYPE	= NODE_DOCUMENT + 1,
-	NODE_DOCUMENT_FRAGMENT	= NODE_DOCUMENT_TYPE + 1,
-	NODE_NOTATION	= NODE_DOCUMENT_FRAGMENT + 1
-    } 	DOMNodeType;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  
-enum tagXMLEMEM_TYPE
-    {	XMLELEMTYPE_ELEMENT	= 0,
-	XMLELEMTYPE_TEXT	= XMLELEMTYPE_ELEMENT + 1,
-	XMLELEMTYPE_COMMENT	= XMLELEMTYPE_TEXT + 1,
-	XMLELEMTYPE_DOCUMENT	= XMLELEMTYPE_COMMENT + 1,
-	XMLELEMTYPE_DTD	= XMLELEMTYPE_DOCUMENT + 1,
-	XMLELEMTYPE_PI	= XMLELEMTYPE_DTD + 1,
-	XMLELEMTYPE_OTHER	= XMLELEMTYPE_PI + 1
-    } 	XMLELEM_TYPE;
-
-
-extern "C" const IID LIBID_MSXML;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMImplementation;
-
-
-    
-    struct __declspec(uuid("2933BF8F-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMImplementation : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall hasFeature( 
-             BSTR feature,
-             BSTR version,
-             VARIANT_BOOL *hasFeature) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMImplementation_hasFeature_Proxy( 
-    IXMLDOMImplementation * This,
-     BSTR feature,
-     BSTR version,
-     VARIANT_BOOL *hasFeature);
-
-
-void __stdcall IXMLDOMImplementation_hasFeature_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMNode;
-
-
-    
-    struct __declspec(uuid("2933BF80-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMNode : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_nodeName( 
-             BSTR *name) = 0;
-        
-        virtual  HRESULT __stdcall get_nodeValue( 
-             VARIANT *value) = 0;
-        
-        virtual  HRESULT __stdcall put_nodeValue( 
-             VARIANT value) = 0;
-        
-        virtual  HRESULT __stdcall get_nodeType( 
-             DOMNodeType *type) = 0;
-        
-        virtual  HRESULT __stdcall get_parentNode( 
-             IXMLDOMNode **parent) = 0;
-        
-        virtual  HRESULT __stdcall get_childNodes( 
-             IXMLDOMNodeList **childList) = 0;
-        
-        virtual  HRESULT __stdcall get_firstChild( 
-             IXMLDOMNode **firstChild) = 0;
-        
-        virtual  HRESULT __stdcall get_lastChild( 
-             IXMLDOMNode **lastChild) = 0;
-        
-        virtual  HRESULT __stdcall get_previousSibling( 
-             IXMLDOMNode **previousSibling) = 0;
-        
-        virtual  HRESULT __stdcall get_nextSibling( 
-             IXMLDOMNode **nextSibling) = 0;
-        
-        virtual  HRESULT __stdcall get_attributes( 
-             IXMLDOMNamedNodeMap **attributeMap) = 0;
-        
-        virtual  HRESULT __stdcall insertBefore( 
-             IXMLDOMNode *newChild,
-             VARIANT refChild,
-             IXMLDOMNode **outNewChild) = 0;
-        
-        virtual  HRESULT __stdcall replaceChild( 
-             IXMLDOMNode *newChild,
-             IXMLDOMNode *oldChild,
-             IXMLDOMNode **outOldChild) = 0;
-        
-        virtual  HRESULT __stdcall removeChild( 
-             IXMLDOMNode *childNode,
-             IXMLDOMNode **oldChild) = 0;
-        
-        virtual  HRESULT __stdcall appendChild( 
-             IXMLDOMNode *newChild,
-             IXMLDOMNode **outNewChild) = 0;
-        
-        virtual  HRESULT __stdcall hasChildNodes( 
-             VARIANT_BOOL *hasChild) = 0;
-        
-        virtual  HRESULT __stdcall get_ownerDocument( 
-             IXMLDOMDocument **DOMDocument) = 0;
-        
-        virtual  HRESULT __stdcall cloneNode( 
-             VARIANT_BOOL deep,
-             IXMLDOMNode **cloneRoot) = 0;
-        
-        virtual  HRESULT __stdcall get_nodeTypeString( 
-             BSTR *nodeType) = 0;
-        
-        virtual  HRESULT __stdcall get_text( 
-             BSTR *text) = 0;
-        
-        virtual  HRESULT __stdcall put_text( 
-             BSTR text) = 0;
-        
-        virtual  HRESULT __stdcall get_specified( 
-             VARIANT_BOOL *isSpecified) = 0;
-        
-        virtual  HRESULT __stdcall get_definition( 
-             IXMLDOMNode **definitionNode) = 0;
-        
-        virtual  HRESULT __stdcall get_nodeTypedValue( 
-             VARIANT *typedValue) = 0;
-        
-        virtual  HRESULT __stdcall put_nodeTypedValue( 
-             VARIANT typedValue) = 0;
-        
-        virtual  HRESULT __stdcall get_dataType( 
-             VARIANT *dataTypeName) = 0;
-        
-        virtual  HRESULT __stdcall put_dataType( 
-             BSTR dataTypeName) = 0;
-        
-        virtual  HRESULT __stdcall get_xml( 
-             BSTR *xmlString) = 0;
-        
-        virtual  HRESULT __stdcall transformNode( 
-             IXMLDOMNode *stylesheet,
-             BSTR *xmlString) = 0;
-        
-        virtual  HRESULT __stdcall selectNodes( 
-             BSTR queryString,
-             IXMLDOMNodeList **resultList) = 0;
-        
-        virtual  HRESULT __stdcall selectSingleNode( 
-             BSTR queryString,
-             IXMLDOMNode **resultNode) = 0;
-        
-        virtual  HRESULT __stdcall get_parsed( 
-             VARIANT_BOOL *isParsed) = 0;
-        
-        virtual  HRESULT __stdcall get_namespaceURI( 
-             BSTR *namespaceURI) = 0;
-        
-        virtual  HRESULT __stdcall get_prefix( 
-             BSTR *prefixString) = 0;
-        
-        virtual  HRESULT __stdcall get_baseName( 
-             BSTR *nameString) = 0;
-        
-        virtual  HRESULT __stdcall transformNodeToObject( 
-             IXMLDOMNode *stylesheet,
-             VARIANT outputObject) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeName_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *name);
-
-
-void __stdcall IXMLDOMNode_get_nodeName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeValue_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT *value);
-
-
-void __stdcall IXMLDOMNode_get_nodeValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_put_nodeValue_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT value);
-
-
-void __stdcall IXMLDOMNode_put_nodeValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeType_Proxy( 
-    IXMLDOMNode * This,
-     DOMNodeType *type);
-
-
-void __stdcall IXMLDOMNode_get_nodeType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_parentNode_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **parent);
-
-
-void __stdcall IXMLDOMNode_get_parentNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_childNodes_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNodeList **childList);
-
-
-void __stdcall IXMLDOMNode_get_childNodes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_firstChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **firstChild);
-
-
-void __stdcall IXMLDOMNode_get_firstChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_lastChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **lastChild);
-
-
-void __stdcall IXMLDOMNode_get_lastChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_previousSibling_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **previousSibling);
-
-
-void __stdcall IXMLDOMNode_get_previousSibling_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nextSibling_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **nextSibling);
-
-
-void __stdcall IXMLDOMNode_get_nextSibling_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_attributes_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNamedNodeMap **attributeMap);
-
-
-void __stdcall IXMLDOMNode_get_attributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_insertBefore_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *newChild,
-     VARIANT refChild,
-     IXMLDOMNode **outNewChild);
-
-
-void __stdcall IXMLDOMNode_insertBefore_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_replaceChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *newChild,
-     IXMLDOMNode *oldChild,
-     IXMLDOMNode **outOldChild);
-
-
-void __stdcall IXMLDOMNode_replaceChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_removeChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *childNode,
-     IXMLDOMNode **oldChild);
-
-
-void __stdcall IXMLDOMNode_removeChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_appendChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *newChild,
-     IXMLDOMNode **outNewChild);
-
-
-void __stdcall IXMLDOMNode_appendChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_hasChildNodes_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT_BOOL *hasChild);
-
-
-void __stdcall IXMLDOMNode_hasChildNodes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_ownerDocument_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMDocument **DOMDocument);
-
-
-void __stdcall IXMLDOMNode_get_ownerDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_cloneNode_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT_BOOL deep,
-     IXMLDOMNode **cloneRoot);
-
-
-void __stdcall IXMLDOMNode_cloneNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeTypeString_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *nodeType);
-
-
-void __stdcall IXMLDOMNode_get_nodeTypeString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_text_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *text);
-
-
-void __stdcall IXMLDOMNode_get_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_put_text_Proxy( 
-    IXMLDOMNode * This,
-     BSTR text);
-
-
-void __stdcall IXMLDOMNode_put_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_specified_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT_BOOL *isSpecified);
-
-
-void __stdcall IXMLDOMNode_get_specified_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_definition_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **definitionNode);
-
-
-void __stdcall IXMLDOMNode_get_definition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeTypedValue_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT *typedValue);
-
-
-void __stdcall IXMLDOMNode_get_nodeTypedValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_put_nodeTypedValue_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT typedValue);
-
-
-void __stdcall IXMLDOMNode_put_nodeTypedValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_dataType_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT *dataTypeName);
-
-
-void __stdcall IXMLDOMNode_get_dataType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_put_dataType_Proxy( 
-    IXMLDOMNode * This,
-     BSTR dataTypeName);
-
-
-void __stdcall IXMLDOMNode_put_dataType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_xml_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *xmlString);
-
-
-void __stdcall IXMLDOMNode_get_xml_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_transformNode_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *stylesheet,
-     BSTR *xmlString);
-
-
-void __stdcall IXMLDOMNode_transformNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_selectNodes_Proxy( 
-    IXMLDOMNode * This,
-     BSTR queryString,
-     IXMLDOMNodeList **resultList);
-
-
-void __stdcall IXMLDOMNode_selectNodes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_selectSingleNode_Proxy( 
-    IXMLDOMNode * This,
-     BSTR queryString,
-     IXMLDOMNode **resultNode);
-
-
-void __stdcall IXMLDOMNode_selectSingleNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_parsed_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT_BOOL *isParsed);
-
-
-void __stdcall IXMLDOMNode_get_parsed_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_namespaceURI_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *namespaceURI);
-
-
-void __stdcall IXMLDOMNode_get_namespaceURI_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_prefix_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *prefixString);
-
-
-void __stdcall IXMLDOMNode_get_prefix_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_baseName_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *nameString);
-
-
-void __stdcall IXMLDOMNode_get_baseName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_transformNodeToObject_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *stylesheet,
-     VARIANT outputObject);
-
-
-void __stdcall IXMLDOMNode_transformNodeToObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMDocumentFragment;
-
-
-    
-    struct __declspec(uuid("3efaa413-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
-    IXMLDOMDocumentFragment : public IXMLDOMNode
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMDocument;
-
-
-    
-    struct __declspec(uuid("2933BF81-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMDocument : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_doctype( 
-             IXMLDOMDocumentType **documentType) = 0;
-        
-        virtual  HRESULT __stdcall get_implementation( 
-             IXMLDOMImplementation **impl) = 0;
-        
-        virtual  HRESULT __stdcall get_documentElement( 
-             IXMLDOMElement **DOMElement) = 0;
-        
-        virtual  HRESULT __stdcall putref_documentElement( 
-             IXMLDOMElement *DOMElement) = 0;
-        
-        virtual  HRESULT __stdcall createElement( 
-             BSTR tagName,
-             IXMLDOMElement **element) = 0;
-        
-        virtual  HRESULT __stdcall createDocumentFragment( 
-             IXMLDOMDocumentFragment **docFrag) = 0;
-        
-        virtual  HRESULT __stdcall createTextNode( 
-             BSTR data,
-             IXMLDOMText **text) = 0;
-        
-        virtual  HRESULT __stdcall createComment( 
-             BSTR data,
-             IXMLDOMComment **comment) = 0;
-        
-        virtual  HRESULT __stdcall createCDATASection( 
-             BSTR data,
-             IXMLDOMCDATASection **cdata) = 0;
-        
-        virtual  HRESULT __stdcall createProcessingInstruction( 
-             BSTR target,
-             BSTR data,
-             IXMLDOMProcessingInstruction **pi) = 0;
-        
-        virtual  HRESULT __stdcall createAttribute( 
-             BSTR name,
-             IXMLDOMAttribute **attribute) = 0;
-        
-        virtual  HRESULT __stdcall createEntityReference( 
-             BSTR name,
-             IXMLDOMEntityReference **entityRef) = 0;
-        
-        virtual  HRESULT __stdcall getElementsByTagName( 
-             BSTR tagName,
-             IXMLDOMNodeList **resultList) = 0;
-        
-        virtual  HRESULT __stdcall createNode( 
-             VARIANT Type,
-             BSTR name,
-             BSTR namespaceURI,
-             IXMLDOMNode **node) = 0;
-        
-        virtual  HRESULT __stdcall nodeFromID( 
-             BSTR idString,
-             IXMLDOMNode **node) = 0;
-        
-        virtual  HRESULT __stdcall load( 
-             VARIANT xmlSource,
-             VARIANT_BOOL *isSuccessful) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *value) = 0;
-        
-        virtual  HRESULT __stdcall get_parseError( 
-             IXMLDOMParseError **errorObj) = 0;
-        
-        virtual  HRESULT __stdcall get_url( 
-             BSTR *urlString) = 0;
-        
-        virtual  HRESULT __stdcall get_async( 
-             VARIANT_BOOL *isAsync) = 0;
-        
-        virtual  HRESULT __stdcall put_async( 
-             VARIANT_BOOL isAsync) = 0;
-        
-        virtual  HRESULT __stdcall abort( void) = 0;
-        
-        virtual  HRESULT __stdcall loadXML( 
-             BSTR bstrXML,
-             VARIANT_BOOL *isSuccessful) = 0;
-        
-        virtual  HRESULT __stdcall save( 
-             VARIANT destination) = 0;
-        
-        virtual  HRESULT __stdcall get_validateOnParse( 
-             VARIANT_BOOL *isValidating) = 0;
-        
-        virtual  HRESULT __stdcall put_validateOnParse( 
-             VARIANT_BOOL isValidating) = 0;
-        
-        virtual  HRESULT __stdcall get_resolveExternals( 
-             VARIANT_BOOL *isResolving) = 0;
-        
-        virtual  HRESULT __stdcall put_resolveExternals( 
-             VARIANT_BOOL isResolving) = 0;
-        
-        virtual  HRESULT __stdcall get_preserveWhiteSpace( 
-             VARIANT_BOOL *isPreserving) = 0;
-        
-        virtual  HRESULT __stdcall put_preserveWhiteSpace( 
-             VARIANT_BOOL isPreserving) = 0;
-        
-        virtual  HRESULT __stdcall put_onreadystatechange( 
-             VARIANT readystatechangeSink) = 0;
-        
-        virtual  HRESULT __stdcall put_ondataavailable( 
-             VARIANT ondataavailableSink) = 0;
-        
-        virtual  HRESULT __stdcall put_ontransformnode( 
-             VARIANT ontransformnodeSink) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMDocument_get_doctype_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMDocumentType **documentType);
-
-
-void __stdcall IXMLDOMDocument_get_doctype_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_implementation_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMImplementation **impl);
-
-
-void __stdcall IXMLDOMDocument_get_implementation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_documentElement_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMElement **DOMElement);
-
-
-void __stdcall IXMLDOMDocument_get_documentElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_putref_documentElement_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMElement *DOMElement);
-
-
-void __stdcall IXMLDOMDocument_putref_documentElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createElement_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR tagName,
-     IXMLDOMElement **element);
-
-
-void __stdcall IXMLDOMDocument_createElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createDocumentFragment_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMDocumentFragment **docFrag);
-
-
-void __stdcall IXMLDOMDocument_createDocumentFragment_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createTextNode_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR data,
-     IXMLDOMText **text);
-
-
-void __stdcall IXMLDOMDocument_createTextNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createComment_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR data,
-     IXMLDOMComment **comment);
-
-
-void __stdcall IXMLDOMDocument_createComment_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createCDATASection_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR data,
-     IXMLDOMCDATASection **cdata);
-
-
-void __stdcall IXMLDOMDocument_createCDATASection_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createProcessingInstruction_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR target,
-     BSTR data,
-     IXMLDOMProcessingInstruction **pi);
-
-
-void __stdcall IXMLDOMDocument_createProcessingInstruction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createAttribute_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR name,
-     IXMLDOMAttribute **attribute);
-
-
-void __stdcall IXMLDOMDocument_createAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createEntityReference_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR name,
-     IXMLDOMEntityReference **entityRef);
-
-
-void __stdcall IXMLDOMDocument_createEntityReference_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_getElementsByTagName_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR tagName,
-     IXMLDOMNodeList **resultList);
-
-
-void __stdcall IXMLDOMDocument_getElementsByTagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createNode_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT Type,
-     BSTR name,
-     BSTR namespaceURI,
-     IXMLDOMNode **node);
-
-
-void __stdcall IXMLDOMDocument_createNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_nodeFromID_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR idString,
-     IXMLDOMNode **node);
-
-
-void __stdcall IXMLDOMDocument_nodeFromID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_load_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT xmlSource,
-     VARIANT_BOOL *isSuccessful);
-
-
-void __stdcall IXMLDOMDocument_load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_readyState_Proxy( 
-    IXMLDOMDocument * This,
-     long *value);
-
-
-void __stdcall IXMLDOMDocument_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_parseError_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMParseError **errorObj);
-
-
-void __stdcall IXMLDOMDocument_get_parseError_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_url_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR *urlString);
-
-
-void __stdcall IXMLDOMDocument_get_url_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_async_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL *isAsync);
-
-
-void __stdcall IXMLDOMDocument_get_async_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_async_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL isAsync);
-
-
-void __stdcall IXMLDOMDocument_put_async_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_abort_Proxy( 
-    IXMLDOMDocument * This);
-
-
-void __stdcall IXMLDOMDocument_abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_loadXML_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR bstrXML,
-     VARIANT_BOOL *isSuccessful);
-
-
-void __stdcall IXMLDOMDocument_loadXML_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_save_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT destination);
-
-
-void __stdcall IXMLDOMDocument_save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_validateOnParse_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL *isValidating);
-
-
-void __stdcall IXMLDOMDocument_get_validateOnParse_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_validateOnParse_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL isValidating);
-
-
-void __stdcall IXMLDOMDocument_put_validateOnParse_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_resolveExternals_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL *isResolving);
-
-
-void __stdcall IXMLDOMDocument_get_resolveExternals_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_resolveExternals_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL isResolving);
-
-
-void __stdcall IXMLDOMDocument_put_resolveExternals_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_preserveWhiteSpace_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL *isPreserving);
-
-
-void __stdcall IXMLDOMDocument_get_preserveWhiteSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_preserveWhiteSpace_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL isPreserving);
-
-
-void __stdcall IXMLDOMDocument_put_preserveWhiteSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_onreadystatechange_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT readystatechangeSink);
-
-
-void __stdcall IXMLDOMDocument_put_onreadystatechange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_ondataavailable_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT ondataavailableSink);
-
-
-void __stdcall IXMLDOMDocument_put_ondataavailable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_ontransformnode_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT ontransformnodeSink);
-
-
-void __stdcall IXMLDOMDocument_put_ontransformnode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMNodeList;
-
-
-    
-    struct __declspec(uuid("2933BF82-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMNodeList : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_item( 
-             long index,
-             IXMLDOMNode **listItem) = 0;
-        
-        virtual  HRESULT __stdcall get_length( 
-             long *listLength) = 0;
-        
-        virtual  HRESULT __stdcall nextNode( 
-             IXMLDOMNode **nextItem) = 0;
-        
-        virtual  HRESULT __stdcall reset( void) = 0;
-        
-        virtual  HRESULT __stdcall get__newEnum( 
-             IUnknown **ppUnk) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMNodeList_get_item_Proxy( 
-    IXMLDOMNodeList * This,
-     long index,
-     IXMLDOMNode **listItem);
-
-
-void __stdcall IXMLDOMNodeList_get_item_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNodeList_get_length_Proxy( 
-    IXMLDOMNodeList * This,
-     long *listLength);
-
-
-void __stdcall IXMLDOMNodeList_get_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNodeList_nextNode_Proxy( 
-    IXMLDOMNodeList * This,
-     IXMLDOMNode **nextItem);
-
-
-void __stdcall IXMLDOMNodeList_nextNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNodeList_reset_Proxy( 
-    IXMLDOMNodeList * This);
-
-
-void __stdcall IXMLDOMNodeList_reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNodeList_get__newEnum_Proxy( 
-    IXMLDOMNodeList * This,
-     IUnknown **ppUnk);
-
-
-void __stdcall IXMLDOMNodeList_get__newEnum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMNamedNodeMap;
-
-
-    
-    struct __declspec(uuid("2933BF83-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMNamedNodeMap : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall getNamedItem( 
-             BSTR name,
-             IXMLDOMNode **namedItem) = 0;
-        
-        virtual  HRESULT __stdcall setNamedItem( 
-             IXMLDOMNode *newItem,
-             IXMLDOMNode **nameItem) = 0;
-        
-        virtual  HRESULT __stdcall removeNamedItem( 
-             BSTR name,
-             IXMLDOMNode **namedItem) = 0;
-        
-        virtual  HRESULT __stdcall get_item( 
-             long index,
-             IXMLDOMNode **listItem) = 0;
-        
-        virtual  HRESULT __stdcall get_length( 
-             long *listLength) = 0;
-        
-        virtual  HRESULT __stdcall getQualifiedItem( 
-             BSTR baseName,
-             BSTR namespaceURI,
-             IXMLDOMNode **qualifiedItem) = 0;
-        
-        virtual  HRESULT __stdcall removeQualifiedItem( 
-             BSTR baseName,
-             BSTR namespaceURI,
-             IXMLDOMNode **qualifiedItem) = 0;
-        
-        virtual  HRESULT __stdcall nextNode( 
-             IXMLDOMNode **nextItem) = 0;
-        
-        virtual  HRESULT __stdcall reset( void) = 0;
-        
-        virtual  HRESULT __stdcall get__newEnum( 
-             IUnknown **ppUnk) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_getNamedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     BSTR name,
-     IXMLDOMNode **namedItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_getNamedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_setNamedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     IXMLDOMNode *newItem,
-     IXMLDOMNode **nameItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_setNamedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_removeNamedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     BSTR name,
-     IXMLDOMNode **namedItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_removeNamedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_get_item_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     long index,
-     IXMLDOMNode **listItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_get_item_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_get_length_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     long *listLength);
-
-
-void __stdcall IXMLDOMNamedNodeMap_get_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_getQualifiedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     BSTR baseName,
-     BSTR namespaceURI,
-     IXMLDOMNode **qualifiedItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_getQualifiedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_removeQualifiedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     BSTR baseName,
-     BSTR namespaceURI,
-     IXMLDOMNode **qualifiedItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_removeQualifiedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_nextNode_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     IXMLDOMNode **nextItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_nextNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_reset_Proxy( 
-    IXMLDOMNamedNodeMap * This);
-
-
-void __stdcall IXMLDOMNamedNodeMap_reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_get__newEnum_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     IUnknown **ppUnk);
-
-
-void __stdcall IXMLDOMNamedNodeMap_get__newEnum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMCharacterData;
-
-
-    
-    struct __declspec(uuid("2933BF84-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMCharacterData : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_data( 
-             BSTR *data) = 0;
-        
-        virtual  HRESULT __stdcall put_data( 
-             BSTR data) = 0;
-        
-        virtual  HRESULT __stdcall get_length( 
-             long *dataLength) = 0;
-        
-        virtual  HRESULT __stdcall substringData( 
-             long offset,
-             long count,
-             BSTR *data) = 0;
-        
-        virtual  HRESULT __stdcall appendData( 
-             BSTR data) = 0;
-        
-        virtual  HRESULT __stdcall insertData( 
-             long offset,
-             BSTR data) = 0;
-        
-        virtual  HRESULT __stdcall deleteData( 
-             long offset,
-             long count) = 0;
-        
-        virtual  HRESULT __stdcall replaceData( 
-             long offset,
-             long count,
-             BSTR data) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMCharacterData_get_data_Proxy( 
-    IXMLDOMCharacterData * This,
-     BSTR *data);
-
-
-void __stdcall IXMLDOMCharacterData_get_data_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_put_data_Proxy( 
-    IXMLDOMCharacterData * This,
-     BSTR data);
-
-
-void __stdcall IXMLDOMCharacterData_put_data_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_get_length_Proxy( 
-    IXMLDOMCharacterData * This,
-     long *dataLength);
-
-
-void __stdcall IXMLDOMCharacterData_get_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_substringData_Proxy( 
-    IXMLDOMCharacterData * This,
-     long offset,
-     long count,
-     BSTR *data);
-
-
-void __stdcall IXMLDOMCharacterData_substringData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_appendData_Proxy( 
-    IXMLDOMCharacterData * This,
-     BSTR data);
-
-
-void __stdcall IXMLDOMCharacterData_appendData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_insertData_Proxy( 
-    IXMLDOMCharacterData * This,
-     long offset,
-     BSTR data);
-
-
-void __stdcall IXMLDOMCharacterData_insertData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_deleteData_Proxy( 
-    IXMLDOMCharacterData * This,
-     long offset,
-     long count);
-
-
-void __stdcall IXMLDOMCharacterData_deleteData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_replaceData_Proxy( 
-    IXMLDOMCharacterData * This,
-     long offset,
-     long count,
-     BSTR data);
-
-
-void __stdcall IXMLDOMCharacterData_replaceData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMAttribute;
-
-
-    
-    struct __declspec(uuid("2933BF85-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMAttribute : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_name( 
-             BSTR *attributeName) = 0;
-        
-        virtual  HRESULT __stdcall get_value( 
-             VARIANT *attributeValue) = 0;
-        
-        virtual  HRESULT __stdcall put_value( 
-             VARIANT attributeValue) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMAttribute_get_name_Proxy( 
-    IXMLDOMAttribute * This,
-     BSTR *attributeName);
-
-
-void __stdcall IXMLDOMAttribute_get_name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMAttribute_get_value_Proxy( 
-    IXMLDOMAttribute * This,
-     VARIANT *attributeValue);
-
-
-void __stdcall IXMLDOMAttribute_get_value_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMAttribute_put_value_Proxy( 
-    IXMLDOMAttribute * This,
-     VARIANT attributeValue);
-
-
-void __stdcall IXMLDOMAttribute_put_value_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMElement;
-
-
-    
-    struct __declspec(uuid("2933BF86-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMElement : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_tagName( 
-             BSTR *tagName) = 0;
-        
-        virtual  HRESULT __stdcall getAttribute( 
-             BSTR name,
-             VARIANT *value) = 0;
-        
-        virtual  HRESULT __stdcall setAttribute( 
-             BSTR name,
-             VARIANT value) = 0;
-        
-        virtual  HRESULT __stdcall removeAttribute( 
-             BSTR name) = 0;
-        
-        virtual  HRESULT __stdcall getAttributeNode( 
-             BSTR name,
-             IXMLDOMAttribute **attributeNode) = 0;
-        
-        virtual  HRESULT __stdcall setAttributeNode( 
-             IXMLDOMAttribute *DOMAttribute,
-             IXMLDOMAttribute **attributeNode) = 0;
-        
-        virtual  HRESULT __stdcall removeAttributeNode( 
-             IXMLDOMAttribute *DOMAttribute,
-             IXMLDOMAttribute **attributeNode) = 0;
-        
-        virtual  HRESULT __stdcall getElementsByTagName( 
-             BSTR tagName,
-             IXMLDOMNodeList **resultList) = 0;
-        
-        virtual  HRESULT __stdcall normalize( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMElement_get_tagName_Proxy( 
-    IXMLDOMElement * This,
-     BSTR *tagName);
-
-
-void __stdcall IXMLDOMElement_get_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_getAttribute_Proxy( 
-    IXMLDOMElement * This,
-     BSTR name,
-     VARIANT *value);
-
-
-void __stdcall IXMLDOMElement_getAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_setAttribute_Proxy( 
-    IXMLDOMElement * This,
-     BSTR name,
-     VARIANT value);
-
-
-void __stdcall IXMLDOMElement_setAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_removeAttribute_Proxy( 
-    IXMLDOMElement * This,
-     BSTR name);
-
-
-void __stdcall IXMLDOMElement_removeAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_getAttributeNode_Proxy( 
-    IXMLDOMElement * This,
-     BSTR name,
-     IXMLDOMAttribute **attributeNode);
-
-
-void __stdcall IXMLDOMElement_getAttributeNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_setAttributeNode_Proxy( 
-    IXMLDOMElement * This,
-     IXMLDOMAttribute *DOMAttribute,
-     IXMLDOMAttribute **attributeNode);
-
-
-void __stdcall IXMLDOMElement_setAttributeNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_removeAttributeNode_Proxy( 
-    IXMLDOMElement * This,
-     IXMLDOMAttribute *DOMAttribute,
-     IXMLDOMAttribute **attributeNode);
-
-
-void __stdcall IXMLDOMElement_removeAttributeNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_getElementsByTagName_Proxy( 
-    IXMLDOMElement * This,
-     BSTR tagName,
-     IXMLDOMNodeList **resultList);
-
-
-void __stdcall IXMLDOMElement_getElementsByTagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_normalize_Proxy( 
-    IXMLDOMElement * This);
-
-
-void __stdcall IXMLDOMElement_normalize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMText;
-
-
-    
-    struct __declspec(uuid("2933BF87-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMText : public IXMLDOMCharacterData
-    {
-    public:
-        virtual  HRESULT __stdcall splitText( 
-             long offset,
-             IXMLDOMText **rightHandTextNode) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMText_splitText_Proxy( 
-    IXMLDOMText * This,
-     long offset,
-     IXMLDOMText **rightHandTextNode);
-
-
-void __stdcall IXMLDOMText_splitText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMComment;
-
-
-    
-    struct __declspec(uuid("2933BF88-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMComment : public IXMLDOMCharacterData
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMProcessingInstruction;
-
-
-    
-    struct __declspec(uuid("2933BF89-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMProcessingInstruction : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_target( 
-             BSTR *name) = 0;
-        
-        virtual  HRESULT __stdcall get_data( 
-             BSTR *value) = 0;
-        
-        virtual  HRESULT __stdcall put_data( 
-             BSTR value) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMProcessingInstruction_get_target_Proxy( 
-    IXMLDOMProcessingInstruction * This,
-     BSTR *name);
-
-
-void __stdcall IXMLDOMProcessingInstruction_get_target_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMProcessingInstruction_get_data_Proxy( 
-    IXMLDOMProcessingInstruction * This,
-     BSTR *value);
-
-
-void __stdcall IXMLDOMProcessingInstruction_get_data_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMProcessingInstruction_put_data_Proxy( 
-    IXMLDOMProcessingInstruction * This,
-     BSTR value);
-
-
-void __stdcall IXMLDOMProcessingInstruction_put_data_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMCDATASection;
-
-
-    
-    struct __declspec(uuid("2933BF8A-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMCDATASection : public IXMLDOMText
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMDocumentType;
-
-
-    
-    struct __declspec(uuid("2933BF8B-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMDocumentType : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_name( 
-             BSTR *rootName) = 0;
-        
-        virtual  HRESULT __stdcall get_entities( 
-             IXMLDOMNamedNodeMap **entityMap) = 0;
-        
-        virtual  HRESULT __stdcall get_notations( 
-             IXMLDOMNamedNodeMap **notationMap) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMDocumentType_get_name_Proxy( 
-    IXMLDOMDocumentType * This,
-     BSTR *rootName);
-
-
-void __stdcall IXMLDOMDocumentType_get_name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocumentType_get_entities_Proxy( 
-    IXMLDOMDocumentType * This,
-     IXMLDOMNamedNodeMap **entityMap);
-
-
-void __stdcall IXMLDOMDocumentType_get_entities_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocumentType_get_notations_Proxy( 
-    IXMLDOMDocumentType * This,
-     IXMLDOMNamedNodeMap **notationMap);
-
-
-void __stdcall IXMLDOMDocumentType_get_notations_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMNotation;
-
-
-    
-    struct __declspec(uuid("2933BF8C-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMNotation : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_publicId( 
-             VARIANT *publicID) = 0;
-        
-        virtual  HRESULT __stdcall get_systemId( 
-             VARIANT *systemID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMNotation_get_publicId_Proxy( 
-    IXMLDOMNotation * This,
-     VARIANT *publicID);
-
-
-void __stdcall IXMLDOMNotation_get_publicId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNotation_get_systemId_Proxy( 
-    IXMLDOMNotation * This,
-     VARIANT *systemID);
-
-
-void __stdcall IXMLDOMNotation_get_systemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMEntity;
-
-
-    
-    struct __declspec(uuid("2933BF8D-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMEntity : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_publicId( 
-             VARIANT *publicID) = 0;
-        
-        virtual  HRESULT __stdcall get_systemId( 
-             VARIANT *systemID) = 0;
-        
-        virtual  HRESULT __stdcall get_notationName( 
-             BSTR *name) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMEntity_get_publicId_Proxy( 
-    IXMLDOMEntity * This,
-     VARIANT *publicID);
-
-
-void __stdcall IXMLDOMEntity_get_publicId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMEntity_get_systemId_Proxy( 
-    IXMLDOMEntity * This,
-     VARIANT *systemID);
-
-
-void __stdcall IXMLDOMEntity_get_systemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMEntity_get_notationName_Proxy( 
-    IXMLDOMEntity * This,
-     BSTR *name);
-
-
-void __stdcall IXMLDOMEntity_get_notationName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMEntityReference;
-
-
-    
-    struct __declspec(uuid("2933BF8E-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMEntityReference : public IXMLDOMNode
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMParseError;
-
-
-    
-    struct __declspec(uuid("3efaa426-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
-    IXMLDOMParseError : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_errorCode( 
-             long *errorCode) = 0;
-        
-        virtual  HRESULT __stdcall get_url( 
-             BSTR *urlString) = 0;
-        
-        virtual  HRESULT __stdcall get_reason( 
-             BSTR *reasonString) = 0;
-        
-        virtual  HRESULT __stdcall get_srcText( 
-             BSTR *sourceString) = 0;
-        
-        virtual  HRESULT __stdcall get_line( 
-             long *lineNumber) = 0;
-        
-        virtual  HRESULT __stdcall get_linepos( 
-             long *linePosition) = 0;
-        
-        virtual  HRESULT __stdcall get_filepos( 
-             long *filePosition) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMParseError_get_errorCode_Proxy( 
-    IXMLDOMParseError * This,
-     long *errorCode);
-
-
-void __stdcall IXMLDOMParseError_get_errorCode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_url_Proxy( 
-    IXMLDOMParseError * This,
-     BSTR *urlString);
-
-
-void __stdcall IXMLDOMParseError_get_url_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_reason_Proxy( 
-    IXMLDOMParseError * This,
-     BSTR *reasonString);
-
-
-void __stdcall IXMLDOMParseError_get_reason_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_srcText_Proxy( 
-    IXMLDOMParseError * This,
-     BSTR *sourceString);
-
-
-void __stdcall IXMLDOMParseError_get_srcText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_line_Proxy( 
-    IXMLDOMParseError * This,
-     long *lineNumber);
-
-
-void __stdcall IXMLDOMParseError_get_line_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_linepos_Proxy( 
-    IXMLDOMParseError * This,
-     long *linePosition);
-
-
-void __stdcall IXMLDOMParseError_get_linepos_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_filepos_Proxy( 
-    IXMLDOMParseError * This,
-     long *filePosition);
-
-
-void __stdcall IXMLDOMParseError_get_filepos_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXTLRuntime;
-
-
-    
-    struct __declspec(uuid("3efaa425-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
-    IXTLRuntime : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall uniqueID( 
-             IXMLDOMNode *pNode,
-             long *pID) = 0;
-        
-        virtual  HRESULT __stdcall depth( 
-             IXMLDOMNode *pNode,
-             long *pDepth) = 0;
-        
-        virtual  HRESULT __stdcall childNumber( 
-             IXMLDOMNode *pNode,
-             long *pNumber) = 0;
-        
-        virtual  HRESULT __stdcall ancestorChildNumber( 
-             BSTR bstrNodeName,
-             IXMLDOMNode *pNode,
-             long *pNumber) = 0;
-        
-        virtual  HRESULT __stdcall absoluteChildNumber( 
-             IXMLDOMNode *pNode,
-             long *pNumber) = 0;
-        
-        virtual  HRESULT __stdcall formatIndex( 
-             long lIndex,
-             BSTR bstrFormat,
-             BSTR *pbstrFormattedString) = 0;
-        
-        virtual  HRESULT __stdcall formatNumber( 
-             double dblNumber,
-             BSTR bstrFormat,
-             BSTR *pbstrFormattedString) = 0;
-        
-        virtual  HRESULT __stdcall formatDate( 
-             VARIANT varDate,
-             BSTR bstrFormat,
-             VARIANT varDestLocale,
-             BSTR *pbstrFormattedString) = 0;
-        
-        virtual  HRESULT __stdcall formatTime( 
-             VARIANT varTime,
-             BSTR bstrFormat,
-             VARIANT varDestLocale,
-             BSTR *pbstrFormattedString) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXTLRuntime_uniqueID_Proxy( 
-    IXTLRuntime * This,
-     IXMLDOMNode *pNode,
-     long *pID);
-
-
-void __stdcall IXTLRuntime_uniqueID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_depth_Proxy( 
-    IXTLRuntime * This,
-     IXMLDOMNode *pNode,
-     long *pDepth);
-
-
-void __stdcall IXTLRuntime_depth_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_childNumber_Proxy( 
-    IXTLRuntime * This,
-     IXMLDOMNode *pNode,
-     long *pNumber);
-
-
-void __stdcall IXTLRuntime_childNumber_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_ancestorChildNumber_Proxy( 
-    IXTLRuntime * This,
-     BSTR bstrNodeName,
-     IXMLDOMNode *pNode,
-     long *pNumber);
-
-
-void __stdcall IXTLRuntime_ancestorChildNumber_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_absoluteChildNumber_Proxy( 
-    IXTLRuntime * This,
-     IXMLDOMNode *pNode,
-     long *pNumber);
-
-
-void __stdcall IXTLRuntime_absoluteChildNumber_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_formatIndex_Proxy( 
-    IXTLRuntime * This,
-     long lIndex,
-     BSTR bstrFormat,
-     BSTR *pbstrFormattedString);
-
-
-void __stdcall IXTLRuntime_formatIndex_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_formatNumber_Proxy( 
-    IXTLRuntime * This,
-     double dblNumber,
-     BSTR bstrFormat,
-     BSTR *pbstrFormattedString);
-
-
-void __stdcall IXTLRuntime_formatNumber_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_formatDate_Proxy( 
-    IXTLRuntime * This,
-     VARIANT varDate,
-     BSTR bstrFormat,
-     VARIANT varDestLocale,
-     BSTR *pbstrFormattedString);
-
-
-void __stdcall IXTLRuntime_formatDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_formatTime_Proxy( 
-    IXTLRuntime * This,
-     VARIANT varTime,
-     BSTR bstrFormat,
-     VARIANT varDestLocale,
-     BSTR *pbstrFormattedString);
-
-
-void __stdcall IXTLRuntime_formatTime_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID DIID_XMLDOMDocumentEvents;
-
-
-
-    struct __declspec(uuid("3efaa427-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
-    XMLDOMDocumentEvents : public IDispatch
-    {
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const CLSID CLSID_DOMDocument;
-
-
-
-class __declspec(uuid("2933BF90-7B36-11d2-B20E-00C04F983E60"))
-DOMDocument;
-
-
-extern "C" const CLSID CLSID_DOMFreeThreadedDocument;
-
-
-
-class __declspec(uuid("2933BF91-7B36-11d2-B20E-00C04F983E60"))
-DOMFreeThreadedDocument;
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLHttpRequest;
-
-
-    
-    struct __declspec(uuid("ED8C108D-4349-11D2-91A4-00C04F7969E8")) __declspec(novtable)
-    IXMLHttpRequest : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall open( 
-             BSTR bstrMethod,
-             BSTR bstrUrl,
-             VARIANT varAsync,
-             VARIANT bstrUser,
-             VARIANT bstrPassword) = 0;
-        
-        virtual  HRESULT __stdcall setRequestHeader( 
-             BSTR bstrHeader,
-             BSTR bstrValue) = 0;
-        
-        virtual  HRESULT __stdcall getResponseHeader( 
-             BSTR bstrHeader,
-             BSTR *pbstrValue) = 0;
-        
-        virtual  HRESULT __stdcall getAllResponseHeaders( 
-             BSTR *pbstrHeaders) = 0;
-        
-        virtual  HRESULT __stdcall send( 
-             VARIANT varBody) = 0;
-        
-        virtual  HRESULT __stdcall abort( void) = 0;
-        
-        virtual  HRESULT __stdcall get_status( 
-             long *plStatus) = 0;
-        
-        virtual  HRESULT __stdcall get_statusText( 
-             BSTR *pbstrStatus) = 0;
-        
-        virtual  HRESULT __stdcall get_responseXML( 
-             IDispatch **ppBody) = 0;
-        
-        virtual  HRESULT __stdcall get_responseText( 
-             BSTR *pbstrBody) = 0;
-        
-        virtual  HRESULT __stdcall get_responseBody( 
-             VARIANT *pvarBody) = 0;
-        
-        virtual  HRESULT __stdcall get_responseStream( 
-             VARIANT *pvarBody) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *plState) = 0;
-        
-        virtual  HRESULT __stdcall put_onreadystatechange( 
-             IDispatch *pReadyStateSink) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLHttpRequest_open_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR bstrMethod,
-     BSTR bstrUrl,
-     VARIANT varAsync,
-     VARIANT bstrUser,
-     VARIANT bstrPassword);
-
-
-void __stdcall IXMLHttpRequest_open_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_setRequestHeader_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR bstrHeader,
-     BSTR bstrValue);
-
-
-void __stdcall IXMLHttpRequest_setRequestHeader_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_getResponseHeader_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR bstrHeader,
-     BSTR *pbstrValue);
-
-
-void __stdcall IXMLHttpRequest_getResponseHeader_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_getAllResponseHeaders_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR *pbstrHeaders);
-
-
-void __stdcall IXMLHttpRequest_getAllResponseHeaders_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_send_Proxy( 
-    IXMLHttpRequest * This,
-     VARIANT varBody);
-
-
-void __stdcall IXMLHttpRequest_send_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_abort_Proxy( 
-    IXMLHttpRequest * This);
-
-
-void __stdcall IXMLHttpRequest_abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_status_Proxy( 
-    IXMLHttpRequest * This,
-     long *plStatus);
-
-
-void __stdcall IXMLHttpRequest_get_status_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_statusText_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR *pbstrStatus);
-
-
-void __stdcall IXMLHttpRequest_get_statusText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_responseXML_Proxy( 
-    IXMLHttpRequest * This,
-     IDispatch **ppBody);
-
-
-void __stdcall IXMLHttpRequest_get_responseXML_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_responseText_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR *pbstrBody);
-
-
-void __stdcall IXMLHttpRequest_get_responseText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_responseBody_Proxy( 
-    IXMLHttpRequest * This,
-     VARIANT *pvarBody);
-
-
-void __stdcall IXMLHttpRequest_get_responseBody_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_responseStream_Proxy( 
-    IXMLHttpRequest * This,
-     VARIANT *pvarBody);
-
-
-void __stdcall IXMLHttpRequest_get_responseStream_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_readyState_Proxy( 
-    IXMLHttpRequest * This,
-     long *plState);
-
-
-void __stdcall IXMLHttpRequest_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_put_onreadystatechange_Proxy( 
-    IXMLHttpRequest * This,
-     IDispatch *pReadyStateSink);
-
-
-void __stdcall IXMLHttpRequest_put_onreadystatechange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-extern "C" const CLSID CLSID_XMLHTTPRequest;
-
-
-
-class __declspec(uuid("ED8C108E-4349-11D2-91A4-00C04F7969E8"))
-XMLHTTPRequest;
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDSOControl;
-
-
-    
-    struct __declspec(uuid("310afa62-0575-11d2-9ca9-0060b0ec3d39")) __declspec(novtable)
-    IXMLDSOControl : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_XMLDocument( 
-             IXMLDOMDocument **ppDoc) = 0;
-        
-        virtual  HRESULT __stdcall put_XMLDocument( 
-             IXMLDOMDocument *ppDoc) = 0;
-        
-        virtual  HRESULT __stdcall get_JavaDSOCompatible( 
-             BOOL *fJavaDSOCompatible) = 0;
-        
-        virtual  HRESULT __stdcall put_JavaDSOCompatible( 
-             BOOL fJavaDSOCompatible) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *state) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDSOControl_get_XMLDocument_Proxy( 
-    IXMLDSOControl * This,
-     IXMLDOMDocument **ppDoc);
-
-
-void __stdcall IXMLDSOControl_get_XMLDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDSOControl_put_XMLDocument_Proxy( 
-    IXMLDSOControl * This,
-     IXMLDOMDocument *ppDoc);
-
-
-void __stdcall IXMLDSOControl_put_XMLDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDSOControl_get_JavaDSOCompatible_Proxy( 
-    IXMLDSOControl * This,
-     BOOL *fJavaDSOCompatible);
-
-
-void __stdcall IXMLDSOControl_get_JavaDSOCompatible_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDSOControl_put_JavaDSOCompatible_Proxy( 
-    IXMLDSOControl * This,
-     BOOL fJavaDSOCompatible);
-
-
-void __stdcall IXMLDSOControl_put_JavaDSOCompatible_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDSOControl_get_readyState_Proxy( 
-    IXMLDSOControl * This,
-     long *state);
-
-
-void __stdcall IXMLDSOControl_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-extern "C" const CLSID CLSID_XMLDSOControl;
-
-
-
-class __declspec(uuid("550dda30-0541-11d2-9ca9-0060b0ec3d39"))
-XMLDSOControl;
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLElementCollection;
-
-
-    
-    struct __declspec(uuid("65725580-9B5D-11d0-9BFE-00C04FC99C8E")) __declspec(novtable)
-    IXMLElementCollection : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall put_length( 
-             long v) = 0;
-        
-        virtual  HRESULT __stdcall get_length( 
-             long *p) = 0;
-        
-        virtual  HRESULT __stdcall get__newEnum( 
-             IUnknown **ppUnk) = 0;
-        
-        virtual  HRESULT __stdcall item( 
-             VARIANT var1,
-             VARIANT var2,
-             IDispatch **ppDisp) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLElementCollection_put_length_Proxy( 
-    IXMLElementCollection * This,
-     long v);
-
-
-void __stdcall IXMLElementCollection_put_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElementCollection_get_length_Proxy( 
-    IXMLElementCollection * This,
-     long *p);
-
-
-void __stdcall IXMLElementCollection_get_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElementCollection_get__newEnum_Proxy( 
-    IXMLElementCollection * This,
-     IUnknown **ppUnk);
-
-
-void __stdcall IXMLElementCollection_get__newEnum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElementCollection_item_Proxy( 
-    IXMLElementCollection * This,
-     VARIANT var1,
-     VARIANT var2,
-     IDispatch **ppDisp);
-
-
-void __stdcall IXMLElementCollection_item_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDocument;
-
-
-    
-    struct __declspec(uuid("F52E2B61-18A1-11d1-B105-00805F49916B")) __declspec(novtable)
-    IXMLDocument : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_root( 
-             IXMLElement **p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileSize( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileModifiedDate( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileUpdatedDate( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_URL( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_URL( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_mimeType( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *pl) = 0;
-        
-        virtual  HRESULT __stdcall get_charset( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_charset( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_version( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_doctype( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_dtdURL( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall createElement( 
-             VARIANT vType,
-             VARIANT var1,
-             IXMLElement **ppElem) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDocument_get_root_Proxy( 
-    IXMLDocument * This,
-     IXMLElement **p);
-
-
-void __stdcall IXMLDocument_get_root_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_fileSize_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_fileSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_fileModifiedDate_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_fileModifiedDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_fileUpdatedDate_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_fileUpdatedDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_URL_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_URL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_put_URL_Proxy( 
-    IXMLDocument * This,
-     BSTR p);
-
-
-void __stdcall IXMLDocument_put_URL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_mimeType_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_mimeType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_readyState_Proxy( 
-    IXMLDocument * This,
-     long *pl);
-
-
-void __stdcall IXMLDocument_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_charset_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_put_charset_Proxy( 
-    IXMLDocument * This,
-     BSTR p);
-
-
-void __stdcall IXMLDocument_put_charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_version_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_version_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_doctype_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_doctype_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_dtdURL_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_dtdURL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_createElement_Proxy( 
-    IXMLDocument * This,
-     VARIANT vType,
-     VARIANT var1,
-     IXMLElement **ppElem);
-
-
-void __stdcall IXMLDocument_createElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDocument2;
-
-
-    
-    struct __declspec(uuid("2B8DE2FE-8D2D-11d1-B2FC-00C04FD915A9")) __declspec(novtable)
-    IXMLDocument2 : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_root( 
-             IXMLElement2 **p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileSize( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileModifiedDate( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileUpdatedDate( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_URL( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_URL( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_mimeType( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *pl) = 0;
-        
-        virtual  HRESULT __stdcall get_charset( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_charset( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_version( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_doctype( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_dtdURL( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall createElement( 
-             VARIANT vType,
-             VARIANT var1,
-             IXMLElement2 **ppElem) = 0;
-        
-        virtual  HRESULT __stdcall get_async( 
-             VARIANT_BOOL *pf) = 0;
-        
-        virtual  HRESULT __stdcall put_async( 
-             VARIANT_BOOL f) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDocument2_get_root_Proxy( 
-    IXMLDocument2 * This,
-     IXMLElement2 **p);
-
-
-void __stdcall IXMLDocument2_get_root_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_fileSize_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_fileSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_fileModifiedDate_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_fileModifiedDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_fileUpdatedDate_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_fileUpdatedDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_URL_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_URL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_put_URL_Proxy( 
-    IXMLDocument2 * This,
-     BSTR p);
-
-
-void __stdcall IXMLDocument2_put_URL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_mimeType_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_mimeType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_readyState_Proxy( 
-    IXMLDocument2 * This,
-     long *pl);
-
-
-void __stdcall IXMLDocument2_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_charset_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_put_charset_Proxy( 
-    IXMLDocument2 * This,
-     BSTR p);
-
-
-void __stdcall IXMLDocument2_put_charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_version_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_version_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_doctype_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_doctype_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_dtdURL_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_dtdURL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_createElement_Proxy( 
-    IXMLDocument2 * This,
-     VARIANT vType,
-     VARIANT var1,
-     IXMLElement2 **ppElem);
-
-
-void __stdcall IXMLDocument2_createElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_async_Proxy( 
-    IXMLDocument2 * This,
-     VARIANT_BOOL *pf);
-
-
-void __stdcall IXMLDocument2_get_async_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_put_async_Proxy( 
-    IXMLDocument2 * This,
-     VARIANT_BOOL f);
-
-
-void __stdcall IXMLDocument2_put_async_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLElement;
-
-
-    
-    struct __declspec(uuid("3F7F31AC-E15F-11d0-9C25-00C04FC99C8E")) __declspec(novtable)
-    IXMLElement : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_tagName( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_tagName( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_parent( 
-             IXMLElement **ppParent) = 0;
-        
-        virtual  HRESULT __stdcall setAttribute( 
-             BSTR strPropertyName,
-             VARIANT PropertyValue) = 0;
-        
-        virtual  HRESULT __stdcall getAttribute( 
-             BSTR strPropertyName,
-             VARIANT *PropertyValue) = 0;
-        
-        virtual  HRESULT __stdcall removeAttribute( 
-             BSTR strPropertyName) = 0;
-        
-        virtual  HRESULT __stdcall get_children( 
-             IXMLElementCollection **pp) = 0;
-        
-        virtual  HRESULT __stdcall get_type( 
-             long *plType) = 0;
-        
-        virtual  HRESULT __stdcall get_text( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_text( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall addChild( 
-             IXMLElement *pChildElem,
-            long lIndex,
-            long lReserved) = 0;
-        
-        virtual  HRESULT __stdcall removeChild( 
-             IXMLElement *pChildElem) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLElement_get_tagName_Proxy( 
-    IXMLElement * This,
-     BSTR *p);
-
-
-void __stdcall IXMLElement_get_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_put_tagName_Proxy( 
-    IXMLElement * This,
-     BSTR p);
-
-
-void __stdcall IXMLElement_put_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_get_parent_Proxy( 
-    IXMLElement * This,
-     IXMLElement **ppParent);
-
-
-void __stdcall IXMLElement_get_parent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_setAttribute_Proxy( 
-    IXMLElement * This,
-     BSTR strPropertyName,
-     VARIANT PropertyValue);
-
-
-void __stdcall IXMLElement_setAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_getAttribute_Proxy( 
-    IXMLElement * This,
-     BSTR strPropertyName,
-     VARIANT *PropertyValue);
-
-
-void __stdcall IXMLElement_getAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_removeAttribute_Proxy( 
-    IXMLElement * This,
-     BSTR strPropertyName);
-
-
-void __stdcall IXMLElement_removeAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_get_children_Proxy( 
-    IXMLElement * This,
-     IXMLElementCollection **pp);
-
-
-void __stdcall IXMLElement_get_children_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_get_type_Proxy( 
-    IXMLElement * This,
-     long *plType);
-
-
-void __stdcall IXMLElement_get_type_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_get_text_Proxy( 
-    IXMLElement * This,
-     BSTR *p);
-
-
-void __stdcall IXMLElement_get_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_put_text_Proxy( 
-    IXMLElement * This,
-     BSTR p);
-
-
-void __stdcall IXMLElement_put_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_addChild_Proxy( 
-    IXMLElement * This,
-     IXMLElement *pChildElem,
-    long lIndex,
-    long lReserved);
-
-
-void __stdcall IXMLElement_addChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_removeChild_Proxy( 
-    IXMLElement * This,
-     IXMLElement *pChildElem);
-
-
-void __stdcall IXMLElement_removeChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLElement2;
-
-
-    
-    struct __declspec(uuid("2B8DE2FF-8D2D-11d1-B2FC-00C04FD915A9")) __declspec(novtable)
-    IXMLElement2 : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_tagName( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_tagName( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_parent( 
-             IXMLElement2 **ppParent) = 0;
-        
-        virtual  HRESULT __stdcall setAttribute( 
-             BSTR strPropertyName,
-             VARIANT PropertyValue) = 0;
-        
-        virtual  HRESULT __stdcall getAttribute( 
-             BSTR strPropertyName,
-             VARIANT *PropertyValue) = 0;
-        
-        virtual  HRESULT __stdcall removeAttribute( 
-             BSTR strPropertyName) = 0;
-        
-        virtual  HRESULT __stdcall get_children( 
-             IXMLElementCollection **pp) = 0;
-        
-        virtual  HRESULT __stdcall get_type( 
-             long *plType) = 0;
-        
-        virtual  HRESULT __stdcall get_text( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_text( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall addChild( 
-             IXMLElement2 *pChildElem,
-            long lIndex,
-            long lReserved) = 0;
-        
-        virtual  HRESULT __stdcall removeChild( 
-             IXMLElement2 *pChildElem) = 0;
-        
-        virtual  HRESULT __stdcall get_attributes( 
-             IXMLElementCollection **pp) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLElement2_get_tagName_Proxy( 
-    IXMLElement2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLElement2_get_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_put_tagName_Proxy( 
-    IXMLElement2 * This,
-     BSTR p);
-
-
-void __stdcall IXMLElement2_put_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_parent_Proxy( 
-    IXMLElement2 * This,
-     IXMLElement2 **ppParent);
-
-
-void __stdcall IXMLElement2_get_parent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_setAttribute_Proxy( 
-    IXMLElement2 * This,
-     BSTR strPropertyName,
-     VARIANT PropertyValue);
-
-
-void __stdcall IXMLElement2_setAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_getAttribute_Proxy( 
-    IXMLElement2 * This,
-     BSTR strPropertyName,
-     VARIANT *PropertyValue);
-
-
-void __stdcall IXMLElement2_getAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_removeAttribute_Proxy( 
-    IXMLElement2 * This,
-     BSTR strPropertyName);
-
-
-void __stdcall IXMLElement2_removeAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_children_Proxy( 
-    IXMLElement2 * This,
-     IXMLElementCollection **pp);
-
-
-void __stdcall IXMLElement2_get_children_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_type_Proxy( 
-    IXMLElement2 * This,
-     long *plType);
-
-
-void __stdcall IXMLElement2_get_type_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_text_Proxy( 
-    IXMLElement2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLElement2_get_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_put_text_Proxy( 
-    IXMLElement2 * This,
-     BSTR p);
-
-
-void __stdcall IXMLElement2_put_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_addChild_Proxy( 
-    IXMLElement2 * This,
-     IXMLElement2 *pChildElem,
-    long lIndex,
-    long lReserved);
-
-
-void __stdcall IXMLElement2_addChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_removeChild_Proxy( 
-    IXMLElement2 * This,
-     IXMLElement2 *pChildElem);
-
-
-void __stdcall IXMLElement2_removeChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_attributes_Proxy( 
-    IXMLElement2 * This,
-     IXMLElementCollection **pp);
-
-
-void __stdcall IXMLElement2_get_attributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLAttribute;
-
-
-    
-    struct __declspec(uuid("D4D4A0FC-3B73-11d1-B2B4-00C04FB92596")) __declspec(novtable)
-    IXMLAttribute : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_name( 
-             BSTR *n) = 0;
-        
-        virtual  HRESULT __stdcall get_value( 
-             BSTR *v) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLAttribute_get_name_Proxy( 
-    IXMLAttribute * This,
-     BSTR *n);
-
-
-void __stdcall IXMLAttribute_get_name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLAttribute_get_value_Proxy( 
-    IXMLAttribute * This,
-     BSTR *v);
-
-
-void __stdcall IXMLAttribute_get_value_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLError;
-
-
-    
-    struct __declspec(uuid("948C5AD3-C58D-11d0-9C0B-00C04FC99C8E")) __declspec(novtable)
-    IXMLError : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetErrorInfo( 
-            XML_ERROR *pErrorReturn) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IXMLError_GetErrorInfo_Proxy( 
-    IXMLError * This,
-    XML_ERROR *pErrorReturn);
-
-
-void __stdcall IXMLError_GetErrorInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-extern "C" const CLSID CLSID_XMLDocument;
-
-
-
-class __declspec(uuid("CFC399AF-D876-11d0-9C10-00C04FC99C8E"))
-XMLDocument;
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(lib,"uuid.lib")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID CLSID_SBS_StdURLMoniker;  
-extern "C" const IID CLSID_SBS_HttpProtocol;   
-extern "C" const IID CLSID_SBS_FtpProtocol;    
-extern "C" const IID CLSID_SBS_GopherProtocol; 
-extern "C" const IID CLSID_SBS_HttpSProtocol;  
-extern "C" const IID CLSID_SBS_FileProtocol;   
-extern "C" const IID CLSID_SBS_MkProtocol;     
-extern "C" const IID CLSID_SBS_UrlMkBindCtx;   
-extern "C" const IID CLSID_SBS_SoftDistExt;  
-extern "C" const IID CLSID_SBS_StdEncodingFilterFac; 
-extern "C" const IID CLSID_SBS_DeCompMimeFilter;     
-extern "C" const IID CLSID_SBS_CdlProtocol;          
-extern "C" const IID CLSID_SBS_ClassInstallFilter;   
-extern "C" const IID CLSID_SBS_InternetSecurityManager;  
-extern "C" const IID CLSID_SBS_InternetZoneManager;  
-
-
-
-
-
-
-
-extern "C" const IID IID_IAsyncMoniker;    
-extern "C" const IID CLSID_StdURLMoniker;  
-extern "C" const IID CLSID_HttpProtocol;   
-extern "C" const IID CLSID_FtpProtocol;    
-extern "C" const IID CLSID_GopherProtocol; 
-extern "C" const IID CLSID_HttpSProtocol;  
-extern "C" const IID CLSID_FileProtocol;   
-extern "C" const IID CLSID_MkProtocol;     
-extern "C" const IID CLSID_StdURLProtocol; 
-extern "C" const IID CLSID_UrlMkBindCtx;   
-extern "C" const IID CLSID_StdEncodingFilterFac; 
-extern "C" const IID CLSID_DeCompMimeFilter;     
-extern "C" const IID CLSID_CdlProtocol;          
-extern "C" const IID CLSID_ClassInstallFilter;   
-extern "C" const IID IID_IAsyncBindCtx;    
- 
-
-
-
-
-
-
- 
-extern "C" HRESULT __stdcall CreateURLMoniker(LPMONIKER pMkCtx, LPCWSTR szURL, LPMONIKER  * ppmk);             
-extern "C" HRESULT __stdcall CreateURLMonikerEx(LPMONIKER pMkCtx, LPCWSTR szURL, LPMONIKER  * ppmk, DWORD dwFlags);             
-extern "C" HRESULT __stdcall GetClassURL(LPCWSTR szURL, CLSID *pClsID);                                           
-extern "C" HRESULT __stdcall CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *pBSCb,                       
-                                IEnumFORMATETC *pEFetc, IBindCtx **ppBC);                   
-extern "C" HRESULT __stdcall CreateAsyncBindCtxEx(IBindCtx *pbc, DWORD dwOptions, IBindStatusCallback *pBSCb, IEnumFORMATETC *pEnum,   
-                            IBindCtx **ppBC, DWORD reserved);                                                     
-extern "C" HRESULT __stdcall MkParseDisplayNameEx(IBindCtx *pbc, LPCWSTR szDisplayName, ULONG *pchEaten,          
-                                LPMONIKER *ppmk);                                           
-extern "C" HRESULT __stdcall RegisterBindStatusCallback(LPBC pBC, IBindStatusCallback *pBSCb,                     
-                                IBindStatusCallback**  ppBSCBPrev, DWORD dwReserved);       
-extern "C" HRESULT __stdcall RevokeBindStatusCallback(LPBC pBC, IBindStatusCallback *pBSCb);                      
-extern "C" HRESULT __stdcall GetClassFileOrMime(LPBC pBC, LPCWSTR szFilename, LPVOID pBuffer, DWORD cbSize, LPCWSTR szMime, DWORD dwReserved, CLSID *pclsid); 
-extern "C" HRESULT __stdcall IsValidURL(LPBC pBC, LPCWSTR szURL, DWORD dwReserved);                               
-extern "C" HRESULT __stdcall CoGetClassObjectFromURL( const IID & rCLASSID,
-            LPCWSTR szCODE, DWORD dwFileVersionMS, 
-            DWORD dwFileVersionLS, LPCWSTR szTYPE,
-            LPBINDCTX pBindCtx, DWORD dwClsContext,
-            LPVOID pvReserved, const IID & riid, LPVOID * ppv);
-extern "C" HRESULT __stdcall FaultInIEFeature( HWND hWnd,
-            uCLSSPEC *pClassSpec,
-            QUERYCONTEXT *pQuery, DWORD dwFlags);                                           
-extern "C" HRESULT __stdcall GetComponentIDFromCLSSPEC(uCLSSPEC *pClassspec,
-             LPSTR * ppszComponentID);                                                      
-
-
-                                                 
-                                                 
-                                                 
-
-
- 
-
-extern "C" HRESULT __stdcall IsAsyncMoniker(IMoniker* pmk);                                                       
-extern "C" HRESULT __stdcall CreateURLBinding(LPCWSTR lpszUrl, IBindCtx *pbc, IBinding **ppBdg);                  
- 
-extern "C" HRESULT __stdcall RegisterMediaTypes(UINT ctypes, const LPCSTR* rgszTypes, CLIPFORMAT* rgcfTypes);            
-extern "C" HRESULT __stdcall FindMediaType(LPCSTR rgszTypes, CLIPFORMAT* rgcfTypes);                                       
-extern "C" HRESULT __stdcall CreateFormatEnumerator( UINT cfmtetc, FORMATETC* rgfmtetc, IEnumFORMATETC** ppenumfmtetc); 
-extern "C" HRESULT __stdcall RegisterFormatEnumerator(LPBC pBC, IEnumFORMATETC *pEFetc, DWORD reserved);          
-extern "C" HRESULT __stdcall RevokeFormatEnumerator(LPBC pBC, IEnumFORMATETC *pEFetc);                            
-extern "C" HRESULT __stdcall RegisterMediaTypeClass(LPBC pBC,UINT ctypes, const LPCSTR* rgszTypes, CLSID *rgclsID, DWORD reserved);    
-extern "C" HRESULT __stdcall FindMediaTypeClass(LPBC pBC, LPCSTR szType, CLSID *pclsID, DWORD reserved);                          
-extern "C" HRESULT __stdcall UrlMkSetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength, DWORD dwReserved);       
-extern "C" HRESULT __stdcall UrlMkGetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength, DWORD *pdwBufferLength, DWORD dwReserved);       
-extern "C" HRESULT __stdcall FindMimeFromData(                                                                                                                  
-                        LPBC pBC,                           
-                        LPCWSTR pwzUrl,                     
-                        LPVOID pBuffer,                     
-                        DWORD cbSize,                       
-                        LPCWSTR pwzMimeProposed,            
-                        DWORD dwMimeFlags,                  
-                        LPWSTR *ppwzMimeOut,                
-                        DWORD dwReserved);                  
-
-
-
-
-extern "C" HRESULT __stdcall ObtainUserAgentString(DWORD dwOption, LPSTR pszUAOut, DWORD* cbSize);       
-extern "C" HRESULT __stdcall CompareSecurityIds(BYTE* pbSecurityId1, DWORD dwLen1, BYTE* pbSecurityId2, DWORD dwLen2, DWORD dwReserved);    
-extern "C" HRESULT __stdcall CompatFlagsFromClsid(CLSID *pclsid, LPDWORD pdwCompatFlags, LPDWORD pdwMiscStatusFlags);             
- 
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-                                                                             
-
-
-
-                                                                             
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IPersistMoniker *LPPERSISTMONIKER;
-
-
-extern "C" const IID IID_IPersistMoniker;
-
-
-    
-    struct __declspec(uuid("79eac9c9-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IPersistMoniker : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassID( 
-             CLSID *pClassID) = 0;
-        
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             BOOL fFullyAvailable,
-             IMoniker *pimkName,
-             LPBC pibc,
-             DWORD grfMode) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IMoniker *pimkName,
-             LPBC pbc,
-             BOOL fRemember) = 0;
-        
-        virtual HRESULT __stdcall SaveCompleted( 
-             IMoniker *pimkName,
-             LPBC pibc) = 0;
-        
-        virtual HRESULT __stdcall GetCurMoniker( 
-             IMoniker **ppimkName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistMoniker_GetClassID_Proxy( 
-    IPersistMoniker * This,
-     CLSID *pClassID);
-
-
-void __stdcall IPersistMoniker_GetClassID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_IsDirty_Proxy( 
-    IPersistMoniker * This);
-
-
-void __stdcall IPersistMoniker_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_Load_Proxy( 
-    IPersistMoniker * This,
-     BOOL fFullyAvailable,
-     IMoniker *pimkName,
-     LPBC pibc,
-     DWORD grfMode);
-
-
-void __stdcall IPersistMoniker_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_Save_Proxy( 
-    IPersistMoniker * This,
-     IMoniker *pimkName,
-     LPBC pbc,
-     BOOL fRemember);
-
-
-void __stdcall IPersistMoniker_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_SaveCompleted_Proxy( 
-    IPersistMoniker * This,
-     IMoniker *pimkName,
-     LPBC pibc);
-
-
-void __stdcall IPersistMoniker_SaveCompleted_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_GetCurMoniker_Proxy( 
-    IPersistMoniker * This,
-     IMoniker **ppimkName);
-
-
-void __stdcall IPersistMoniker_GetCurMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0178_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0178_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IMonikerProp *LPMONIKERPROP;
-
-typedef  
-enum __MIDL_IMonikerProp_0001
-    {	MIMETYPEPROP	= 0,
-	USE_SRC_URL	= 0x1,
-	CLASSIDPROP	= 0x2,
-	TRUSTEDDOWNLOADPROP	= 0x3,
-	POPUPLEVELPROP	= 0x4
-    } 	MONIKERPROPERTY;
-
-
-extern "C" const IID IID_IMonikerProp;
-
-
-    
-    struct __declspec(uuid("a5ca5f7f-1847-4d87-9c5b-918509f7511d")) __declspec(novtable)
-    IMonikerProp : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall PutProperty( 
-             MONIKERPROPERTY mkp,
-             LPCWSTR val) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IMonikerProp_PutProperty_Proxy( 
-    IMonikerProp * This,
-     MONIKERPROPERTY mkp,
-     LPCWSTR val);
-
-
-void __stdcall IMonikerProp_PutProperty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0179_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0179_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IBindProtocol *LPBINDPROTOCOL;
-
-
-extern "C" const IID IID_IBindProtocol;
-
-
-    
-    struct __declspec(uuid("79eac9cd-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IBindProtocol : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateBinding( 
-             LPCWSTR szUrl,
-             IBindCtx *pbc,
-             IBinding **ppb) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBindProtocol_CreateBinding_Proxy( 
-    IBindProtocol * This,
-     LPCWSTR szUrl,
-     IBindCtx *pbc,
-     IBinding **ppb);
-
-
-void __stdcall IBindProtocol_CreateBinding_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0180_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0180_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IBinding *LPBINDING;
-
-
-extern "C" const IID IID_IBinding;
-
-
-    
-    struct __declspec(uuid("79eac9c0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IBinding : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Abort( void) = 0;
-        
-        virtual HRESULT __stdcall Suspend( void) = 0;
-        
-        virtual HRESULT __stdcall Resume( void) = 0;
-        
-        virtual HRESULT __stdcall SetPriority( 
-             LONG nPriority) = 0;
-        
-        virtual HRESULT __stdcall GetPriority( 
-             LONG *pnPriority) = 0;
-        
-        virtual  HRESULT __stdcall GetBindResult( 
-             CLSID *pclsidProtocol,
-             DWORD *pdwResult,
-             LPOLESTR *pszResult,
-             DWORD *pdwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBinding_Abort_Proxy( 
-    IBinding * This);
-
-
-void __stdcall IBinding_Abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBinding_Suspend_Proxy( 
-    IBinding * This);
-
-
-void __stdcall IBinding_Suspend_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBinding_Resume_Proxy( 
-    IBinding * This);
-
-
-void __stdcall IBinding_Resume_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBinding_SetPriority_Proxy( 
-    IBinding * This,
-     LONG nPriority);
-
-
-void __stdcall IBinding_SetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBinding_GetPriority_Proxy( 
-    IBinding * This,
-     LONG *pnPriority);
-
-
-void __stdcall IBinding_GetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBinding_RemoteGetBindResult_Proxy( 
-    IBinding * This,
-     CLSID *pclsidProtocol,
-     DWORD *pdwResult,
-     LPOLESTR *pszResult,
-     DWORD dwReserved);
-
-
-void __stdcall IBinding_RemoteGetBindResult_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0181_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0181_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IBindStatusCallback *LPBINDSTATUSCALLBACK;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0001
-    {	BINDVERB_GET	= 0,
-	BINDVERB_POST	= 0x1,
-	BINDVERB_PUT	= 0x2,
-	BINDVERB_CUSTOM	= 0x3
-    } 	BINDVERB;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0002
-    {	BINDINFOF_URLENCODESTGMEDDATA	= 0x1,
-	BINDINFOF_URLENCODEDEXTRAINFO	= 0x2
-    } 	BINDINFOF;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0003
-    {	BINDF_ASYNCHRONOUS	= 0x1,
-	BINDF_ASYNCSTORAGE	= 0x2,
-	BINDF_NOPROGRESSIVERENDERING	= 0x4,
-	BINDF_OFFLINEOPERATION	= 0x8,
-	BINDF_GETNEWESTVERSION	= 0x10,
-	BINDF_NOWRITECACHE	= 0x20,
-	BINDF_NEEDFILE	= 0x40,
-	BINDF_PULLDATA	= 0x80,
-	BINDF_IGNORESECURITYPROBLEM	= 0x100,
-	BINDF_RESYNCHRONIZE	= 0x200,
-	BINDF_HYPERLINK	= 0x400,
-	BINDF_NO_UI	= 0x800,
-	BINDF_SILENTOPERATION	= 0x1000,
-	BINDF_PRAGMA_NO_CACHE	= 0x2000,
-	BINDF_GETCLASSOBJECT	= 0x4000,
-	BINDF_RESERVED_1	= 0x8000,
-	BINDF_FREE_THREADED	= 0x10000,
-	BINDF_DIRECT_READ	= 0x20000,
-	BINDF_FORMS_SUBMIT	= 0x40000,
-	BINDF_GETFROMCACHE_IF_NET_FAIL	= 0x80000,
-	BINDF_FROMURLMON	= 0x100000,
-	BINDF_FWD_BACK	= 0x200000,
-	BINDF_PREFERDEFAULTHANDLER	= 0x400000,
-	BINDF_ENFORCERESTRICTED	= 0x800000
-    } 	BINDF;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0004
-    {	URL_ENCODING_NONE	= 0,
-	URL_ENCODING_ENABLE_UTF8	= 0x10000000,
-	URL_ENCODING_DISABLE_UTF8	= 0x20000000
-    } 	URL_ENCODING;
-
-typedef struct _tagBINDINFO
-    {
-    ULONG cbSize;
-    LPWSTR szExtraInfo;
-    STGMEDIUM stgmedData;
-    DWORD grfBindInfoF;
-    DWORD dwBindVerb;
-    LPWSTR szCustomVerb;
-    DWORD cbstgmedData;
-    DWORD dwOptions;
-    DWORD dwOptionsFlags;
-    DWORD dwCodePage;
-    SECURITY_ATTRIBUTES securityAttributes;
-    IID iid;
-    IUnknown *pUnk;
-    DWORD dwReserved;
-    } 	BINDINFO;
-
-typedef struct _REMSECURITY_ATTRIBUTES
-    {
-    DWORD nLength;
-    DWORD lpSecurityDescriptor;
-    BOOL bInheritHandle;
-    } 	REMSECURITY_ATTRIBUTES;
-
-typedef struct _REMSECURITY_ATTRIBUTES *PREMSECURITY_ATTRIBUTES;
-
-typedef struct _REMSECURITY_ATTRIBUTES *LPREMSECURITY_ATTRIBUTES;
-
-typedef struct _tagRemBINDINFO
-    {
-    ULONG cbSize;
-    LPWSTR szExtraInfo;
-    DWORD grfBindInfoF;
-    DWORD dwBindVerb;
-    LPWSTR szCustomVerb;
-    DWORD cbstgmedData;
-    DWORD dwOptions;
-    DWORD dwOptionsFlags;
-    DWORD dwCodePage;
-    REMSECURITY_ATTRIBUTES securityAttributes;
-    IID iid;
-    IUnknown *pUnk;
-    DWORD dwReserved;
-    } 	RemBINDINFO;
-
-typedef struct tagRemFORMATETC
-    {
-    DWORD cfFormat;
-    DWORD ptd;
-    DWORD dwAspect;
-    LONG lindex;
-    DWORD tymed;
-    } 	RemFORMATETC;
-
-typedef struct tagRemFORMATETC *LPREMFORMATETC;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0005
-    {	BINDINFO_OPTIONS_WININETFLAG	= 0x10000,
-	BINDINFO_OPTIONS_ENABLE_UTF8	= 0x20000,
-	BINDINFO_OPTIONS_DISABLE_UTF8	= 0x40000,
-	BINDINFO_OPTIONS_USE_IE_ENCODING	= 0x80000,
-	BINDINFO_OPTIONS_BINDTOOBJECT	= 0x100000,
-	BINDINFO_OPTIONS_SECURITYOPTOUT	= 0x200000,
-	BINDINFO_OPTIONS_IGNOREMIMETEXTPLAIN	= 0x400000,
-	BINDINFO_OPTIONS_USEBINDSTRINGCREDS	= 0x800000,
-	BINDINFO_OPTIONS_IGNOREHTTPHTTPSREDIRECTS	= 0x1000000,
-	BINDINFO_OPTIONS_SHDOCVW_NAVIGATE	= 0x80000000
-    } 	BINDINFO_OPTIONS;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0006
-    {	BSCF_FIRSTDATANOTIFICATION	= 0x1,
-	BSCF_INTERMEDIATEDATANOTIFICATION	= 0x2,
-	BSCF_LASTDATANOTIFICATION	= 0x4,
-	BSCF_DATAFULLYAVAILABLE	= 0x8,
-	BSCF_AVAILABLEDATASIZEUNKNOWN	= 0x10
-    } 	BSCF;
-
-typedef 
-enum tagBINDSTATUS
-    {	BINDSTATUS_FINDINGRESOURCE	= 1,
-	BINDSTATUS_CONNECTING	= BINDSTATUS_FINDINGRESOURCE + 1,
-	BINDSTATUS_REDIRECTING	= BINDSTATUS_CONNECTING + 1,
-	BINDSTATUS_BEGINDOWNLOADDATA	= BINDSTATUS_REDIRECTING + 1,
-	BINDSTATUS_DOWNLOADINGDATA	= BINDSTATUS_BEGINDOWNLOADDATA + 1,
-	BINDSTATUS_ENDDOWNLOADDATA	= BINDSTATUS_DOWNLOADINGDATA + 1,
-	BINDSTATUS_BEGINDOWNLOADCOMPONENTS	= BINDSTATUS_ENDDOWNLOADDATA + 1,
-	BINDSTATUS_INSTALLINGCOMPONENTS	= BINDSTATUS_BEGINDOWNLOADCOMPONENTS + 1,
-	BINDSTATUS_ENDDOWNLOADCOMPONENTS	= BINDSTATUS_INSTALLINGCOMPONENTS + 1,
-	BINDSTATUS_USINGCACHEDCOPY	= BINDSTATUS_ENDDOWNLOADCOMPONENTS + 1,
-	BINDSTATUS_SENDINGREQUEST	= BINDSTATUS_USINGCACHEDCOPY + 1,
-	BINDSTATUS_CLASSIDAVAILABLE	= BINDSTATUS_SENDINGREQUEST + 1,
-	BINDSTATUS_MIMETYPEAVAILABLE	= BINDSTATUS_CLASSIDAVAILABLE + 1,
-	BINDSTATUS_CACHEFILENAMEAVAILABLE	= BINDSTATUS_MIMETYPEAVAILABLE + 1,
-	BINDSTATUS_BEGINSYNCOPERATION	= BINDSTATUS_CACHEFILENAMEAVAILABLE + 1,
-	BINDSTATUS_ENDSYNCOPERATION	= BINDSTATUS_BEGINSYNCOPERATION + 1,
-	BINDSTATUS_BEGINUPLOADDATA	= BINDSTATUS_ENDSYNCOPERATION + 1,
-	BINDSTATUS_UPLOADINGDATA	= BINDSTATUS_BEGINUPLOADDATA + 1,
-	BINDSTATUS_ENDUPLOADDATA	= BINDSTATUS_UPLOADINGDATA + 1,
-	BINDSTATUS_PROTOCOLCLASSID	= BINDSTATUS_ENDUPLOADDATA + 1,
-	BINDSTATUS_ENCODING	= BINDSTATUS_PROTOCOLCLASSID + 1,
-	BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE	= BINDSTATUS_ENCODING + 1,
-	BINDSTATUS_CLASSINSTALLLOCATION	= BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE + 1,
-	BINDSTATUS_DECODING	= BINDSTATUS_CLASSINSTALLLOCATION + 1,
-	BINDSTATUS_LOADINGMIMEHANDLER	= BINDSTATUS_DECODING + 1,
-	BINDSTATUS_CONTENTDISPOSITIONATTACH	= BINDSTATUS_LOADINGMIMEHANDLER + 1,
-	BINDSTATUS_FILTERREPORTMIMETYPE	= BINDSTATUS_CONTENTDISPOSITIONATTACH + 1,
-	BINDSTATUS_CLSIDCANINSTANTIATE	= BINDSTATUS_FILTERREPORTMIMETYPE + 1,
-	BINDSTATUS_IUNKNOWNAVAILABLE	= BINDSTATUS_CLSIDCANINSTANTIATE + 1,
-	BINDSTATUS_DIRECTBIND	= BINDSTATUS_IUNKNOWNAVAILABLE + 1,
-	BINDSTATUS_RAWMIMETYPE	= BINDSTATUS_DIRECTBIND + 1,
-	BINDSTATUS_PROXYDETECTING	= BINDSTATUS_RAWMIMETYPE + 1,
-	BINDSTATUS_ACCEPTRANGES	= BINDSTATUS_PROXYDETECTING + 1,
-	BINDSTATUS_COOKIE_SENT	= BINDSTATUS_ACCEPTRANGES + 1,
-	BINDSTATUS_COMPACT_POLICY_RECEIVED	= BINDSTATUS_COOKIE_SENT + 1,
-	BINDSTATUS_COOKIE_SUPPRESSED	= BINDSTATUS_COMPACT_POLICY_RECEIVED + 1,
-	BINDSTATUS_COOKIE_STATE_UNKNOWN	= BINDSTATUS_COOKIE_SUPPRESSED + 1,
-	BINDSTATUS_COOKIE_STATE_ACCEPT	= BINDSTATUS_COOKIE_STATE_UNKNOWN + 1,
-	BINDSTATUS_COOKIE_STATE_REJECT	= BINDSTATUS_COOKIE_STATE_ACCEPT + 1,
-	BINDSTATUS_COOKIE_STATE_PROMPT	= BINDSTATUS_COOKIE_STATE_REJECT + 1,
-	BINDSTATUS_COOKIE_STATE_LEASH	= BINDSTATUS_COOKIE_STATE_PROMPT + 1,
-	BINDSTATUS_COOKIE_STATE_DOWNGRADE	= BINDSTATUS_COOKIE_STATE_LEASH + 1,
-	BINDSTATUS_POLICY_HREF	= BINDSTATUS_COOKIE_STATE_DOWNGRADE + 1,
-	BINDSTATUS_P3P_HEADER	= BINDSTATUS_POLICY_HREF + 1,
-	BINDSTATUS_SESSION_COOKIE_RECEIVED	= BINDSTATUS_P3P_HEADER + 1,
-	BINDSTATUS_PERSISTENT_COOKIE_RECEIVED	= BINDSTATUS_SESSION_COOKIE_RECEIVED + 1,
-	BINDSTATUS_SESSION_COOKIES_ALLOWED	= BINDSTATUS_PERSISTENT_COOKIE_RECEIVED + 1,
-	BINDSTATUS_CACHECONTROL	= BINDSTATUS_SESSION_COOKIES_ALLOWED + 1,
-	BINDSTATUS_CONTENTDISPOSITIONFILENAME	= BINDSTATUS_CACHECONTROL + 1,
-	BINDSTATUS_MIMETEXTPLAINMISMATCH	= BINDSTATUS_CONTENTDISPOSITIONFILENAME + 1,
-	BINDSTATUS_PUBLISHERAVAILABLE	= BINDSTATUS_MIMETEXTPLAINMISMATCH + 1,
-	BINDSTATUS_DISPLAYNAMEAVAILABLE	= BINDSTATUS_PUBLISHERAVAILABLE + 1
-    } 	BINDSTATUS;
-
-
-extern "C" const IID IID_IBindStatusCallback;
-
-
-    
-    struct __declspec(uuid("79eac9c1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IBindStatusCallback : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnStartBinding( 
-             DWORD dwReserved,
-             IBinding *pib) = 0;
-        
-        virtual HRESULT __stdcall GetPriority( 
-             LONG *pnPriority) = 0;
-        
-        virtual HRESULT __stdcall OnLowResource( 
-             DWORD reserved) = 0;
-        
-        virtual HRESULT __stdcall OnProgress( 
-             ULONG ulProgress,
-             ULONG ulProgressMax,
-             ULONG ulStatusCode,
-             LPCWSTR szStatusText) = 0;
-        
-        virtual HRESULT __stdcall OnStopBinding( 
-             HRESULT hresult,
-             LPCWSTR szError) = 0;
-        
-        virtual  HRESULT __stdcall GetBindInfo( 
-             DWORD *grfBINDF,
-             BINDINFO *pbindinfo) = 0;
-        
-        virtual  HRESULT __stdcall OnDataAvailable( 
-             DWORD grfBSCF,
-             DWORD dwSize,
-             FORMATETC *pformatetc,
-             STGMEDIUM *pstgmed) = 0;
-        
-        virtual HRESULT __stdcall OnObjectAvailable( 
-             const IID & riid,
-             IUnknown *punk) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBindStatusCallback_OnStartBinding_Proxy( 
-    IBindStatusCallback * This,
-     DWORD dwReserved,
-     IBinding *pib);
-
-
-void __stdcall IBindStatusCallback_OnStartBinding_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_GetPriority_Proxy( 
-    IBindStatusCallback * This,
-     LONG *pnPriority);
-
-
-void __stdcall IBindStatusCallback_GetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_OnLowResource_Proxy( 
-    IBindStatusCallback * This,
-     DWORD reserved);
-
-
-void __stdcall IBindStatusCallback_OnLowResource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_OnProgress_Proxy( 
-    IBindStatusCallback * This,
-     ULONG ulProgress,
-     ULONG ulProgressMax,
-     ULONG ulStatusCode,
-     LPCWSTR szStatusText);
-
-
-void __stdcall IBindStatusCallback_OnProgress_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_OnStopBinding_Proxy( 
-    IBindStatusCallback * This,
-     HRESULT hresult,
-     LPCWSTR szError);
-
-
-void __stdcall IBindStatusCallback_OnStopBinding_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindStatusCallback_RemoteGetBindInfo_Proxy( 
-    IBindStatusCallback * This,
-     DWORD *grfBINDF,
-     RemBINDINFO *pbindinfo,
-     RemSTGMEDIUM *pstgmed);
-
-
-void __stdcall IBindStatusCallback_RemoteGetBindInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindStatusCallback_RemoteOnDataAvailable_Proxy( 
-    IBindStatusCallback * This,
-     DWORD grfBSCF,
-     DWORD dwSize,
-     RemFORMATETC *pformatetc,
-     RemSTGMEDIUM *pstgmed);
-
-
-void __stdcall IBindStatusCallback_RemoteOnDataAvailable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_OnObjectAvailable_Proxy( 
-    IBindStatusCallback * This,
-     const IID & riid,
-     IUnknown *punk);
-
-
-void __stdcall IBindStatusCallback_OnObjectAvailable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0182_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0182_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IAuthenticate *LPAUTHENTICATION;
-
-
-extern "C" const IID IID_IAuthenticate;
-
-
-    
-    struct __declspec(uuid("79eac9d0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IAuthenticate : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Authenticate( 
-             HWND *phwnd,
-             LPWSTR *pszUsername,
-             LPWSTR *pszPassword) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAuthenticate_Authenticate_Proxy( 
-    IAuthenticate * This,
-     HWND *phwnd,
-     LPWSTR *pszUsername,
-     LPWSTR *pszPassword);
-
-
-void __stdcall IAuthenticate_Authenticate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0183_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0183_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IHttpNegotiate *LPHTTPNEGOTIATE;
-
-
-extern "C" const IID IID_IHttpNegotiate;
-
-
-    
-    struct __declspec(uuid("79eac9d2-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IHttpNegotiate : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall BeginningTransaction( 
-             LPCWSTR szURL,
-             LPCWSTR szHeaders,
-             DWORD dwReserved,
-             LPWSTR *pszAdditionalHeaders) = 0;
-        
-        virtual HRESULT __stdcall OnResponse( 
-             DWORD dwResponseCode,
-             LPCWSTR szResponseHeaders,
-             LPCWSTR szRequestHeaders,
-             LPWSTR *pszAdditionalRequestHeaders) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IHttpNegotiate_BeginningTransaction_Proxy( 
-    IHttpNegotiate * This,
-     LPCWSTR szURL,
-     LPCWSTR szHeaders,
-     DWORD dwReserved,
-     LPWSTR *pszAdditionalHeaders);
-
-
-void __stdcall IHttpNegotiate_BeginningTransaction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IHttpNegotiate_OnResponse_Proxy( 
-    IHttpNegotiate * This,
-     DWORD dwResponseCode,
-     LPCWSTR szResponseHeaders,
-     LPCWSTR szRequestHeaders,
-     LPWSTR *pszAdditionalRequestHeaders);
-
-
-void __stdcall IHttpNegotiate_OnResponse_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0184_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0184_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IHttpNegotiate2 *LPHTTPNEGOTIATE2;
-
-
-extern "C" const IID IID_IHttpNegotiate2;
-
-
-    
-    struct __declspec(uuid("4F9F9FCB-E0F4-48eb-B7AB-FA2EA9365CB4")) __declspec(novtable)
-    IHttpNegotiate2 : public IHttpNegotiate
-    {
-    public:
-        virtual HRESULT __stdcall GetRootSecurityId( 
-             BYTE *pbSecurityId,
-             DWORD *pcbSecurityId,
-             DWORD_PTR dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IHttpNegotiate2_GetRootSecurityId_Proxy( 
-    IHttpNegotiate2 * This,
-     BYTE *pbSecurityId,
-     DWORD *pcbSecurityId,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IHttpNegotiate2_GetRootSecurityId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0185_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0185_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWinInetFileStream *LPWININETFILESTREAM;
-
-
-extern "C" const IID IID_IWinInetFileStream;
-
-
-    
-    struct __declspec(uuid("F134C4B7-B1F8-4e75-B886-74B90943BECB")) __declspec(novtable)
-    IWinInetFileStream : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetHandleForUnlock( 
-             DWORD_PTR hWinInetLockHandle,
-             DWORD_PTR dwReserved) = 0;
-        
-        virtual HRESULT __stdcall SetDeleteFile( 
-             DWORD_PTR dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWinInetFileStream_SetHandleForUnlock_Proxy( 
-    IWinInetFileStream * This,
-     DWORD_PTR hWinInetLockHandle,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IWinInetFileStream_SetHandleForUnlock_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IWinInetFileStream_SetDeleteFile_Proxy( 
-    IWinInetFileStream * This,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IWinInetFileStream_SetDeleteFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0186_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0186_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWindowForBindingUI *LPWINDOWFORBINDINGUI;
-
-
-extern "C" const IID IID_IWindowForBindingUI;
-
-
-    
-    struct __declspec(uuid("79eac9d5-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IWindowForBindingUI : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetWindow( 
-             const GUID & rguidReason,
-             HWND *phwnd) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWindowForBindingUI_GetWindow_Proxy( 
-    IWindowForBindingUI * This,
-     const GUID & rguidReason,
-     HWND *phwnd);
-
-
-void __stdcall IWindowForBindingUI_GetWindow_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0187_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0187_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  ICodeInstall *LPCODEINSTALL;
-
-typedef  
-enum __MIDL_ICodeInstall_0001
-    {	CIP_DISK_FULL	= 0,
-	CIP_ACCESS_DENIED	= CIP_DISK_FULL + 1,
-	CIP_NEWER_VERSION_EXISTS	= CIP_ACCESS_DENIED + 1,
-	CIP_OLDER_VERSION_EXISTS	= CIP_NEWER_VERSION_EXISTS + 1,
-	CIP_NAME_CONFLICT	= CIP_OLDER_VERSION_EXISTS + 1,
-	CIP_TRUST_VERIFICATION_COMPONENT_MISSING	= CIP_NAME_CONFLICT + 1,
-	CIP_EXE_SELF_REGISTERATION_TIMEOUT	= CIP_TRUST_VERIFICATION_COMPONENT_MISSING + 1,
-	CIP_UNSAFE_TO_ABORT	= CIP_EXE_SELF_REGISTERATION_TIMEOUT + 1,
-	CIP_NEED_REBOOT	= CIP_UNSAFE_TO_ABORT + 1,
-	CIP_NEED_REBOOT_UI_PERMISSION	= CIP_NEED_REBOOT + 1
-    } 	CIP_STATUS;
-
-
-extern "C" const IID IID_ICodeInstall;
-
-
-    
-    struct __declspec(uuid("79eac9d1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    ICodeInstall : public IWindowForBindingUI
-    {
-    public:
-        virtual HRESULT __stdcall OnCodeInstallProblem( 
-             ULONG ulStatusCode,
-             LPCWSTR szDestination,
-             LPCWSTR szSource,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICodeInstall_OnCodeInstallProblem_Proxy( 
-    ICodeInstall * This,
-     ULONG ulStatusCode,
-     LPCWSTR szDestination,
-     LPCWSTR szSource,
-     DWORD dwReserved);
-
-
-void __stdcall ICodeInstall_OnCodeInstallProblem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0188_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0188_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWinInetInfo *LPWININETINFO;
-
-
-extern "C" const IID IID_IWinInetInfo;
-
-
-    
-    struct __declspec(uuid("79eac9d6-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IWinInetInfo : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall QueryOption( 
-             DWORD dwOption,
-             LPVOID pBuffer,
-             DWORD *pcbBuf) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IWinInetInfo_RemoteQueryOption_Proxy( 
-    IWinInetInfo * This,
-     DWORD dwOption,
-     BYTE *pBuffer,
-     DWORD *pcbBuf);
-
-
-void __stdcall IWinInetInfo_RemoteQueryOption_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0189_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0189_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IHttpSecurity *LPHTTPSECURITY;
-
-
-extern "C" const IID IID_IHttpSecurity;
-
-
-    
-    struct __declspec(uuid("79eac9d7-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IHttpSecurity : public IWindowForBindingUI
-    {
-    public:
-        virtual HRESULT __stdcall OnSecurityProblem( 
-             DWORD dwProblem) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IHttpSecurity_OnSecurityProblem_Proxy( 
-    IHttpSecurity * This,
-     DWORD dwProblem);
-
-
-void __stdcall IHttpSecurity_OnSecurityProblem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0190_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0190_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWinInetHttpInfo *LPWININETHTTPINFO;
-
-
-extern "C" const IID IID_IWinInetHttpInfo;
-
-
-    
-    struct __declspec(uuid("79eac9d8-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IWinInetHttpInfo : public IWinInetInfo
-    {
-    public:
-        virtual  HRESULT __stdcall QueryInfo( 
-             DWORD dwOption,
-             LPVOID pBuffer,
-             DWORD *pcbBuf,
-             DWORD *pdwFlags,
-             DWORD *pdwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IWinInetHttpInfo_RemoteQueryInfo_Proxy( 
-    IWinInetHttpInfo * This,
-     DWORD dwOption,
-     BYTE *pBuffer,
-     DWORD *pcbBuf,
-     DWORD *pdwFlags,
-     DWORD *pdwReserved);
-
-
-void __stdcall IWinInetHttpInfo_RemoteQueryInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0191_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0191_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWinInetCacheHints *LPWININETCACHEHINTS;
-
-
-extern "C" const IID IID_IWinInetCacheHints;
-
-
-    
-    struct __declspec(uuid("DD1EC3B3-8391-4fdb-A9E6-347C3CAAA7DD")) __declspec(novtable)
-    IWinInetCacheHints : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetCacheExtension( 
-             LPCWSTR pwzExt,
-             LPVOID pszCacheFile,
-             DWORD *pcbCacheFile,
-             DWORD *pdwWinInetError,
-             DWORD *pdwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWinInetCacheHints_SetCacheExtension_Proxy( 
-    IWinInetCacheHints * This,
-     LPCWSTR pwzExt,
-     LPVOID pszCacheFile,
-     DWORD *pcbCacheFile,
-     DWORD *pdwWinInetError,
-     DWORD *pdwReserved);
-
-
-void __stdcall IWinInetCacheHints_SetCacheExtension_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern "C" const GUID SID_BindHost;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0192_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0192_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IBindHost *LPBINDHOST;
-
-
-extern "C" const IID IID_IBindHost;
-
-
-    
-    struct __declspec(uuid("fc4801a1-2ba9-11cf-a229-00aa003d7352")) __declspec(novtable)
-    IBindHost : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateMoniker( 
-             LPOLESTR szName,
-             IBindCtx *pBC,
-             IMoniker **ppmk,
-             DWORD dwReserved) = 0;
-        
-        virtual  HRESULT __stdcall MonikerBindToStorage( 
-             IMoniker *pMk,
-             IBindCtx *pBC,
-             IBindStatusCallback *pBSC,
-             const IID & riid,
-             void **ppvObj) = 0;
-        
-        virtual  HRESULT __stdcall MonikerBindToObject( 
-             IMoniker *pMk,
-             IBindCtx *pBC,
-             IBindStatusCallback *pBSC,
-             const IID & riid,
-             void **ppvObj) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBindHost_CreateMoniker_Proxy( 
-    IBindHost * This,
-     LPOLESTR szName,
-     IBindCtx *pBC,
-     IMoniker **ppmk,
-     DWORD dwReserved);
-
-
-void __stdcall IBindHost_CreateMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindHost_RemoteMonikerBindToStorage_Proxy( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-void __stdcall IBindHost_RemoteMonikerBindToStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindHost_RemoteMonikerBindToObject_Proxy( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-void __stdcall IBindHost_RemoteMonikerBindToObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-                                                                                                           
-
-
-
-
-
-                                                                                                           
-                                                                                                           
-struct IBindStatusCallback;                                                                                
-extern "C" HRESULT __stdcall HlinkSimpleNavigateToString(                                                                        
-     LPCWSTR szTarget,         
-     LPCWSTR szLocation,       
-     LPCWSTR szTargetFrameName,
-     IUnknown *pUnk,           
-     IBindCtx *pbc,            
-     IBindStatusCallback *,                                                                      
-     DWORD grfHLNF,            
-     DWORD dwReserved          
-);                                                                                                         
-                                                                                                           
-extern "C" HRESULT __stdcall HlinkSimpleNavigateToMoniker(                                                                       
-     IMoniker *pmkTarget,      
-     LPCWSTR szLocation,       
-     LPCWSTR szTargetFrameName,
-     IUnknown *pUnk,           
-     IBindCtx *pbc,            
-     IBindStatusCallback *,                                                                      
-     DWORD grfHLNF,            
-     DWORD dwReserved          
-);                                                                                                         
-                                                                                                           
-extern "C" HRESULT __stdcall URLOpenStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                                        
-extern "C" HRESULT __stdcall URLOpenStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                                       
-extern "C" HRESULT __stdcall URLOpenPullStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                                    
-extern "C" HRESULT __stdcall URLOpenPullStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                                   
-extern "C" HRESULT __stdcall URLDownloadToFileA(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                             
-extern "C" HRESULT __stdcall URLDownloadToFileW(LPUNKNOWN,LPCWSTR,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                           
-extern "C" HRESULT __stdcall URLDownloadToCacheFileA(LPUNKNOWN,LPCSTR,LPTSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);                  
-extern "C" HRESULT __stdcall URLDownloadToCacheFileW(LPUNKNOWN,LPCWSTR,LPWSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);                 
-extern "C" HRESULT __stdcall URLOpenBlockingStreamA(LPUNKNOWN,LPCSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);                      
-extern "C" HRESULT __stdcall URLOpenBlockingStreamW(LPUNKNOWN,LPCWSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);                     
-                                                                                                           
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                                                                           
-                                                                                                           
-extern "C" HRESULT __stdcall HlinkGoBack(IUnknown *pUnk);                                                                        
-extern "C" HRESULT __stdcall HlinkGoForward(IUnknown *pUnk);                                                                     
-extern "C" HRESULT __stdcall HlinkNavigateString(IUnknown *pUnk, LPCWSTR szTarget);                                              
-extern "C" HRESULT __stdcall HlinkNavigateMoniker(IUnknown *pUnk, IMoniker *pmkTarget);                                          
-                                                                                                           
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0193_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0193_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternet *LPIINTERNET;
-
-
-extern "C" const IID IID_IInternet;
-
-
-    
-    struct __declspec(uuid("79eac9e0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternet : public IUnknown
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0194_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0194_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetBindInfo *LPIINTERNETBINDINFO;
-
-typedef 
-enum tagBINDSTRING
-    {	BINDSTRING_HEADERS	= 1,
-	BINDSTRING_ACCEPT_MIMES	= BINDSTRING_HEADERS + 1,
-	BINDSTRING_EXTRA_URL	= BINDSTRING_ACCEPT_MIMES + 1,
-	BINDSTRING_LANGUAGE	= BINDSTRING_EXTRA_URL + 1,
-	BINDSTRING_USERNAME	= BINDSTRING_LANGUAGE + 1,
-	BINDSTRING_PASSWORD	= BINDSTRING_USERNAME + 1,
-	BINDSTRING_UA_PIXELS	= BINDSTRING_PASSWORD + 1,
-	BINDSTRING_UA_COLOR	= BINDSTRING_UA_PIXELS + 1,
-	BINDSTRING_OS	= BINDSTRING_UA_COLOR + 1,
-	BINDSTRING_USER_AGENT	= BINDSTRING_OS + 1,
-	BINDSTRING_ACCEPT_ENCODINGS	= BINDSTRING_USER_AGENT + 1,
-	BINDSTRING_POST_COOKIE	= BINDSTRING_ACCEPT_ENCODINGS + 1,
-	BINDSTRING_POST_DATA_MIME	= BINDSTRING_POST_COOKIE + 1,
-	BINDSTRING_URL	= BINDSTRING_POST_DATA_MIME + 1,
-	BINDSTRING_IID	= BINDSTRING_URL + 1,
-	BINDSTRING_FLAG_BIND_TO_OBJECT	= BINDSTRING_IID + 1,
-	BINDSTRING_PTR_BIND_CONTEXT	= BINDSTRING_FLAG_BIND_TO_OBJECT + 1
-    } 	BINDSTRING;
-
-
-extern "C" const IID IID_IInternetBindInfo;
-
-
-    
-    struct __declspec(uuid("79eac9e1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetBindInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetBindInfo( 
-             DWORD *grfBINDF,
-             BINDINFO *pbindinfo) = 0;
-        
-        virtual HRESULT __stdcall GetBindString( 
-             ULONG ulStringType,
-             LPOLESTR *ppwzStr,
-             ULONG cEl,
-             ULONG *pcElFetched) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetBindInfo_GetBindInfo_Proxy( 
-    IInternetBindInfo * This,
-     DWORD *grfBINDF,
-     BINDINFO *pbindinfo);
-
-
-void __stdcall IInternetBindInfo_GetBindInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetBindInfo_GetBindString_Proxy( 
-    IInternetBindInfo * This,
-     ULONG ulStringType,
-     LPOLESTR *ppwzStr,
-     ULONG cEl,
-     ULONG *pcElFetched);
-
-
-void __stdcall IInternetBindInfo_GetBindString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0195_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0195_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocolRoot *LPIINTERNETPROTOCOLROOT;
-
-typedef 
-enum _tagPI_FLAGS
-    {	PI_PARSE_URL	= 0x1,
-	PI_FILTER_MODE	= 0x2,
-	PI_FORCE_ASYNC	= 0x4,
-	PI_USE_WORKERTHREAD	= 0x8,
-	PI_MIMEVERIFICATION	= 0x10,
-	PI_CLSIDLOOKUP	= 0x20,
-	PI_DATAPROGRESS	= 0x40,
-	PI_SYNCHRONOUS	= 0x80,
-	PI_APARTMENTTHREADED	= 0x100,
-	PI_CLASSINSTALL	= 0x200,
-	PI_PASSONBINDCTX	= 0x2000,
-	PI_NOMIMEHANDLER	= 0x8000,
-	PI_LOADAPPDIRECT	= 0x4000,
-	PD_FORCE_SWITCH	= 0x10000,
-	PI_PREFERDEFAULTHANDLER	= 0x20000
-    } 	PI_FLAGS;
-
-typedef struct _tagPROTOCOLDATA
-    {
-    DWORD grfFlags;
-    DWORD dwState;
-    LPVOID pData;
-    ULONG cbData;
-    } 	PROTOCOLDATA;
-
-typedef struct _tagStartParam
-    {
-    IID iid;
-    IBindCtx *pIBindCtx;
-    IUnknown *pItf;
-    } 	StartParam;
-
-
-extern "C" const IID IID_IInternetProtocolRoot;
-
-
-    
-    struct __declspec(uuid("79eac9e3-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocolRoot : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Start( 
-             LPCWSTR szUrl,
-             IInternetProtocolSink *pOIProtSink,
-             IInternetBindInfo *pOIBindInfo,
-             DWORD grfPI,
-             HANDLE_PTR dwReserved) = 0;
-        
-        virtual HRESULT __stdcall Continue( 
-             PROTOCOLDATA *pProtocolData) = 0;
-        
-        virtual HRESULT __stdcall Abort( 
-             HRESULT hrReason,
-             DWORD dwOptions) = 0;
-        
-        virtual HRESULT __stdcall Terminate( 
-             DWORD dwOptions) = 0;
-        
-        virtual HRESULT __stdcall Suspend( void) = 0;
-        
-        virtual HRESULT __stdcall Resume( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocolRoot_Start_Proxy( 
-    IInternetProtocolRoot * This,
-     LPCWSTR szUrl,
-     IInternetProtocolSink *pOIProtSink,
-     IInternetBindInfo *pOIBindInfo,
-     DWORD grfPI,
-     HANDLE_PTR dwReserved);
-
-
-void __stdcall IInternetProtocolRoot_Start_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Continue_Proxy( 
-    IInternetProtocolRoot * This,
-     PROTOCOLDATA *pProtocolData);
-
-
-void __stdcall IInternetProtocolRoot_Continue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Abort_Proxy( 
-    IInternetProtocolRoot * This,
-     HRESULT hrReason,
-     DWORD dwOptions);
-
-
-void __stdcall IInternetProtocolRoot_Abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Terminate_Proxy( 
-    IInternetProtocolRoot * This,
-     DWORD dwOptions);
-
-
-void __stdcall IInternetProtocolRoot_Terminate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Suspend_Proxy( 
-    IInternetProtocolRoot * This);
-
-
-void __stdcall IInternetProtocolRoot_Suspend_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Resume_Proxy( 
-    IInternetProtocolRoot * This);
-
-
-void __stdcall IInternetProtocolRoot_Resume_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0196_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0196_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocol *LPIINTERNETPROTOCOL;
-
-
-extern "C" const IID IID_IInternetProtocol;
-
-
-    
-    struct __declspec(uuid("79eac9e4-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocol : public IInternetProtocolRoot
-    {
-    public:
-        virtual HRESULT __stdcall Read( 
-             void *pv,
-             ULONG cb,
-             ULONG *pcbRead) = 0;
-        
-        virtual HRESULT __stdcall Seek( 
-             LARGE_INTEGER dlibMove,
-             DWORD dwOrigin,
-             ULARGE_INTEGER *plibNewPosition) = 0;
-        
-        virtual HRESULT __stdcall LockRequest( 
-             DWORD dwOptions) = 0;
-        
-        virtual HRESULT __stdcall UnlockRequest( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocol_Read_Proxy( 
-    IInternetProtocol * This,
-     void *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
-void __stdcall IInternetProtocol_Read_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocol_Seek_Proxy( 
-    IInternetProtocol * This,
-     LARGE_INTEGER dlibMove,
-     DWORD dwOrigin,
-     ULARGE_INTEGER *plibNewPosition);
-
-
-void __stdcall IInternetProtocol_Seek_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocol_LockRequest_Proxy( 
-    IInternetProtocol * This,
-     DWORD dwOptions);
-
-
-void __stdcall IInternetProtocol_LockRequest_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocol_UnlockRequest_Proxy( 
-    IInternetProtocol * This);
-
-
-void __stdcall IInternetProtocol_UnlockRequest_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0197_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0197_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocolSink *LPIINTERNETPROTOCOLSINK;
-
-
-extern "C" const IID IID_IInternetProtocolSink;
-
-
-    
-    struct __declspec(uuid("79eac9e5-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocolSink : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Switch( 
-             PROTOCOLDATA *pProtocolData) = 0;
-        
-        virtual HRESULT __stdcall ReportProgress( 
-             ULONG ulStatusCode,
-             LPCWSTR szStatusText) = 0;
-        
-        virtual HRESULT __stdcall ReportData( 
-             DWORD grfBSCF,
-             ULONG ulProgress,
-             ULONG ulProgressMax) = 0;
-        
-        virtual HRESULT __stdcall ReportResult( 
-             HRESULT hrResult,
-             DWORD dwError,
-             LPCWSTR szResult) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocolSink_Switch_Proxy( 
-    IInternetProtocolSink * This,
-     PROTOCOLDATA *pProtocolData);
-
-
-void __stdcall IInternetProtocolSink_Switch_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSink_ReportProgress_Proxy( 
-    IInternetProtocolSink * This,
-     ULONG ulStatusCode,
-     LPCWSTR szStatusText);
-
-
-void __stdcall IInternetProtocolSink_ReportProgress_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSink_ReportData_Proxy( 
-    IInternetProtocolSink * This,
-     DWORD grfBSCF,
-     ULONG ulProgress,
-     ULONG ulProgressMax);
-
-
-void __stdcall IInternetProtocolSink_ReportData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSink_ReportResult_Proxy( 
-    IInternetProtocolSink * This,
-     HRESULT hrResult,
-     DWORD dwError,
-     LPCWSTR szResult);
-
-
-void __stdcall IInternetProtocolSink_ReportResult_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0198_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0198_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocolSinkStackable *LPIINTERNETPROTOCOLSINKStackable;
-
-
-extern "C" const IID IID_IInternetProtocolSinkStackable;
-
-
-    
-    struct __declspec(uuid("79eac9f0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocolSinkStackable : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SwitchSink( 
-             IInternetProtocolSink *pOIProtSink) = 0;
-        
-        virtual HRESULT __stdcall CommitSwitch( void) = 0;
-        
-        virtual HRESULT __stdcall RollbackSwitch( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocolSinkStackable_SwitchSink_Proxy( 
-    IInternetProtocolSinkStackable * This,
-     IInternetProtocolSink *pOIProtSink);
-
-
-void __stdcall IInternetProtocolSinkStackable_SwitchSink_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSinkStackable_CommitSwitch_Proxy( 
-    IInternetProtocolSinkStackable * This);
-
-
-void __stdcall IInternetProtocolSinkStackable_CommitSwitch_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSinkStackable_RollbackSwitch_Proxy( 
-    IInternetProtocolSinkStackable * This);
-
-
-void __stdcall IInternetProtocolSinkStackable_RollbackSwitch_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0199_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0199_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetSession *LPIINTERNETSESSION;
-
-typedef 
-enum _tagOIBDG_FLAGS
-    {	OIBDG_APARTMENTTHREADED	= 0x100,
-	OIBDG_DATAONLY	= 0x1000
-    } 	OIBDG_FLAGS;
-
-
-extern "C" const IID IID_IInternetSession;
-
-
-    
-    struct __declspec(uuid("79eac9e7-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetSession : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RegisterNameSpace( 
-             IClassFactory *pCF,
-             const IID & rclsid,
-             LPCWSTR pwzProtocol,
-             ULONG cPatterns,
-             const LPCWSTR *ppwzPatterns,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall UnregisterNameSpace( 
-             IClassFactory *pCF,
-             LPCWSTR pszProtocol) = 0;
-        
-        virtual HRESULT __stdcall RegisterMimeFilter( 
-             IClassFactory *pCF,
-             const IID & rclsid,
-             LPCWSTR pwzType) = 0;
-        
-        virtual HRESULT __stdcall UnregisterMimeFilter( 
-             IClassFactory *pCF,
-             LPCWSTR pwzType) = 0;
-        
-        virtual HRESULT __stdcall CreateBinding( 
-             LPBC pBC,
-             LPCWSTR szUrl,
-             IUnknown *pUnkOuter,
-             IUnknown **ppUnk,
-             IInternetProtocol **ppOInetProt,
-             DWORD dwOption) = 0;
-        
-        virtual HRESULT __stdcall SetSessionOption( 
-             DWORD dwOption,
-             LPVOID pBuffer,
-             DWORD dwBufferLength,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall GetSessionOption( 
-             DWORD dwOption,
-             LPVOID pBuffer,
-             DWORD *pdwBufferLength,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetSession_RegisterNameSpace_Proxy( 
-    IInternetSession * This,
-     IClassFactory *pCF,
-     const IID & rclsid,
-     LPCWSTR pwzProtocol,
-     ULONG cPatterns,
-     const LPCWSTR *ppwzPatterns,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSession_RegisterNameSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_UnregisterNameSpace_Proxy( 
-    IInternetSession * This,
-     IClassFactory *pCF,
-     LPCWSTR pszProtocol);
-
-
-void __stdcall IInternetSession_UnregisterNameSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_RegisterMimeFilter_Proxy( 
-    IInternetSession * This,
-     IClassFactory *pCF,
-     const IID & rclsid,
-     LPCWSTR pwzType);
-
-
-void __stdcall IInternetSession_RegisterMimeFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_UnregisterMimeFilter_Proxy( 
-    IInternetSession * This,
-     IClassFactory *pCF,
-     LPCWSTR pwzType);
-
-
-void __stdcall IInternetSession_UnregisterMimeFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_CreateBinding_Proxy( 
-    IInternetSession * This,
-     LPBC pBC,
-     LPCWSTR szUrl,
-     IUnknown *pUnkOuter,
-     IUnknown **ppUnk,
-     IInternetProtocol **ppOInetProt,
-     DWORD dwOption);
-
-
-void __stdcall IInternetSession_CreateBinding_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_SetSessionOption_Proxy( 
-    IInternetSession * This,
-     DWORD dwOption,
-     LPVOID pBuffer,
-     DWORD dwBufferLength,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSession_SetSessionOption_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_GetSessionOption_Proxy( 
-    IInternetSession * This,
-     DWORD dwOption,
-     LPVOID pBuffer,
-     DWORD *pdwBufferLength,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSession_GetSessionOption_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0200_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0200_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetThreadSwitch *LPIINTERNETTHREADSWITCH;
-
-
-extern "C" const IID IID_IInternetThreadSwitch;
-
-
-    
-    struct __declspec(uuid("79eac9e8-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetThreadSwitch : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Prepare( void) = 0;
-        
-        virtual HRESULT __stdcall Continue( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetThreadSwitch_Prepare_Proxy( 
-    IInternetThreadSwitch * This);
-
-
-void __stdcall IInternetThreadSwitch_Prepare_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetThreadSwitch_Continue_Proxy( 
-    IInternetThreadSwitch * This);
-
-
-void __stdcall IInternetThreadSwitch_Continue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0201_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0201_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetPriority *LPIINTERNETPRIORITY;
-
-
-extern "C" const IID IID_IInternetPriority;
-
-
-    
-    struct __declspec(uuid("79eac9eb-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetPriority : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetPriority( 
-             LONG nPriority) = 0;
-        
-        virtual HRESULT __stdcall GetPriority( 
-             LONG *pnPriority) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetPriority_SetPriority_Proxy( 
-    IInternetPriority * This,
-     LONG nPriority);
-
-
-void __stdcall IInternetPriority_SetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetPriority_GetPriority_Proxy( 
-    IInternetPriority * This,
-     LONG *pnPriority);
-
-
-void __stdcall IInternetPriority_GetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0202_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0202_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocolInfo *LPIINTERNETPROTOCOLINFO;
-
-typedef 
-enum _tagPARSEACTION
-    {	PARSE_CANONICALIZE	= 1,
-	PARSE_FRIENDLY	= PARSE_CANONICALIZE + 1,
-	PARSE_SECURITY_URL	= PARSE_FRIENDLY + 1,
-	PARSE_ROOTDOCUMENT	= PARSE_SECURITY_URL + 1,
-	PARSE_DOCUMENT	= PARSE_ROOTDOCUMENT + 1,
-	PARSE_ANCHOR	= PARSE_DOCUMENT + 1,
-	PARSE_ENCODE	= PARSE_ANCHOR + 1,
-	PARSE_DECODE	= PARSE_ENCODE + 1,
-	PARSE_PATH_FROM_URL	= PARSE_DECODE + 1,
-	PARSE_URL_FROM_PATH	= PARSE_PATH_FROM_URL + 1,
-	PARSE_MIME	= PARSE_URL_FROM_PATH + 1,
-	PARSE_SERVER	= PARSE_MIME + 1,
-	PARSE_SCHEMA	= PARSE_SERVER + 1,
-	PARSE_SITE	= PARSE_SCHEMA + 1,
-	PARSE_DOMAIN	= PARSE_SITE + 1,
-	PARSE_LOCATION	= PARSE_DOMAIN + 1,
-	PARSE_SECURITY_DOMAIN	= PARSE_LOCATION + 1,
-	PARSE_ESCAPE	= PARSE_SECURITY_DOMAIN + 1,
-	PARSE_UNESCAPE	= PARSE_ESCAPE + 1
-    } 	PARSEACTION;
-
-typedef 
-enum _tagPSUACTION
-    {	PSU_DEFAULT	= 1,
-	PSU_SECURITY_URL_ONLY	= PSU_DEFAULT + 1
-    } 	PSUACTION;
-
-typedef 
-enum _tagQUERYOPTION
-    {	QUERY_EXPIRATION_DATE	= 1,
-	QUERY_TIME_OF_LAST_CHANGE	= QUERY_EXPIRATION_DATE + 1,
-	QUERY_CONTENT_ENCODING	= QUERY_TIME_OF_LAST_CHANGE + 1,
-	QUERY_CONTENT_TYPE	= QUERY_CONTENT_ENCODING + 1,
-	QUERY_REFRESH	= QUERY_CONTENT_TYPE + 1,
-	QUERY_RECOMBINE	= QUERY_REFRESH + 1,
-	QUERY_CAN_NAVIGATE	= QUERY_RECOMBINE + 1,
-	QUERY_USES_NETWORK	= QUERY_CAN_NAVIGATE + 1,
-	QUERY_IS_CACHED	= QUERY_USES_NETWORK + 1,
-	QUERY_IS_INSTALLEDENTRY	= QUERY_IS_CACHED + 1,
-	QUERY_IS_CACHED_OR_MAPPED	= QUERY_IS_INSTALLEDENTRY + 1,
-	QUERY_USES_CACHE	= QUERY_IS_CACHED_OR_MAPPED + 1,
-	QUERY_IS_SECURE	= QUERY_USES_CACHE + 1,
-	QUERY_IS_SAFE	= QUERY_IS_SECURE + 1
-    } 	QUERYOPTION;
-
-
-extern "C" const IID IID_IInternetProtocolInfo;
-
-
-    
-    struct __declspec(uuid("79eac9ec-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocolInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ParseUrl( 
-             LPCWSTR pwzUrl,
-             PARSEACTION ParseAction,
-             DWORD dwParseFlags,
-             LPWSTR pwzResult,
-             DWORD cchResult,
-             DWORD *pcchResult,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall CombineUrl( 
-             LPCWSTR pwzBaseUrl,
-             LPCWSTR pwzRelativeUrl,
-             DWORD dwCombineFlags,
-             LPWSTR pwzResult,
-             DWORD cchResult,
-             DWORD *pcchResult,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall CompareUrl( 
-             LPCWSTR pwzUrl1,
-             LPCWSTR pwzUrl2,
-             DWORD dwCompareFlags) = 0;
-        
-        virtual HRESULT __stdcall QueryInfo( 
-             LPCWSTR pwzUrl,
-             QUERYOPTION OueryOption,
-             DWORD dwQueryFlags,
-             LPVOID pBuffer,
-             DWORD cbBuffer,
-             DWORD *pcbBuf,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocolInfo_ParseUrl_Proxy( 
-    IInternetProtocolInfo * This,
-     LPCWSTR pwzUrl,
-     PARSEACTION ParseAction,
-     DWORD dwParseFlags,
-     LPWSTR pwzResult,
-     DWORD cchResult,
-     DWORD *pcchResult,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetProtocolInfo_ParseUrl_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolInfo_CombineUrl_Proxy( 
-    IInternetProtocolInfo * This,
-     LPCWSTR pwzBaseUrl,
-     LPCWSTR pwzRelativeUrl,
-     DWORD dwCombineFlags,
-     LPWSTR pwzResult,
-     DWORD cchResult,
-     DWORD *pcchResult,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetProtocolInfo_CombineUrl_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolInfo_CompareUrl_Proxy( 
-    IInternetProtocolInfo * This,
-     LPCWSTR pwzUrl1,
-     LPCWSTR pwzUrl2,
-     DWORD dwCompareFlags);
-
-
-void __stdcall IInternetProtocolInfo_CompareUrl_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolInfo_QueryInfo_Proxy( 
-    IInternetProtocolInfo * This,
-     LPCWSTR pwzUrl,
-     QUERYOPTION OueryOption,
-     DWORD dwQueryFlags,
-     LPVOID pBuffer,
-     DWORD cbBuffer,
-     DWORD *pcbBuf,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetProtocolInfo_QueryInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall CoInternetParseUrl(               
-    LPCWSTR     pwzUrl,                  
-    PARSEACTION ParseAction,             
-    DWORD       dwFlags,                 
-    LPWSTR      pszResult,               
-    DWORD       cchResult,               
-    DWORD      *pcchResult,              
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetCombineUrl(             
-    LPCWSTR     pwzBaseUrl,              
-    LPCWSTR     pwzRelativeUrl,          
-    DWORD       dwCombineFlags,          
-    LPWSTR      pszResult,               
-    DWORD       cchResult,               
-    DWORD      *pcchResult,              
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetCompareUrl(             
-    LPCWSTR pwzUrl1,                     
-    LPCWSTR pwzUrl2,                     
-    DWORD dwFlags                        
-    );                                   
-extern "C" HRESULT __stdcall CoInternetGetProtocolFlags(       
-    LPCWSTR     pwzUrl,                  
-    DWORD      *pdwFlags,                
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetQueryInfo(              
-    LPCWSTR     pwzUrl,                  
-    QUERYOPTION QueryOptions,            
-    DWORD       dwQueryFlags,            
-    LPVOID      pvBuffer,                
-    DWORD       cbBuffer,                
-    DWORD      *pcbBuffer,               
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetGetSession(             
-    DWORD       dwSessionMode,           
-    IInternetSession **ppIInternetSession,
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetGetSecurityUrl(         
-    LPCWSTR pwzUrl,                      
-    LPWSTR  *ppwzSecUrl,                 
-    PSUACTION  psuAction,                
-    DWORD   dwReserved                   
-    );                                   
-extern "C" HRESULT __stdcall AsyncInstallDistributionUnit(     
-    LPCWSTR szDistUnit,                  
-    LPCWSTR szTYPE,                      
-    LPCWSTR szExt,                       
-    DWORD dwFileVersionMS,               
-    DWORD dwFileVersionLS,               
-    LPCWSTR szURL,                       
-    IBindCtx *pbc,                       
-    LPVOID   pvReserved,                 
-    DWORD   flags                        
-    );                                   
-
-
-typedef 
-enum _tagINTERNETFEATURELIST
-    {	FEATURE_OBJECT_CACHING	= 0,
-	FEATURE_ZONE_ELEVATION	= FEATURE_OBJECT_CACHING + 1,
-	FEATURE_MIME_HANDLING	= FEATURE_ZONE_ELEVATION + 1,
-	FEATURE_MIME_SNIFFING	= FEATURE_MIME_HANDLING + 1,
-	FEATURE_WINDOW_RESTRICTIONS	= FEATURE_MIME_SNIFFING + 1,
-	FEATURE_WEBOC_POPUPMANAGEMENT	= FEATURE_WINDOW_RESTRICTIONS + 1,
-	FEATURE_BEHAVIORS	= FEATURE_WEBOC_POPUPMANAGEMENT + 1,
-	FEATURE_DISABLE_MK_PROTOCOL	= FEATURE_BEHAVIORS + 1,
-	FEATURE_LOCALMACHINE_LOCKDOWN	= FEATURE_DISABLE_MK_PROTOCOL + 1,
-	FEATURE_SECURITYBAND	= FEATURE_LOCALMACHINE_LOCKDOWN + 1,
-	FEATURE_RESTRICT_ACTIVEXINSTALL	= FEATURE_SECURITYBAND + 1,
-	FEATURE_VALIDATE_NAVIGATE_URL	= FEATURE_RESTRICT_ACTIVEXINSTALL + 1,
-	FEATURE_RESTRICT_FILEDOWNLOAD	= FEATURE_VALIDATE_NAVIGATE_URL + 1,
-	FEATURE_ADDON_MANAGEMENT	= FEATURE_RESTRICT_FILEDOWNLOAD + 1,
-	FEATURE_PROTOCOL_LOCKDOWN	= FEATURE_ADDON_MANAGEMENT + 1,
-	FEATURE_HTTP_USERNAME_PASSWORD_DISABLE	= FEATURE_PROTOCOL_LOCKDOWN + 1,
-	FEATURE_SAFE_BINDTOOBJECT	= FEATURE_HTTP_USERNAME_PASSWORD_DISABLE + 1,
-	FEATURE_UNC_SAVEDFILECHECK	= FEATURE_SAFE_BINDTOOBJECT + 1,
-	FEATURE_GET_URL_DOM_FILEPATH_UNENCODED	= FEATURE_UNC_SAVEDFILECHECK + 1,
-	FEATURE_ENTRY_COUNT	= FEATURE_GET_URL_DOM_FILEPATH_UNENCODED + 1
-    } 	INTERNETFEATURELIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall CoInternetSetFeatureEnabled(      
-    INTERNETFEATURELIST FeatureEntry,    
-    DWORD dwFlags,                       
-    BOOL fEnable                         
-    );                                   
-extern "C" HRESULT __stdcall CoInternetIsFeatureEnabled(       
-    INTERNETFEATURELIST FeatureEntry,    
-    DWORD dwFlags                        
-    );                                   
-extern "C" HRESULT __stdcall CoInternetIsFeatureEnabledForUrl( 
-    INTERNETFEATURELIST FeatureEntry,    
-    DWORD dwFlags,                       
-    LPCWSTR szURL,                       
-    IInternetSecurityManager *pSecMgr    
-    );                                   
-extern "C" HRESULT __stdcall CoInternetIsFeatureZoneElevationEnabled( 
-    LPCWSTR szFromURL,                          
-    LPCWSTR szToURL,                            
-    IInternetSecurityManager *pSecMgr,          
-    DWORD dwFlags                               
-    );                                          
- 
-extern "C" HRESULT __stdcall CopyStgMedium(const STGMEDIUM * pcstgmedSrc,  
-                           STGMEDIUM * pstgmedDest); 
-extern "C" HRESULT __stdcall CopyBindInfo( const BINDINFO * pcbiSrc,   
-                           BINDINFO * pbiDest ); 
-extern "C" void __stdcall ReleaseBindInfo( BINDINFO * pbindinfo );  
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall CoInternetCreateSecurityManager(IServiceProvider *pSP, IInternetSecurityManager **ppSM, DWORD dwReserved);
-
-extern "C" HRESULT __stdcall CoInternetCreateZoneManager(IServiceProvider *pSP, IInternetZoneManager **ppZM, DWORD dwReserved);
-
-
-
-extern "C" const IID CLSID_InternetSecurityManager;  
-extern "C" const IID CLSID_InternetZoneManager;  
-extern "C" const IID CLSID_PersistentZoneIdentifier;  
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0203_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0203_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IInternetSecurityMgrSite;
-
-
-    
-    struct __declspec(uuid("79eac9ed-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetSecurityMgrSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetWindow( 
-             HWND *phwnd) = 0;
-        
-        virtual HRESULT __stdcall EnableModeless( 
-             BOOL fEnable) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetSecurityMgrSite_GetWindow_Proxy( 
-    IInternetSecurityMgrSite * This,
-     HWND *phwnd);
-
-
-void __stdcall IInternetSecurityMgrSite_GetWindow_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityMgrSite_EnableModeless_Proxy( 
-    IInternetSecurityMgrSite * This,
-     BOOL fEnable);
-
-
-void __stdcall IInternetSecurityMgrSite_EnableModeless_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0204_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0204_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-typedef  
-enum __MIDL_IInternetSecurityManager_0001
-    {	PUAF_DEFAULT	= 0,
-	PUAF_NOUI	= 0x1,
-	PUAF_ISFILE	= 0x2,
-	PUAF_WARN_IF_DENIED	= 0x4,
-	PUAF_FORCEUI_FOREGROUND	= 0x8,
-	PUAF_CHECK_TIFS	= 0x10,
-	PUAF_DONTCHECKBOXINDIALOG	= 0x20,
-	PUAF_TRUSTED	= 0x40,
-	PUAF_ACCEPT_WILDCARD_SCHEME	= 0x80,
-	PUAF_ENFORCERESTRICTED	= 0x100,
-	PUAF_NOSAVEDFILECHECK	= 0x200,
-	PUAF_REQUIRESAVEDFILECHECK	= 0x400,
-	PUAF_LMZ_UNLOCKED	= 0x10000,
-	PUAF_LMZ_LOCKED	= 0x20000,
-	PUAF_DEFAULTZONEPOL	= 0x40000,
-	PUAF_NPL_USE_LOCKED_IF_RESTRICTED	= 0x80000,
-	PUAF_NOUIIFLOCKED	= 0x100000,
-	PUAF_DRAGPROTOCOLCHECK	= 0x200000
-    } 	PUAF;
-
-typedef  
-enum __MIDL_IInternetSecurityManager_0002
-    {	PUAFOUT_DEFAULT	= 0,
-	PUAFOUT_ISLOCKZONEPOLICY	= 0x1
-    } 	PUAFOUT;
-
-
-
-
-
-
-
-typedef  
-enum __MIDL_IInternetSecurityManager_0003
-    {	SZM_CREATE	= 0,
-	SZM_DELETE	= 0x1
-    } 	SZM_FLAGS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IInternetSecurityManager;
-
-
-    
-    struct __declspec(uuid("79eac9ee-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetSecurityManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetSecuritySite( 
-             IInternetSecurityMgrSite *pSite) = 0;
-        
-        virtual HRESULT __stdcall GetSecuritySite( 
-             IInternetSecurityMgrSite **ppSite) = 0;
-        
-        virtual HRESULT __stdcall MapUrlToZone( 
-             LPCWSTR pwszUrl,
-             DWORD *pdwZone,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall GetSecurityId( 
-             LPCWSTR pwszUrl,
-             BYTE *pbSecurityId,
-             DWORD *pcbSecurityId,
-             DWORD_PTR dwReserved) = 0;
-        
-        virtual HRESULT __stdcall ProcessUrlAction( 
-             LPCWSTR pwszUrl,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwFlags,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall QueryCustomPolicy( 
-             LPCWSTR pwszUrl,
-             const GUID & guidKey,
-             BYTE **ppPolicy,
-             DWORD *pcbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall SetZoneMapping( 
-             DWORD dwZone,
-             LPCWSTR lpszPattern,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall GetZoneMappings( 
-             DWORD dwZone,
-             IEnumString **ppenumString,
-             DWORD dwFlags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetSecurityManager_SetSecuritySite_Proxy( 
-    IInternetSecurityManager * This,
-     IInternetSecurityMgrSite *pSite);
-
-
-void __stdcall IInternetSecurityManager_SetSecuritySite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_GetSecuritySite_Proxy( 
-    IInternetSecurityManager * This,
-     IInternetSecurityMgrSite **ppSite);
-
-
-void __stdcall IInternetSecurityManager_GetSecuritySite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_MapUrlToZone_Proxy( 
-    IInternetSecurityManager * This,
-     LPCWSTR pwszUrl,
-     DWORD *pdwZone,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetSecurityManager_MapUrlToZone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_GetSecurityId_Proxy( 
-    IInternetSecurityManager * This,
-     LPCWSTR pwszUrl,
-     BYTE *pbSecurityId,
-     DWORD *pcbSecurityId,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IInternetSecurityManager_GetSecurityId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_ProcessUrlAction_Proxy( 
-    IInternetSecurityManager * This,
-     LPCWSTR pwszUrl,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwFlags,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSecurityManager_ProcessUrlAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_QueryCustomPolicy_Proxy( 
-    IInternetSecurityManager * This,
-     LPCWSTR pwszUrl,
-     const GUID & guidKey,
-     BYTE **ppPolicy,
-     DWORD *pcbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSecurityManager_QueryCustomPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_SetZoneMapping_Proxy( 
-    IInternetSecurityManager * This,
-     DWORD dwZone,
-     LPCWSTR lpszPattern,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetSecurityManager_SetZoneMapping_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_GetZoneMappings_Proxy( 
-    IInternetSecurityManager * This,
-     DWORD dwZone,
-     IEnumString **ppenumString,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetSecurityManager_GetZoneMappings_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-extern "C" const IID IID_IInternetSecurityManagerEx;
-
-
-    
-    struct __declspec(uuid("F164EDF1-CC7C-4f0d-9A94-34222625C393")) __declspec(novtable)
-    IInternetSecurityManagerEx : public IInternetSecurityManager
-    {
-    public:
-        virtual HRESULT __stdcall ProcessUrlActionEx( 
-             LPCWSTR pwszUrl,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwFlags,
-             DWORD dwReserved,
-             DWORD *pdwOutFlags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetSecurityManagerEx_ProcessUrlActionEx_Proxy( 
-    IInternetSecurityManagerEx * This,
-     LPCWSTR pwszUrl,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwFlags,
-     DWORD dwReserved,
-     DWORD *pdwOutFlags);
-
-
-void __stdcall IInternetSecurityManagerEx_ProcessUrlActionEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0205_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0205_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IZoneIdentifier;
-
-
-    
-    struct __declspec(uuid("cd45f185-1b21-48e2-967b-ead743a8914e")) __declspec(novtable)
-    IZoneIdentifier : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetId( 
-             DWORD *pdwZone) = 0;
-        
-        virtual HRESULT __stdcall SetId( 
-             DWORD dwZone) = 0;
-        
-        virtual HRESULT __stdcall Remove( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IZoneIdentifier_GetId_Proxy( 
-    IZoneIdentifier * This,
-     DWORD *pdwZone);
-
-
-void __stdcall IZoneIdentifier_GetId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IZoneIdentifier_SetId_Proxy( 
-    IZoneIdentifier * This,
-     DWORD dwZone);
-
-
-void __stdcall IZoneIdentifier_SetId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IZoneIdentifier_Remove_Proxy( 
-    IZoneIdentifier * This);
-
-
-void __stdcall IZoneIdentifier_Remove_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0207_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0207_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IInternetHostSecurityManager;
-
-
-    
-    struct __declspec(uuid("3af280b6-cb3f-11d0-891e-00c04fb6bfc4")) __declspec(novtable)
-    IInternetHostSecurityManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetSecurityId( 
-             BYTE *pbSecurityId,
-             DWORD *pcbSecurityId,
-             DWORD_PTR dwReserved) = 0;
-        
-        virtual HRESULT __stdcall ProcessUrlAction( 
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwFlags,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall QueryCustomPolicy( 
-             const GUID & guidKey,
-             BYTE **ppPolicy,
-             DWORD *pcbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetHostSecurityManager_GetSecurityId_Proxy( 
-    IInternetHostSecurityManager * This,
-     BYTE *pbSecurityId,
-     DWORD *pcbSecurityId,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IInternetHostSecurityManager_GetSecurityId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetHostSecurityManager_ProcessUrlAction_Proxy( 
-    IInternetHostSecurityManager * This,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwFlags,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetHostSecurityManager_ProcessUrlAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetHostSecurityManager_QueryCustomPolicy_Proxy( 
-    IInternetHostSecurityManager * This,
-     const GUID & guidKey,
-     BYTE **ppPolicy,
-     DWORD *pcbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetHostSecurityManager_QueryCustomPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const GUID GUID_CUSTOM_LOCALMACHINEZONEUNLOCKED; 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0208_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0208_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetZoneManager *LPURLZONEMANAGER;
-
-typedef 
-enum tagURLZONE
-    {	URLZONE_PREDEFINED_MIN	= 0,
-	URLZONE_LOCAL_MACHINE	= 0,
-	URLZONE_INTRANET	= URLZONE_LOCAL_MACHINE + 1,
-	URLZONE_TRUSTED	= URLZONE_INTRANET + 1,
-	URLZONE_INTERNET	= URLZONE_TRUSTED + 1,
-	URLZONE_UNTRUSTED	= URLZONE_INTERNET + 1,
-	URLZONE_PREDEFINED_MAX	= 999,
-	URLZONE_USER_MIN	= 1000,
-	URLZONE_USER_MAX	= 10000
-    } 	URLZONE;
-
-
-
-typedef 
-enum tagURLTEMPLATE
-    {	URLTEMPLATE_CUSTOM	= 0,
-	URLTEMPLATE_PREDEFINED_MIN	= 0x10000,
-	URLTEMPLATE_LOW	= 0x10000,
-	URLTEMPLATE_MEDLOW	= 0x10500,
-	URLTEMPLATE_MEDIUM	= 0x11000,
-	URLTEMPLATE_HIGH	= 0x12000,
-	URLTEMPLATE_PREDEFINED_MAX	= 0x20000
-    } 	URLTEMPLATE;
-
-
-enum __MIDL_IInternetZoneManager_0001
-    {	MAX_ZONE_PATH	= 260,
-	MAX_ZONE_DESCRIPTION	= 200
-    } ;
-typedef  
-enum __MIDL_IInternetZoneManager_0002
-    {	ZAFLAGS_CUSTOM_EDIT	= 0x1,
-	ZAFLAGS_ADD_SITES	= 0x2,
-	ZAFLAGS_REQUIRE_VERIFICATION	= 0x4,
-	ZAFLAGS_INCLUDE_PROXY_OVERRIDE	= 0x8,
-	ZAFLAGS_INCLUDE_INTRANET_SITES	= 0x10,
-	ZAFLAGS_NO_UI	= 0x20,
-	ZAFLAGS_SUPPORTS_VERIFICATION	= 0x40,
-	ZAFLAGS_UNC_AS_INTRANET	= 0x80,
-	ZAFLAGS_USE_LOCKED_ZONES	= 0x10000
-    } 	ZAFLAGS;
-
-typedef struct _ZONEATTRIBUTES
-    {
-    ULONG cbSize;
-    WCHAR szDisplayName[ 260 ];
-    WCHAR szDescription[ 200 ];
-    WCHAR szIconPath[ 260 ];
-    DWORD dwTemplateMinLevel;
-    DWORD dwTemplateRecommended;
-    DWORD dwTemplateCurrentLevel;
-    DWORD dwFlags;
-    } 	ZONEATTRIBUTES;
-
-typedef struct _ZONEATTRIBUTES *LPZONEATTRIBUTES;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum _URLZONEREG
-    {	URLZONEREG_DEFAULT	= 0,
-	URLZONEREG_HKLM	= URLZONEREG_DEFAULT + 1,
-	URLZONEREG_HKCU	= URLZONEREG_HKLM + 1
-    } 	URLZONEREG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IInternetZoneManager;
-
-
-    
-    struct __declspec(uuid("79eac9ef-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetZoneManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetZoneAttributes( 
-             DWORD dwZone,
-             ZONEATTRIBUTES *pZoneAttributes) = 0;
-        
-        virtual HRESULT __stdcall SetZoneAttributes( 
-             DWORD dwZone,
-             ZONEATTRIBUTES *pZoneAttributes) = 0;
-        
-        virtual HRESULT __stdcall GetZoneCustomPolicy( 
-             DWORD dwZone,
-             const GUID & guidKey,
-             BYTE **ppPolicy,
-             DWORD *pcbPolicy,
-             URLZONEREG urlZoneReg) = 0;
-        
-        virtual HRESULT __stdcall SetZoneCustomPolicy( 
-             DWORD dwZone,
-             const GUID & guidKey,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg) = 0;
-        
-        virtual HRESULT __stdcall GetZoneActionPolicy( 
-             DWORD dwZone,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg) = 0;
-        
-        virtual HRESULT __stdcall SetZoneActionPolicy( 
-             DWORD dwZone,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg) = 0;
-        
-        virtual HRESULT __stdcall PromptAction( 
-             DWORD dwAction,
-             HWND hwndParent,
-             LPCWSTR pwszUrl,
-             LPCWSTR pwszText,
-             DWORD dwPromptFlags) = 0;
-        
-        virtual HRESULT __stdcall LogAction( 
-             DWORD dwAction,
-             LPCWSTR pwszUrl,
-             LPCWSTR pwszText,
-             DWORD dwLogFlags) = 0;
-        
-        virtual HRESULT __stdcall CreateZoneEnumerator( 
-             DWORD *pdwEnum,
-             DWORD *pdwCount,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall GetZoneAt( 
-             DWORD dwEnum,
-             DWORD dwIndex,
-             DWORD *pdwZone) = 0;
-        
-        virtual HRESULT __stdcall DestroyZoneEnumerator( 
-             DWORD dwEnum) = 0;
-        
-        virtual HRESULT __stdcall CopyTemplatePoliciesToZone( 
-             DWORD dwTemplate,
-             DWORD dwZone,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetZoneManager_GetZoneAttributes_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     ZONEATTRIBUTES *pZoneAttributes);
-
-
-void __stdcall IInternetZoneManager_GetZoneAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_SetZoneAttributes_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     ZONEATTRIBUTES *pZoneAttributes);
-
-
-void __stdcall IInternetZoneManager_SetZoneAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_GetZoneCustomPolicy_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     const GUID & guidKey,
-     BYTE **ppPolicy,
-     DWORD *pcbPolicy,
-     URLZONEREG urlZoneReg);
-
-
-void __stdcall IInternetZoneManager_GetZoneCustomPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_SetZoneCustomPolicy_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     const GUID & guidKey,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg);
-
-
-void __stdcall IInternetZoneManager_SetZoneCustomPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_GetZoneActionPolicy_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg);
-
-
-void __stdcall IInternetZoneManager_GetZoneActionPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_SetZoneActionPolicy_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg);
-
-
-void __stdcall IInternetZoneManager_SetZoneActionPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_PromptAction_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwAction,
-     HWND hwndParent,
-     LPCWSTR pwszUrl,
-     LPCWSTR pwszText,
-     DWORD dwPromptFlags);
-
-
-void __stdcall IInternetZoneManager_PromptAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_LogAction_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwAction,
-     LPCWSTR pwszUrl,
-     LPCWSTR pwszText,
-     DWORD dwLogFlags);
-
-
-void __stdcall IInternetZoneManager_LogAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_CreateZoneEnumerator_Proxy( 
-    IInternetZoneManager * This,
-     DWORD *pdwEnum,
-     DWORD *pdwCount,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetZoneManager_CreateZoneEnumerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_GetZoneAt_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwEnum,
-     DWORD dwIndex,
-     DWORD *pdwZone);
-
-
-void __stdcall IInternetZoneManager_GetZoneAt_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_DestroyZoneEnumerator_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwEnum);
-
-
-void __stdcall IInternetZoneManager_DestroyZoneEnumerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_CopyTemplatePoliciesToZone_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwTemplate,
-     DWORD dwZone,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetZoneManager_CopyTemplatePoliciesToZone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0209_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0209_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IInternetZoneManagerEx;
-
-
-    
-    struct __declspec(uuid("A4C23339-8E06-431e-9BF4-7E711C085648")) __declspec(novtable)
-    IInternetZoneManagerEx : public IInternetZoneManager
-    {
-    public:
-        virtual HRESULT __stdcall GetZoneActionPolicyEx( 
-             DWORD dwZone,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall SetZoneActionPolicyEx( 
-             DWORD dwZone,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg,
-             DWORD dwFlags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetZoneManagerEx_GetZoneActionPolicyEx_Proxy( 
-    IInternetZoneManagerEx * This,
-     DWORD dwZone,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetZoneManagerEx_GetZoneActionPolicyEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManagerEx_SetZoneActionPolicyEx_Proxy( 
-    IInternetZoneManagerEx * This,
-     DWORD dwZone,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetZoneManagerEx_SetZoneActionPolicyEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID CLSID_SoftDistExt;  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _tagCODEBASEHOLD
-    {
-    ULONG cbSize;
-    LPWSTR szDistUnit;
-    LPWSTR szCodeBase;
-    DWORD dwVersionMS;
-    DWORD dwVersionLS;
-    DWORD dwStyle;
-    } 	CODEBASEHOLD;
-
-typedef struct _tagCODEBASEHOLD *LPCODEBASEHOLD;
-
-typedef struct _tagSOFTDISTINFO
-    {
-    ULONG cbSize;
-    DWORD dwFlags;
-    DWORD dwAdState;
-    LPWSTR szTitle;
-    LPWSTR szAbstract;
-    LPWSTR szHREF;
-    DWORD dwInstalledVersionMS;
-    DWORD dwInstalledVersionLS;
-    DWORD dwUpdateVersionMS;
-    DWORD dwUpdateVersionLS;
-    DWORD dwAdvertisedVersionMS;
-    DWORD dwAdvertisedVersionLS;
-    DWORD dwReserved;
-    } 	SOFTDISTINFO;
-
-typedef struct _tagSOFTDISTINFO *LPSOFTDISTINFO;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0210_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0210_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISoftDistExt;
-
-
-    
-    struct __declspec(uuid("B15B8DC1-C7E1-11d0-8680-00AA00BDCB71")) __declspec(novtable)
-    ISoftDistExt : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ProcessSoftDist( 
-             LPCWSTR szCDFURL,
-             IXMLElement *pSoftDistElement,
-             LPSOFTDISTINFO lpsdi) = 0;
-        
-        virtual HRESULT __stdcall GetFirstCodeBase( 
-             LPWSTR *szCodeBase,
-             LPDWORD dwMaxSize) = 0;
-        
-        virtual HRESULT __stdcall GetNextCodeBase( 
-             LPWSTR *szCodeBase,
-             LPDWORD dwMaxSize) = 0;
-        
-        virtual HRESULT __stdcall AsyncInstallDistributionUnit( 
-             IBindCtx *pbc,
-             LPVOID pvReserved,
-             DWORD flags,
-             LPCODEBASEHOLD lpcbh) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISoftDistExt_ProcessSoftDist_Proxy( 
-    ISoftDistExt * This,
-     LPCWSTR szCDFURL,
-     IXMLElement *pSoftDistElement,
-     LPSOFTDISTINFO lpsdi);
-
-
-void __stdcall ISoftDistExt_ProcessSoftDist_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISoftDistExt_GetFirstCodeBase_Proxy( 
-    ISoftDistExt * This,
-     LPWSTR *szCodeBase,
-     LPDWORD dwMaxSize);
-
-
-void __stdcall ISoftDistExt_GetFirstCodeBase_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISoftDistExt_GetNextCodeBase_Proxy( 
-    ISoftDistExt * This,
-     LPWSTR *szCodeBase,
-     LPDWORD dwMaxSize);
-
-
-void __stdcall ISoftDistExt_GetNextCodeBase_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISoftDistExt_AsyncInstallDistributionUnit_Proxy( 
-    ISoftDistExt * This,
-     IBindCtx *pbc,
-     LPVOID pvReserved,
-     DWORD flags,
-     LPCODEBASEHOLD lpcbh);
-
-
-void __stdcall ISoftDistExt_AsyncInstallDistributionUnit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-extern "C" HRESULT __stdcall GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi );
-extern "C" HRESULT __stdcall SetSoftwareUpdateAdvertisementState( LPCWSTR szDistUnit, DWORD dwAdState, DWORD dwAdvertisedVersionMS, DWORD dwAdvertisedVersionLS );
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0211_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0211_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  ICatalogFileInfo *LPCATALOGFILEINFO;
-
-
-extern "C" const IID IID_ICatalogFileInfo;
-
-
-    
-    struct __declspec(uuid("711C7600-6B48-11d1-B403-00AA00B92AF1")) __declspec(novtable)
-    ICatalogFileInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetCatalogFile( 
-             LPSTR *ppszCatalogFile) = 0;
-        
-        virtual HRESULT __stdcall GetJavaTrust( 
-             void **ppJavaTrust) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICatalogFileInfo_GetCatalogFile_Proxy( 
-    ICatalogFileInfo * This,
-     LPSTR *ppszCatalogFile);
-
-
-void __stdcall ICatalogFileInfo_GetCatalogFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatalogFileInfo_GetJavaTrust_Proxy( 
-    ICatalogFileInfo * This,
-     void **ppJavaTrust);
-
-
-void __stdcall ICatalogFileInfo_GetJavaTrust_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0212_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0212_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IDataFilter *LPDATAFILTER;
-
-
-extern "C" const IID IID_IDataFilter;
-
-
-    
-    struct __declspec(uuid("69d14c80-c18e-11d0-a9ce-006097942311")) __declspec(novtable)
-    IDataFilter : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall DoEncode( 
-             DWORD dwFlags,
-             LONG lInBufferSize,
-             BYTE *pbInBuffer,
-             LONG lOutBufferSize,
-             BYTE *pbOutBuffer,
-             LONG lInBytesAvailable,
-             LONG *plInBytesRead,
-             LONG *plOutBytesWritten,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall DoDecode( 
-             DWORD dwFlags,
-             LONG lInBufferSize,
-             BYTE *pbInBuffer,
-             LONG lOutBufferSize,
-             BYTE *pbOutBuffer,
-             LONG lInBytesAvailable,
-             LONG *plInBytesRead,
-             LONG *plOutBytesWritten,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall SetEncodingLevel( 
-             DWORD dwEncLevel) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDataFilter_DoEncode_Proxy( 
-    IDataFilter * This,
-     DWORD dwFlags,
-     LONG lInBufferSize,
-     BYTE *pbInBuffer,
-     LONG lOutBufferSize,
-     BYTE *pbOutBuffer,
-     LONG lInBytesAvailable,
-     LONG *plInBytesRead,
-     LONG *plOutBytesWritten,
-     DWORD dwReserved);
-
-
-void __stdcall IDataFilter_DoEncode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataFilter_DoDecode_Proxy( 
-    IDataFilter * This,
-     DWORD dwFlags,
-     LONG lInBufferSize,
-     BYTE *pbInBuffer,
-     LONG lOutBufferSize,
-     BYTE *pbOutBuffer,
-     LONG lInBytesAvailable,
-     LONG *plInBytesRead,
-     LONG *plOutBytesWritten,
-     DWORD dwReserved);
-
-
-void __stdcall IDataFilter_DoDecode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataFilter_SetEncodingLevel_Proxy( 
-    IDataFilter * This,
-     DWORD dwEncLevel);
-
-
-void __stdcall IDataFilter_SetEncodingLevel_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-typedef struct _tagPROTOCOLFILTERDATA
-    {
-    DWORD cbSize;
-    IInternetProtocolSink *pProtocolSink;
-    IInternetProtocol *pProtocol;
-    IUnknown *pUnk;
-    DWORD dwFilterFlags;
-    } 	PROTOCOLFILTERDATA;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0213_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0213_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IEncodingFilterFactory *LPENCODINGFILTERFACTORY;
-
-typedef struct _tagDATAINFO
-    {
-    ULONG ulTotalSize;
-    ULONG ulavrPacketSize;
-    ULONG ulConnectSpeed;
-    ULONG ulProcessorSpeed;
-    } 	DATAINFO;
-
-
-extern "C" const IID IID_IEncodingFilterFactory;
-
-
-    
-    struct __declspec(uuid("70bdde00-c18e-11d0-a9ce-006097942311")) __declspec(novtable)
-    IEncodingFilterFactory : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall FindBestFilter( 
-             LPCWSTR pwzCodeIn,
-             LPCWSTR pwzCodeOut,
-             DATAINFO info,
-             IDataFilter **ppDF) = 0;
-        
-        virtual HRESULT __stdcall GetDefaultFilter( 
-             LPCWSTR pwzCodeIn,
-             LPCWSTR pwzCodeOut,
-             IDataFilter **ppDF) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IEncodingFilterFactory_FindBestFilter_Proxy( 
-    IEncodingFilterFactory * This,
-     LPCWSTR pwzCodeIn,
-     LPCWSTR pwzCodeOut,
-     DATAINFO info,
-     IDataFilter **ppDF);
-
-
-void __stdcall IEncodingFilterFactory_FindBestFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEncodingFilterFactory_GetDefaultFilter_Proxy( 
-    IEncodingFilterFactory * This,
-     LPCWSTR pwzCodeIn,
-     LPCWSTR pwzCodeOut,
-     IDataFilter **ppDF);
-
-
-void __stdcall IEncodingFilterFactory_GetDefaultFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-BOOL __stdcall IsLoggingEnabledA( LPCSTR  pszUrl);                    
-BOOL __stdcall IsLoggingEnabledW( LPCWSTR  pwszUrl);                  
-
-
-
-
-
-typedef struct _tagHIT_LOGGING_INFO
-    {
-    DWORD dwStructSize;
-    LPSTR lpszLoggedUrlName;
-    SYSTEMTIME StartTime;
-    SYSTEMTIME EndTime;
-    LPSTR lpszExtendedInfo;
-    } 	HIT_LOGGING_INFO;
-
-typedef struct _tagHIT_LOGGING_INFO *LPHIT_LOGGING_INFO;
-
-BOOL __stdcall WriteHitLogging( LPHIT_LOGGING_INFO lpLogginginfo);    
-
-struct CONFIRMSAFETY
-    {
-    CLSID clsid;
-    IUnknown *pUnk;
-    DWORD dwFlags;
-    } ;
-extern "C" const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY; 
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0214_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0214_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWrappedProtocol *LPIWRAPPEDPROTOCOL;
-
-
-extern "C" const IID IID_IWrappedProtocol;
-
-
-    
-    struct __declspec(uuid("53c84785-8425-4dc5-971b-e58d9c19f9b6")) __declspec(novtable)
-    IWrappedProtocol : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetWrapperCode( 
-             LONG *pnCode,
-             DWORD_PTR dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWrappedProtocol_GetWrapperCode_Proxy( 
-    IWrappedProtocol * This,
-     LONG *pnCode,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IWrappedProtocol_GetWrapperCode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0215_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0215_v0_0_s_ifspec;
-
-
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
- HRESULT __stdcall IBinding_GetBindResult_Proxy( 
-    IBinding * This,
-     CLSID *pclsidProtocol,
-     DWORD *pdwResult,
-     LPOLESTR *pszResult,
-     DWORD *pdwReserved);
-
-
- HRESULT __stdcall IBinding_GetBindResult_Stub( 
-    IBinding * This,
-     CLSID *pclsidProtocol,
-     DWORD *pdwResult,
-     LPOLESTR *pszResult,
-     DWORD dwReserved);
-
- HRESULT __stdcall IBindStatusCallback_GetBindInfo_Proxy( 
-    IBindStatusCallback * This,
-     DWORD *grfBINDF,
-     BINDINFO *pbindinfo);
-
-
- HRESULT __stdcall IBindStatusCallback_GetBindInfo_Stub( 
-    IBindStatusCallback * This,
-     DWORD *grfBINDF,
-     RemBINDINFO *pbindinfo,
-     RemSTGMEDIUM *pstgmed);
-
- HRESULT __stdcall IBindStatusCallback_OnDataAvailable_Proxy( 
-    IBindStatusCallback * This,
-     DWORD grfBSCF,
-     DWORD dwSize,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pstgmed);
-
-
- HRESULT __stdcall IBindStatusCallback_OnDataAvailable_Stub( 
-    IBindStatusCallback * This,
-     DWORD grfBSCF,
-     DWORD dwSize,
-     RemFORMATETC *pformatetc,
-     RemSTGMEDIUM *pstgmed);
-
- HRESULT __stdcall IWinInetInfo_QueryOption_Proxy( 
-    IWinInetInfo * This,
-     DWORD dwOption,
-     LPVOID pBuffer,
-     DWORD *pcbBuf);
-
-
- HRESULT __stdcall IWinInetInfo_QueryOption_Stub( 
-    IWinInetInfo * This,
-     DWORD dwOption,
-     BYTE *pBuffer,
-     DWORD *pcbBuf);
-
- HRESULT __stdcall IWinInetHttpInfo_QueryInfo_Proxy( 
-    IWinInetHttpInfo * This,
-     DWORD dwOption,
-     LPVOID pBuffer,
-     DWORD *pcbBuf,
-     DWORD *pdwFlags,
-     DWORD *pdwReserved);
-
-
- HRESULT __stdcall IWinInetHttpInfo_QueryInfo_Stub( 
-    IWinInetHttpInfo * This,
-     DWORD dwOption,
-     BYTE *pBuffer,
-     DWORD *pcbBuf,
-     DWORD *pdwFlags,
-     DWORD *pdwReserved);
-
- HRESULT __stdcall IBindHost_MonikerBindToStorage_Proxy( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     void **ppvObj);
-
-
- HRESULT __stdcall IBindHost_MonikerBindToStorage_Stub( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     IUnknown **ppvObj);
-
- HRESULT __stdcall IBindHost_MonikerBindToObject_Proxy( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     void **ppvObj);
-
-
- HRESULT __stdcall IBindHost_MonikerBindToObject_Stub( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IPropertyStorage IPropertyStorage;
-
-
-
-
-
-typedef struct IPropertySetStorage IPropertySetStorage;
-
-
-
-
-
-typedef struct IEnumSTATPROPSTG IEnumSTATPROPSTG;
-
-
-
-
-
-typedef struct IEnumSTATPROPSETSTG IEnumSTATPROPSETSTG;
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)    
-#pragma warning(disable:4237)    
-
-
-#pragma once
-
-
-
-
-typedef struct tagVersionedStream
-    {
-    GUID guidVersion;
-    IStream *pStream;
-    } 	VERSIONEDSTREAM;
-
-typedef struct tagVersionedStream *LPVERSIONEDSTREAM;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPROPVARIANT PROPVARIANT;
-
-typedef struct tagCAC
-    {
-    ULONG cElems;
-     CHAR *pElems;
-    } 	CAC;
-
-typedef struct tagCAUB
-    {
-    ULONG cElems;
-     UCHAR *pElems;
-    } 	CAUB;
-
-typedef struct tagCAI
-    {
-    ULONG cElems;
-     SHORT *pElems;
-    } 	CAI;
-
-typedef struct tagCAUI
-    {
-    ULONG cElems;
-     USHORT *pElems;
-    } 	CAUI;
-
-typedef struct tagCAL
-    {
-    ULONG cElems;
-     LONG *pElems;
-    } 	CAL;
-
-typedef struct tagCAUL
-    {
-    ULONG cElems;
-     ULONG *pElems;
-    } 	CAUL;
-
-typedef struct tagCAFLT
-    {
-    ULONG cElems;
-     FLOAT *pElems;
-    } 	CAFLT;
-
-typedef struct tagCADBL
-    {
-    ULONG cElems;
-     DOUBLE *pElems;
-    } 	CADBL;
-
-typedef struct tagCACY
-    {
-    ULONG cElems;
-     CY *pElems;
-    } 	CACY;
-
-typedef struct tagCADATE
-    {
-    ULONG cElems;
-     DATE *pElems;
-    } 	CADATE;
-
-typedef struct tagCABSTR
-    {
-    ULONG cElems;
-     BSTR *pElems;
-    } 	CABSTR;
-
-typedef struct tagCABSTRBLOB
-    {
-    ULONG cElems;
-     BSTRBLOB *pElems;
-    } 	CABSTRBLOB;
-
-typedef struct tagCABOOL
-    {
-    ULONG cElems;
-     VARIANT_BOOL *pElems;
-    } 	CABOOL;
-
-typedef struct tagCASCODE
-    {
-    ULONG cElems;
-     SCODE *pElems;
-    } 	CASCODE;
-
-typedef struct tagCAPROPVARIANT
-    {
-    ULONG cElems;
-     PROPVARIANT *pElems;
-    } 	CAPROPVARIANT;
-
-typedef struct tagCAH
-    {
-    ULONG cElems;
-     LARGE_INTEGER *pElems;
-    } 	CAH;
-
-typedef struct tagCAUH
-    {
-    ULONG cElems;
-     ULARGE_INTEGER *pElems;
-    } 	CAUH;
-
-typedef struct tagCALPSTR
-    {
-    ULONG cElems;
-     LPSTR *pElems;
-    } 	CALPSTR;
-
-typedef struct tagCALPWSTR
-    {
-    ULONG cElems;
-     LPWSTR *pElems;
-    } 	CALPWSTR;
-
-typedef struct tagCAFILETIME
-    {
-    ULONG cElems;
-     FILETIME *pElems;
-    } 	CAFILETIME;
-
-typedef struct tagCACLIPDATA
-    {
-    ULONG cElems;
-     CLIPDATA *pElems;
-    } 	CACLIPDATA;
-
-typedef struct tagCACLSID
-    {
-    ULONG cElems;
-     CLSID *pElems;
-    } 	CACLSID;
-
-
-
-
-
-
-
-
-
-
-
-typedef WORD PROPVAR_PAD1;
-typedef WORD PROPVAR_PAD2;
-typedef WORD PROPVAR_PAD3;
-
-
-
-struct tagPROPVARIANT {
-  union {
-
-struct 
-    {
-    VARTYPE vt;
-    PROPVAR_PAD1 wReserved1;
-    PROPVAR_PAD2 wReserved2;
-    PROPVAR_PAD3 wReserved3;
-      union 
-        {
-           
-         CHAR cVal;
-         UCHAR bVal;
-         SHORT iVal;
-         USHORT uiVal;
-         LONG lVal;
-         ULONG ulVal;
-         INT intVal;
-         UINT uintVal;
-         LARGE_INTEGER hVal;
-         ULARGE_INTEGER uhVal;
-         FLOAT fltVal;
-         DOUBLE dblVal;
-         VARIANT_BOOL boolVal;
-         
-         SCODE scode;
-         CY cyVal;
-         DATE date;
-         FILETIME filetime;
-         CLSID *puuid;
-         CLIPDATA *pclipdata;
-         BSTR bstrVal;
-         BSTRBLOB bstrblobVal;
-         BLOB blob;
-         LPSTR pszVal;
-         LPWSTR pwszVal;
-         IUnknown *punkVal;
-         IDispatch *pdispVal;
-         IStream *pStream;
-         IStorage *pStorage;
-         LPVERSIONEDSTREAM pVersionedStream;
-         LPSAFEARRAY parray;
-         CAC cac;
-         CAUB caub;
-         CAI cai;
-         CAUI caui;
-         CAL cal;
-         CAUL caul;
-         CAH cah;
-         CAUH cauh;
-         CAFLT caflt;
-         CADBL cadbl;
-         CABOOL cabool;
-         CASCODE cascode;
-         CACY cacy;
-         CADATE cadate;
-         CAFILETIME cafiletime;
-         CACLSID cauuid;
-         CACLIPDATA caclipdata;
-         CABSTR cabstr;
-         CABSTRBLOB cabstrblob;
-         CALPSTR calpstr;
-         CALPWSTR calpwstr;
-         CAPROPVARIANT capropvar;
-         CHAR *pcVal;
-         UCHAR *pbVal;
-         SHORT *piVal;
-         USHORT *puiVal;
-         LONG *plVal;
-         ULONG *pulVal;
-         INT *pintVal;
-         UINT *puintVal;
-         FLOAT *pfltVal;
-         DOUBLE *pdblVal;
-         VARIANT_BOOL *pboolVal;
-         DECIMAL *pdecVal;
-         SCODE *pscode;
-         CY *pcyVal;
-         DATE *pdate;
-         BSTR *pbstrVal;
-         IUnknown **ppunkVal;
-         IDispatch **ppdispVal;
-         LPSAFEARRAY *pparray;
-         PROPVARIANT *pvarVal;
-        } 	;
-    } ;
-
-    DECIMAL decVal;
-  };
-};
-
-
-
-
-
-
-
-typedef struct tagPROPVARIANT * LPPROPVARIANT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-enum PIDMSI_STATUS_VALUE
-    {	PIDMSI_STATUS_NORMAL	= 0,
-	PIDMSI_STATUS_NEW	= PIDMSI_STATUS_NORMAL + 1,
-	PIDMSI_STATUS_PRELIM	= PIDMSI_STATUS_NEW + 1,
-	PIDMSI_STATUS_DRAFT	= PIDMSI_STATUS_PRELIM + 1,
-	PIDMSI_STATUS_INPROGRESS	= PIDMSI_STATUS_DRAFT + 1,
-	PIDMSI_STATUS_EDIT	= PIDMSI_STATUS_INPROGRESS + 1,
-	PIDMSI_STATUS_REVIEW	= PIDMSI_STATUS_EDIT + 1,
-	PIDMSI_STATUS_PROOF	= PIDMSI_STATUS_REVIEW + 1,
-	PIDMSI_STATUS_FINAL	= PIDMSI_STATUS_PROOF + 1,
-	PIDMSI_STATUS_OTHER	= 0x7fff
-    } ;
-
-
-
-
-
-
-typedef struct tagPROPSPEC
-    {
-    ULONG ulKind;
-      union 
-        {
-         PROPID propid;
-         LPOLESTR lpwstr;
-           
-        } 	;
-    } 	PROPSPEC;
-
-typedef struct tagSTATPROPSTG
-    {
-    LPOLESTR lpwstrName;
-    PROPID propid;
-    VARTYPE vt;
-    } 	STATPROPSTG;
-
-
-
-
-
-
-typedef struct tagSTATPROPSETSTG
-    {
-    FMTID fmtid;
-    CLSID clsid;
-    DWORD grfFlags;
-    FILETIME mtime;
-    FILETIME ctime;
-    FILETIME atime;
-    DWORD dwOSVersion;
-    } 	STATPROPSETSTG;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPropertyStorage;
-
-
-    
-    struct __declspec(uuid("00000138-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPropertyStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ReadMultiple( 
-             ULONG cpspec,
-             const PROPSPEC rgpspec[  ],
-             PROPVARIANT rgpropvar[  ]) = 0;
-        
-        virtual HRESULT __stdcall WriteMultiple( 
-             ULONG cpspec,
-             const PROPSPEC rgpspec[  ],
-             const PROPVARIANT rgpropvar[  ],
-             PROPID propidNameFirst) = 0;
-        
-        virtual HRESULT __stdcall DeleteMultiple( 
-             ULONG cpspec,
-             const PROPSPEC rgpspec[  ]) = 0;
-        
-        virtual HRESULT __stdcall ReadPropertyNames( 
-             ULONG cpropid,
-             const PROPID rgpropid[  ],
-             LPOLESTR rglpwstrName[  ]) = 0;
-        
-        virtual HRESULT __stdcall WritePropertyNames( 
-             ULONG cpropid,
-             const PROPID rgpropid[  ],
-             const LPOLESTR rglpwstrName[  ]) = 0;
-        
-        virtual HRESULT __stdcall DeletePropertyNames( 
-             ULONG cpropid,
-             const PROPID rgpropid[  ]) = 0;
-        
-        virtual HRESULT __stdcall Commit( 
-             DWORD grfCommitFlags) = 0;
-        
-        virtual HRESULT __stdcall Revert( void) = 0;
-        
-        virtual HRESULT __stdcall Enum( 
-             IEnumSTATPROPSTG **ppenum) = 0;
-        
-        virtual HRESULT __stdcall SetTimes( 
-             const FILETIME *pctime,
-             const FILETIME *patime,
-             const FILETIME *pmtime) = 0;
-        
-        virtual HRESULT __stdcall SetClass( 
-             const IID & clsid) = 0;
-        
-        virtual HRESULT __stdcall Stat( 
-             STATPROPSETSTG *pstatpsstg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyStorage_ReadMultiple_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpspec,
-     const PROPSPEC rgpspec[  ],
-     PROPVARIANT rgpropvar[  ]);
-
-
-void __stdcall IPropertyStorage_ReadMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_WriteMultiple_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpspec,
-     const PROPSPEC rgpspec[  ],
-     const PROPVARIANT rgpropvar[  ],
-     PROPID propidNameFirst);
-
-
-void __stdcall IPropertyStorage_WriteMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_DeleteMultiple_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpspec,
-     const PROPSPEC rgpspec[  ]);
-
-
-void __stdcall IPropertyStorage_DeleteMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_ReadPropertyNames_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpropid,
-     const PROPID rgpropid[  ],
-     LPOLESTR rglpwstrName[  ]);
-
-
-void __stdcall IPropertyStorage_ReadPropertyNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_WritePropertyNames_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpropid,
-     const PROPID rgpropid[  ],
-     const LPOLESTR rglpwstrName[  ]);
-
-
-void __stdcall IPropertyStorage_WritePropertyNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_DeletePropertyNames_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpropid,
-     const PROPID rgpropid[  ]);
-
-
-void __stdcall IPropertyStorage_DeletePropertyNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_Commit_Proxy( 
-    IPropertyStorage * This,
-     DWORD grfCommitFlags);
-
-
-void __stdcall IPropertyStorage_Commit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_Revert_Proxy( 
-    IPropertyStorage * This);
-
-
-void __stdcall IPropertyStorage_Revert_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_Enum_Proxy( 
-    IPropertyStorage * This,
-     IEnumSTATPROPSTG **ppenum);
-
-
-void __stdcall IPropertyStorage_Enum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_SetTimes_Proxy( 
-    IPropertyStorage * This,
-     const FILETIME *pctime,
-     const FILETIME *patime,
-     const FILETIME *pmtime);
-
-
-void __stdcall IPropertyStorage_SetTimes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_SetClass_Proxy( 
-    IPropertyStorage * This,
-     const IID & clsid);
-
-
-void __stdcall IPropertyStorage_SetClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_Stat_Proxy( 
-    IPropertyStorage * This,
-     STATPROPSETSTG *pstatpsstg);
-
-
-void __stdcall IPropertyStorage_Stat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPropertySetStorage *LPPROPERTYSETSTORAGE;
-
-
-extern "C" const IID IID_IPropertySetStorage;
-
-
-    
-    struct __declspec(uuid("0000013A-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPropertySetStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Create( 
-             const IID & rfmtid,
-             const CLSID *pclsid,
-             DWORD grfFlags,
-             DWORD grfMode,
-             IPropertyStorage **ppprstg) = 0;
-        
-        virtual HRESULT __stdcall Open( 
-             const IID & rfmtid,
-             DWORD grfMode,
-             IPropertyStorage **ppprstg) = 0;
-        
-        virtual HRESULT __stdcall Delete( 
-             const IID & rfmtid) = 0;
-        
-        virtual HRESULT __stdcall Enum( 
-             IEnumSTATPROPSETSTG **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertySetStorage_Create_Proxy( 
-    IPropertySetStorage * This,
-     const IID & rfmtid,
-     const CLSID *pclsid,
-     DWORD grfFlags,
-     DWORD grfMode,
-     IPropertyStorage **ppprstg);
-
-
-void __stdcall IPropertySetStorage_Create_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertySetStorage_Open_Proxy( 
-    IPropertySetStorage * This,
-     const IID & rfmtid,
-     DWORD grfMode,
-     IPropertyStorage **ppprstg);
-
-
-void __stdcall IPropertySetStorage_Open_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertySetStorage_Delete_Proxy( 
-    IPropertySetStorage * This,
-     const IID & rfmtid);
-
-
-void __stdcall IPropertySetStorage_Delete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertySetStorage_Enum_Proxy( 
-    IPropertySetStorage * This,
-     IEnumSTATPROPSETSTG **ppenum);
-
-
-void __stdcall IPropertySetStorage_Enum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumSTATPROPSTG *LPENUMSTATPROPSTG;
-
-
-extern "C" const IID IID_IEnumSTATPROPSTG;
-
-
-    
-    struct __declspec(uuid("00000139-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumSTATPROPSTG : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             STATPROPSTG *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumSTATPROPSTG **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumSTATPROPSTG_RemoteNext_Proxy( 
-    IEnumSTATPROPSTG * This,
-     ULONG celt,
-     STATPROPSTG *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumSTATPROPSTG_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSTG_Skip_Proxy( 
-    IEnumSTATPROPSTG * This,
-     ULONG celt);
-
-
-void __stdcall IEnumSTATPROPSTG_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSTG_Reset_Proxy( 
-    IEnumSTATPROPSTG * This);
-
-
-void __stdcall IEnumSTATPROPSTG_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSTG_Clone_Proxy( 
-    IEnumSTATPROPSTG * This,
-     IEnumSTATPROPSTG **ppenum);
-
-
-void __stdcall IEnumSTATPROPSTG_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG;
-
-
-extern "C" const IID IID_IEnumSTATPROPSETSTG;
-
-
-    
-    struct __declspec(uuid("0000013B-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumSTATPROPSETSTG : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             STATPROPSETSTG *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumSTATPROPSETSTG **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumSTATPROPSETSTG_RemoteNext_Proxy( 
-    IEnumSTATPROPSETSTG * This,
-     ULONG celt,
-     STATPROPSETSTG *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumSTATPROPSETSTG_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSETSTG_Skip_Proxy( 
-    IEnumSTATPROPSETSTG * This,
-     ULONG celt);
-
-
-void __stdcall IEnumSTATPROPSETSTG_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSETSTG_Reset_Proxy( 
-    IEnumSTATPROPSETSTG * This);
-
-
-void __stdcall IEnumSTATPROPSETSTG_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSETSTG_Clone_Proxy( 
-    IEnumSTATPROPSETSTG * This,
-     IEnumSTATPROPSETSTG **ppenum);
-
-
-void __stdcall IEnumSTATPROPSETSTG_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-typedef  IPropertyStorage *LPPROPERTYSTORAGE;
-
-extern "C" __declspec(dllimport) HRESULT __stdcall PropVariantCopy ( PROPVARIANT * pvarDest, const PROPVARIANT * pvarSrc );
-extern "C" __declspec(dllimport) HRESULT __stdcall PropVariantClear ( PROPVARIANT * pvar );
-extern "C" __declspec(dllimport) HRESULT __stdcall FreePropVariantArray ( ULONG cVariants, PROPVARIANT * rgvars );
-
-
-
-inline void PropVariantInit ( PROPVARIANT * pvar )
-{
-    memset ( pvar, 0, sizeof(PROPVARIANT) );
-}
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreatePropStg( IUnknown* pUnk, const IID & fmtid, const CLSID *pclsid, DWORD grfFlags, DWORD dwReserved, IPropertyStorage **ppPropStg );
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenPropStg( IUnknown* pUnk, const IID & fmtid, DWORD grfFlags, DWORD dwReserved, IPropertyStorage **ppPropStg );
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreatePropSetStg( IStorage *pStorage, DWORD dwReserved, IPropertySetStorage **ppPropSetStg);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall FmtIdToPropStgName( const FMTID *pfmtid, LPOLESTR oszName );
-extern "C" __declspec(dllimport) HRESULT __stdcall PropStgNameToFmtId( const LPOLESTR oszName, FMTID *pfmtid );
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_propidl_0120_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_propidl_0120_v0_0_s_ifspec;
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  LPSAFEARRAY_UserSize(     unsigned long *, unsigned long            , LPSAFEARRAY * ); 
-unsigned char * __stdcall  LPSAFEARRAY_UserMarshal(  unsigned long *, unsigned char *, LPSAFEARRAY * ); 
-unsigned char * __stdcall  LPSAFEARRAY_UserUnmarshal(unsigned long *, unsigned char *, LPSAFEARRAY * ); 
-void                      __stdcall  LPSAFEARRAY_UserFree(     unsigned long *, LPSAFEARRAY * ); 
-
- HRESULT __stdcall IEnumSTATPROPSTG_Next_Proxy( 
-    IEnumSTATPROPSTG * This,
-     ULONG celt,
-     STATPROPSTG *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumSTATPROPSTG_Next_Stub( 
-    IEnumSTATPROPSTG * This,
-     ULONG celt,
-     STATPROPSTG *rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall IEnumSTATPROPSETSTG_Next_Proxy( 
-    IEnumSTATPROPSETSTG * This,
-     ULONG celt,
-     STATPROPSETSTG *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumSTATPROPSETSTG_Next_Stub( 
-    IEnumSTATPROPSETSTG * This,
-     ULONG celt,
-     STATPROPSETSTG *rgelt,
-     ULONG *pceltFetched);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateStdProgressIndicator( HWND hwndParent,
-                                     LPCOLESTR pszTitle,
-                                     IBindStatusCallback * pIbscCaller,
-                                    IBindStatusCallback ** ppIbsc);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_StdOle;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BSTR __stdcall SysAllocString(const OLECHAR *);
-extern "C" __declspec(dllimport) INT __stdcall  SysReAllocString(BSTR *, const OLECHAR *);
-extern "C" __declspec(dllimport) BSTR __stdcall SysAllocStringLen(const OLECHAR *, UINT);
-extern "C" __declspec(dllimport) INT __stdcall  SysReAllocStringLen(BSTR *, const OLECHAR *, UINT);
-extern "C" __declspec(dllimport) void __stdcall SysFreeString(BSTR);
-extern "C" __declspec(dllimport) UINT __stdcall SysStringLen(BSTR);
-
-
-extern "C" __declspec(dllimport) UINT __stdcall SysStringByteLen(BSTR bstr);
-extern "C" __declspec(dllimport) BSTR __stdcall SysAllocStringByteLen(LPCSTR psz, UINT len);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) INT __stdcall DosDateTimeToVariantTime(USHORT wDosDate, USHORT wDosTime, DOUBLE * pvtime);
-
-extern "C" __declspec(dllimport) INT __stdcall VariantTimeToDosDateTime(DOUBLE vtime, USHORT * pwDosDate, USHORT * pwDosTime);
-
-
-extern "C" __declspec(dllimport) INT __stdcall SystemTimeToVariantTime(LPSYSTEMTIME lpSystemTime, DOUBLE *pvtime);
-extern "C" __declspec(dllimport) INT __stdcall VariantTimeToSystemTime(DOUBLE vtime, LPSYSTEMTIME lpSystemTime);
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocDescriptor(UINT cDims, SAFEARRAY ** ppsaOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocDescriptorEx(VARTYPE vt, UINT cDims, SAFEARRAY ** ppsaOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocData(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound);
-extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateEx(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound, PVOID pvExtra);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayCopyData(SAFEARRAY *psaSource, SAFEARRAY *psaTarget);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroyDescriptor(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroyData(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroy(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayRedim(SAFEARRAY * psa, SAFEARRAYBOUND * psaboundNew);
-extern "C" __declspec(dllimport) UINT __stdcall SafeArrayGetDim(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) UINT __stdcall SafeArrayGetElemsize(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetUBound(SAFEARRAY * psa, UINT nDim, LONG * plUbound);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetLBound(SAFEARRAY * psa, UINT nDim, LONG * plLbound);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayLock(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayUnlock(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAccessData(SAFEARRAY * psa, void ** ppvData);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayUnaccessData(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayPutElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayCopy(SAFEARRAY * psa, SAFEARRAY ** ppsaOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayPtrOfIndex(SAFEARRAY * psa, LONG * rgIndices, void ** ppvData);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArraySetRecordInfo(SAFEARRAY * psa, IRecordInfo * prinfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetRecordInfo(SAFEARRAY * psa, IRecordInfo ** prinfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArraySetIID(SAFEARRAY * psa, const GUID & guid);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetIID(SAFEARRAY * psa, GUID * pguid);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetVartype(SAFEARRAY * psa, VARTYPE * pvt);
-extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements);
-extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, ULONG cElements, PVOID pvExtra);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall VariantInit(VARIANTARG * pvarg);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantClear(VARIANTARG * pvarg);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantCopy(VARIANTARG * pvargDest, VARIANTARG * pvargSrc);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantCopyInd(VARIANT * pvarDest, VARIANTARG * pvargSrc);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantChangeType(VARIANTARG * pvargDest,
-                VARIANTARG * pvarSrc, USHORT wFlags, VARTYPE vt);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantChangeTypeEx(VARIANTARG * pvargDest,
-                VARIANTARG * pvarSrc, LCID lcid, USHORT wFlags, VARTYPE vt);
-
-
-
-
-                                      
-                                      
-
-				      
-				      
-
-
-                                      
-                                      
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VectorFromBstr (BSTR bstr, SAFEARRAY ** ppsa);
-extern "C" __declspec(dllimport) HRESULT __stdcall BstrFromVector (SAFEARRAY *psa, BSTR *pbstr);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI2(SHORT sIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI4(LONG lIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI8(LONG64 i64In, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromR4(FLOAT fltIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromR8(DOUBLE dblIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromCy(CY cyIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDate(DATE dateIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDisp(IDispatch * pdispIn, LCID lcid, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromBool(VARIANT_BOOL boolIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI1(CHAR cIn, BYTE *pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI2(USHORT uiIn, BYTE *pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI4(ULONG ulIn, BYTE *pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI8(ULONG64 ui64In, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDec(DECIMAL *pdecIn, BYTE *pbOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI1(BYTE bIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI4(LONG lIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI8(LONG64 i64In, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromR4(FLOAT fltIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromR8(DOUBLE dblIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromCy(CY cyIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDate(DATE dateIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDisp(IDispatch * pdispIn, LCID lcid, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromBool(VARIANT_BOOL boolIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI1(CHAR cIn, SHORT *psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI2(USHORT uiIn, SHORT *psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI4(ULONG ulIn, SHORT *psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI8(ULONG64 ui64In, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDec(DECIMAL *pdecIn, SHORT *psOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI1(BYTE bIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI2(SHORT sIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI8(LONG64 i64In, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromR4(FLOAT fltIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromR8(DOUBLE dblIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromCy(CY cyIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDate(DATE dateIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDisp(IDispatch * pdispIn, LCID lcid, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromBool(VARIANT_BOOL boolIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI1(CHAR cIn, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI2(USHORT uiIn, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI4(ULONG ulIn, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI8(ULONG64 ui64In, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDec(DECIMAL *pdecIn, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromInt(INT intIn, LONG *plOut);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI1(BYTE bIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI2(SHORT sIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI4(LONG lIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromR4(FLOAT fltIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromR8(DOUBLE dblIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromCy(CY cyIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDate(DATE dateIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromStr(OLECHAR * strIn, LCID lcid, unsigned long dwFlags, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDisp(IDispatch * pdispIn, LCID lcid, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromBool(VARIANT_BOOL boolIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI1(CHAR cIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI2(USHORT uiIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI4(ULONG ulIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI8(ULONG64 ui64In, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDec(DECIMAL *pdecIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromInt(INT intIn, LONG64 * pi64Out);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI1(BYTE bIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI2(SHORT sIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI4(LONG lIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI8(LONG64 i64In, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromR8(DOUBLE dblIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromCy(CY cyIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDate(DATE dateIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, FLOAT *pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDisp(IDispatch * pdispIn, LCID lcid, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromBool(VARIANT_BOOL boolIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI1(CHAR cIn, FLOAT *pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI2(USHORT uiIn, FLOAT *pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI4(ULONG ulIn, FLOAT *pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI8(ULONG64 ui64In, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDec(DECIMAL *pdecIn, FLOAT *pfltOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI1(BYTE bIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI2(SHORT sIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI4(LONG lIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI8(LONG64 i64In, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromR4(FLOAT fltIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromCy(CY cyIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDate(DATE dateIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DOUBLE *pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDisp(IDispatch * pdispIn, LCID lcid, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromBool(VARIANT_BOOL boolIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI1(CHAR cIn, DOUBLE *pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI2(USHORT uiIn, DOUBLE *pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI4(ULONG ulIn, DOUBLE *pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI8(ULONG64 ui64In, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDec(DECIMAL *pdecIn, DOUBLE *pdblOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI1(BYTE bIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI2(SHORT sIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI4(LONG lIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI8(LONG64 i64In, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromR4(FLOAT fltIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromR8(DOUBLE dblIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromCy(CY cyIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromDisp(IDispatch * pdispIn, LCID lcid, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromBool(VARIANT_BOOL boolIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI1(CHAR cIn, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI2(USHORT uiIn, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI4(ULONG ulIn, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI8(ULONG64 ui64In, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromDec(DECIMAL *pdecIn, DATE *pdateOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI1(BYTE bIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI2(SHORT sIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI4(LONG lIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI8(LONG64 i64In, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromR4(FLOAT fltIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromR8(DOUBLE dblIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDate(DATE dateIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDisp(IDispatch * pdispIn, LCID lcid, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromBool(VARIANT_BOOL boolIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI1(CHAR cIn, CY *pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI2(USHORT uiIn, CY *pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI4(ULONG ulIn, CY *pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI8(ULONG64 ui64In, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDec(DECIMAL *pdecIn, CY *pcyOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI1(BYTE bVal, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI2(SHORT iVal, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI4(LONG lIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI8(LONG64 i64In, LCID lcid, unsigned long dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromR4(FLOAT fltIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromR8(DOUBLE dblIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDisp(IDispatch * pdispIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI1(CHAR cIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI2(USHORT uiIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI4(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI8(ULONG64 ui64In, LCID lcid, unsigned long dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDec(DECIMAL *pdecIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI1(BYTE bIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI2(SHORT sIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI4(LONG lIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI8(LONG64 i64In, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromR4(FLOAT fltIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromR8(DOUBLE dblIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDate(DATE dateIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromCy(CY cyIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDisp(IDispatch * pdispIn, LCID lcid, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI1(CHAR cIn, VARIANT_BOOL *pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI2(USHORT uiIn, VARIANT_BOOL *pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI4(ULONG ulIn, VARIANT_BOOL *pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI8(ULONG64 i64In, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDec(DECIMAL *pdecIn, VARIANT_BOOL *pboolOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromUI1(
-         BYTE bIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromI2(
-         SHORT uiIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromI4(
-         LONG lIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromI8(
-         LONG64 i64In,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromR4(
-         FLOAT fltIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromR8(
-         DOUBLE dblIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromDate(
-         DATE dateIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromCy(
-         CY cyIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromStr(
-         OLECHAR *strIn,
-         LCID lcid,
-         ULONG dwFlags,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromDisp(
-         IDispatch *pdispIn,
-         LCID lcid,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromBool(
-         VARIANT_BOOL boolIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromUI2(
-         USHORT uiIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromUI4(
-         ULONG ulIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromUI8(
-         ULONG64 i64In,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromDec(
-         DECIMAL *pdecIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI1(BYTE bIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI2(SHORT uiIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI4(LONG lIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI8(LONG64 i64In, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromR4(FLOAT fltIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromR8(DOUBLE dblIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDate(DATE dateIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromCy(CY cyIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDisp(IDispatch *pdispIn, LCID lcid, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromBool(VARIANT_BOOL boolIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI1(CHAR cIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI4(ULONG ulIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI8(ULONG64 i64In, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDec(DECIMAL *pdecIn, USHORT *puiOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI1(BYTE bIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI2(SHORT uiIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI4(LONG lIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI8(LONG64 i64In, ULONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromR4(FLOAT fltIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromR8(DOUBLE dblIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDate(DATE dateIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromCy(CY cyIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDisp(IDispatch *pdispIn, LCID lcid, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromBool(VARIANT_BOOL boolIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI1(CHAR cIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI2(USHORT uiIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI8(ULONG64 ui64In, ULONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDec(DECIMAL *pdecIn, ULONG *pulOut);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI1(BYTE bIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI2(SHORT sIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI4(LONG lIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI8(LONG64 ui64In, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromR4(FLOAT fltIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromR8(DOUBLE dblIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromCy(CY cyIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDate(DATE dateIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromStr(OLECHAR * strIn, LCID lcid, unsigned long dwFlags, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDisp(IDispatch * pdispIn, LCID lcid, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromBool(VARIANT_BOOL boolIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI1(CHAR cIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI2(USHORT uiIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI4(ULONG ulIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDec(DECIMAL *pdecIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromInt(INT intIn, ULONG64 * pi64Out);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI1(BYTE bIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI2(SHORT uiIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI4(LONG lIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI8(LONG64 i64In, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromR4(FLOAT fltIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromR8(DOUBLE dblIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromDate(DATE dateIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromCy(CY cyIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromDisp(IDispatch *pdispIn, LCID lcid, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromBool(VARIANT_BOOL boolIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI1(CHAR cIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI2(USHORT uiIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI4(ULONG ulIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI8(ULONG64 ui64In, DECIMAL *pdecOut);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI8(LONG64 i64In, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI8(ULONG64 ui64In, LONG *plOut);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    INT   cDig;
-    ULONG dwInFlags;
-    ULONG dwOutFlags;
-    INT   cchUsed;
-    INT   nBaseShift;
-    INT   nPwr10;
-} NUMPARSE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarParseNumFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags,
-            NUMPARSE * pnumprs, BYTE * rgbDig);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarNumFromParseNum(NUMPARSE * pnumprs, BYTE * rgbDig,
-            ULONG dwVtBits, VARIANT * pvar);
-
-
-
-
-
-extern "C" HRESULT __stdcall VarAdd(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarAnd(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarCat(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarDiv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarEqv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarIdiv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarImp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarMod(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarMul(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarOr(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarPow(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarSub(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarXor(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-
-extern "C" HRESULT __stdcall VarAbs(LPVARIANT pvarIn, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarFix(LPVARIANT pvarIn, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarInt(LPVARIANT pvarIn, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarNeg(LPVARIANT pvarIn, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarNot(LPVARIANT pvarIn, LPVARIANT pvarResult);
-
-extern "C" HRESULT __stdcall VarRound(LPVARIANT pvarIn, int cDecimals, LPVARIANT pvarResult);
-
-
-extern "C" HRESULT __stdcall VarCmp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid, ULONG dwFlags);
-
-
-extern "C++" {
-
-__inline
-HRESULT
-
-__stdcall
-
-VarCmp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid) {
-    return VarCmp(pvarLeft, pvarRight, lcid, 0);
-}
-} 
-
-
-
-
-
-extern "C" HRESULT __stdcall VarDecAdd(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecDiv(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecMul(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecSub(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
-
-extern "C" HRESULT __stdcall VarDecAbs(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecFix(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecInt(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecNeg(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
-
-extern "C" HRESULT __stdcall VarDecRound(LPDECIMAL pdecIn, int cDecimals, LPDECIMAL pdecResult);
-
-extern "C" HRESULT __stdcall VarDecCmp(LPDECIMAL pdecLeft, LPDECIMAL pdecRight);
-extern "C" HRESULT __stdcall VarDecCmpR8(LPDECIMAL pdecLeft, double dblRight);
-
-
-
-
-extern "C" HRESULT __stdcall VarCyAdd(CY cyLeft, CY cyRight, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyMul(CY cyLeft, CY cyRight, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyMulI4(CY cyLeft, long lRight, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyMulI8(CY cyLeft, LONG64 lRight, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCySub(CY cyLeft, CY cyRight, LPCY pcyResult);
-
-extern "C" HRESULT __stdcall VarCyAbs(CY cyIn, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyFix(CY cyIn, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyInt(CY cyIn, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyNeg(CY cyIn, LPCY pcyResult);
-
-extern "C" HRESULT __stdcall VarCyRound(CY cyIn, int cDecimals, LPCY pcyResult);
-
-extern "C" HRESULT __stdcall VarCyCmp(CY cyLeft, CY cyRight);
-extern "C" HRESULT __stdcall VarCyCmpR8(CY cyLeft, double dblRight);
-
-
-
-
-extern "C" HRESULT __stdcall VarBstrCat(BSTR bstrLeft, BSTR bstrRight, LPBSTR pbstrResult);
-extern "C" HRESULT __stdcall VarBstrCmp(BSTR bstrLeft, BSTR bstrRight, LCID lcid, ULONG dwFlags); 
-extern "C" HRESULT __stdcall VarR8Pow(double dblLeft, double dblRight, double *pdblResult);
-extern "C" HRESULT __stdcall VarR4CmpR8(float fltLeft, double dblRight);
-extern "C" HRESULT __stdcall VarR8Round(double dblIn, int cDecimals, double *pdblResult);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    SYSTEMTIME st;
-    USHORT  wDayOfYear;
-} UDATE;
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUdate(UDATE *pudateIn, ULONG dwFlags, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUdateEx(UDATE *pudateIn, LCID lcid, ULONG dwFlags, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUdateFromDate(DATE dateIn, ULONG dwFlags, UDATE *pudateOut);
-
-
-
-   
-extern "C" __declspec(dllimport) HRESULT __stdcall GetAltMonthNames(LCID lcid, LPOLESTR * * prgp);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormat(LPVARIANT pvarIn, LPOLESTR pstrFormat, int iFirstDay, int iFirstWeek, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatDateTime(LPVARIANT pvarIn, int iNamedFormat, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatNumber(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatPercent(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatCurrency(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarWeekdayName(int iWeekday, int fAbbrev, int iFirstDay, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarMonthName(int iMonth, int fAbbrev, ULONG dwFlags, BSTR *pbstrOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatFromTokens(LPVARIANT pvarIn, LPOLESTR pstrFormat, LPBYTE pbTokCur, ULONG dwFlags, BSTR *pbstrOut, LCID lcid);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarTokenizeFormatString(LPOLESTR pstrFormat, LPBYTE rgbTok, int cbTok, int iFirstDay, int iFirstWeek, LCID lcid, int *pcbActual);
-
-
-
-
-
-typedef ITypeLib * LPTYPELIB;
-
-
-
-
-
-
-
-typedef LONG DISPID;
-typedef DISPID MEMBERID;
-
-
-
-
-
-
-
-
-
-
-
-typedef ITypeInfo * LPTYPEINFO;
-
-
-
-
-
-
-typedef ITypeComp * LPTYPECOMP;
-
-
-
-
-
-
-typedef ICreateTypeLib * LPCREATETYPELIB;
-
-typedef ICreateTypeInfo * LPCREATETYPEINFO;
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) ULONG __stdcall LHashValOfNameSysA(SYSKIND syskind, LCID lcid,
-            LPCSTR szName);
-
-
-extern "C" __declspec(dllimport) ULONG __stdcall
-LHashValOfNameSys(SYSKIND syskind, LCID lcid, const OLECHAR * szName);
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall LoadTypeLib(const OLECHAR  *szFile, ITypeLib ** pptlib);
-
-
-
-typedef enum tagREGKIND
-{
-    REGKIND_DEFAULT,
-    REGKIND_REGISTER,
-    REGKIND_NONE
-} REGKIND;
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall LoadTypeLibEx(LPCOLESTR szFile, REGKIND regkind,
-            ITypeLib ** pptlib);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall LoadRegTypeLib(const GUID & rguid, WORD wVerMajor, WORD wVerMinor,
-            LCID lcid, ITypeLib ** pptlib);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall QueryPathOfRegTypeLib(const GUID & guid, USHORT wMaj, USHORT wMin,
-            LCID lcid, LPBSTR lpbstrPathName);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall RegisterTypeLib(ITypeLib * ptlib, OLECHAR  *szFullPath,
-            OLECHAR  *szHelpDir);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall UnRegisterTypeLib(const GUID & libID, WORD wVerMajor,
-            WORD wVerMinor, LCID lcid, SYSKIND syskind);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateTypeLib(SYSKIND syskind, const OLECHAR  *szFile,
-            ICreateTypeLib ** ppctlib);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateTypeLib2(SYSKIND syskind, LPCOLESTR szFile,
-            ICreateTypeLib2 **ppctlib);
-
-
-
-
-
-
-typedef IDispatch * LPDISPATCH;
-
-typedef struct tagPARAMDATA {
-    OLECHAR * szName;   
-    VARTYPE vt;         
-} PARAMDATA, * LPPARAMDATA;
-
-typedef struct tagMETHODDATA {
-    OLECHAR * szName;   
-    PARAMDATA * ppdata; 
-    DISPID dispid;      
-    UINT iMeth;         
-    CALLCONV cc;        
-    UINT cArgs;         
-    WORD wFlags;        
-    VARTYPE vtReturn;
-} METHODDATA, * LPMETHODDATA;
-
-typedef struct tagINTERFACEDATA {
-    METHODDATA * pmethdata;  
-    UINT cMembers;      
-} INTERFACEDATA, * LPINTERFACEDATA;
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DispGetParam(DISPPARAMS * pdispparams, UINT position,
-            VARTYPE vtTarg, VARIANT * pvarResult, UINT * puArgErr);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DispGetIDsOfNames(ITypeInfo * ptinfo, OLECHAR ** rgszNames,
-            UINT cNames, DISPID * rgdispid);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DispInvoke(void * _this, ITypeInfo * ptinfo, DISPID dispidMember,
-            WORD wFlags, DISPPARAMS * pparams, VARIANT * pvarResult,
-            EXCEPINFO * pexcepinfo, UINT * puArgErr);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateDispTypeInfo(INTERFACEDATA * pidata, LCID lcid,
-            ITypeInfo ** pptinfo);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateStdDispatch(IUnknown * punkOuter, void * pvThis,
-            ITypeInfo * ptinfo, IUnknown ** ppunkStdDisp);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DispCallFunc(void * pvInstance, ULONG_PTR oVft, CALLCONV cc,
-            VARTYPE vtReturn, UINT  cActuals, VARTYPE * prgvt,
-            VARIANTARG ** prgpvarg, VARIANT * pvargResult);
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall RegisterActiveObject(IUnknown * punk, const IID & rclsid,
-            DWORD dwFlags, DWORD * pdwRegister);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall RevokeActiveObject(DWORD dwRegister, void * pvReserved);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetActiveObject(const IID & rclsid, void * pvReserved,
-            IUnknown ** ppunk);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SetErrorInfo(ULONG dwReserved, IErrorInfo * perrinfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall GetErrorInfo(ULONG dwReserved, IErrorInfo ** pperrinfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateErrorInfo(ICreateErrorInfo ** pperrinfo);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetRecordInfoFromTypeInfo(ITypeInfo * pTypeInfo,
-            IRecordInfo ** ppRecInfo);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetRecordInfoFromGuids(const GUID & rGuidTypeLib,
-            ULONG uVerMajor, ULONG uVerMinor, LCID lcid,
-            const GUID & rGuidTypeInfo, IRecordInfo ** ppRecInfo);
-
-
-
-
-
-extern "C" __declspec(dllimport) ULONG __stdcall OaBuildVersion(void);
-
-extern "C" __declspec(dllimport) void __stdcall ClearCustData(LPCUSTDATA pCustData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataAdviseHolder( LPDATAADVISEHOLDER * ppDAHolder);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall OleBuildVersion( void );
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall ReadClassStg( LPSTORAGE pStg,  CLSID * pclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall WriteClassStg( LPSTORAGE pStg,  const IID & rclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall ReadClassStm( LPSTREAM pStm,  CLSID * pclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall WriteClassStm( LPSTREAM pStm,  const IID & rclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall WriteFmtUserTypeStg ( LPSTORAGE pstg,  CLIPFORMAT cf,  LPOLESTR lpszUserType);
-extern "C" __declspec(dllimport) HRESULT __stdcall ReadFmtUserTypeStg ( LPSTORAGE pstg,  CLIPFORMAT * pcf,  LPOLESTR * lplpszUserType);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleInitialize( LPVOID pvReserved);
-extern "C" __declspec(dllimport) void __stdcall OleUninitialize(void);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleQueryLinkFromData( LPDATAOBJECT pSrcDataObject);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleQueryCreateFromData( LPDATAOBJECT pSrcDataObject);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreate( const IID & rclsid,  const IID & riid,  DWORD renderopt,
-                 LPFORMATETC pFormatEtc,  LPOLECLIENTSITE pClientSite,
-                 LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateEx( const IID & rclsid,  const IID & riid,  DWORD dwFlags,
-                 DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-                 DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-                 LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromData( LPDATAOBJECT pSrcDataObj,  const IID & riid,
-                 DWORD renderopt,  LPFORMATETC pFormatEtc,
-                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
-                 LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromDataEx( LPDATAOBJECT pSrcDataObj,  const IID & riid,
-                 DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-                 DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-                 LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkFromData( LPDATAOBJECT pSrcDataObj,  const IID & riid,
-                 DWORD renderopt,  LPFORMATETC pFormatEtc,
-                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
-                 LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkFromDataEx( LPDATAOBJECT pSrcDataObj,  const IID & riid,
-                 DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-                  DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-                 LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateStaticFromData( LPDATAOBJECT pSrcDataObj,  const IID & iid,
-                 DWORD renderopt,  LPFORMATETC pFormatEtc,
-                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
-                 LPVOID * ppvObj);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLink( LPMONIKER pmkLinkSrc,  const IID & riid,
-             DWORD renderopt,  LPFORMATETC lpFormatEtc,
-             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkEx( LPMONIKER pmkLinkSrc,  const IID & riid,
-             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-             LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkToFile( LPCOLESTR lpszFileName,  const IID & riid,
-             DWORD renderopt,  LPFORMATETC lpFormatEtc,
-             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkToFileEx( LPCOLESTR lpszFileName,  const IID & riid,
-             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-             LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromFile( const IID & rclsid,  LPCOLESTR lpszFileName,  const IID & riid,
-             DWORD renderopt,  LPFORMATETC lpFormatEtc,
-             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromFileEx( const IID & rclsid,  LPCOLESTR lpszFileName,  const IID & riid,
-             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-             LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleLoad( LPSTORAGE pStg,  const IID & riid,  LPOLECLIENTSITE pClientSite,
-             LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleSave( LPPERSISTSTORAGE pPS,  LPSTORAGE pStg,  BOOL fSameAsLoad);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleLoadFromStream(  LPSTREAM pStm,  const IID & iidInterface,  LPVOID * ppvObj);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleSaveToStream(  LPPERSISTSTREAM pPStm,  LPSTREAM pStm );
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleSetContainedObject( LPUNKNOWN pUnknown,  BOOL fContained);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleNoteObjectVisible( LPUNKNOWN pUnknown,  BOOL fVisible);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  RegisterDragDrop( HWND hwnd,  LPDROPTARGET pDropTarget);
-extern "C" __declspec(dllimport) HRESULT __stdcall  RevokeDragDrop( HWND hwnd);
-extern "C" __declspec(dllimport) HRESULT __stdcall  DoDragDrop( LPDATAOBJECT pDataObj,  LPDROPSOURCE pDropSource,
-             DWORD dwOKEffects,  LPDWORD pdwEffect);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleSetClipboard( LPDATAOBJECT pDataObj);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleGetClipboard( LPDATAOBJECT * ppDataObj);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleFlushClipboard(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleIsCurrentClipboard( LPDATAOBJECT pDataObj);
-
-
-
-
-extern "C" __declspec(dllimport) HOLEMENU __stdcall   OleCreateMenuDescriptor ( HMENU hmenuCombined,
-                                 LPOLEMENUGROUPWIDTHS lpMenuWidths);
-extern "C" __declspec(dllimport) HRESULT __stdcall              OleSetMenuDescriptor ( HOLEMENU holemenu,  HWND hwndFrame,
-                                 HWND hwndActiveObject,
-                                 LPOLEINPLACEFRAME lpFrame,
-                                 LPOLEINPLACEACTIVEOBJECT lpActiveObj);
-extern "C" __declspec(dllimport) HRESULT __stdcall              OleDestroyMenuDescriptor ( HOLEMENU holemenu);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall              OleTranslateAccelerator ( LPOLEINPLACEFRAME lpFrame,
-                             LPOLEINPLACEFRAMEINFO lpFrameInfo,  LPMSG lpmsg);
-
-
-
-extern "C" __declspec(dllimport) HANDLE __stdcall OleDuplicateData ( HANDLE hSrc,  CLIPFORMAT cfFormat,
-                         UINT uiFlags);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleDraw ( LPUNKNOWN pUnknown,  DWORD dwAspect,  HDC hdcDraw,
-                     LPCRECT lprcBounds);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleRun( LPUNKNOWN pUnknown);
-extern "C" __declspec(dllimport) BOOL __stdcall   OleIsRunning( LPOLEOBJECT pObject);
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleLockRunning( LPUNKNOWN pUnknown,  BOOL fLock,  BOOL fLastUnlockCloses);
-extern "C" __declspec(dllimport) void __stdcall   ReleaseStgMedium( LPSTGMEDIUM);
-extern "C" __declspec(dllimport) HRESULT __stdcall          CreateOleAdviseHolder( LPOLEADVISEHOLDER * ppOAHolder);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleCreateDefaultHandler( const IID & clsid,  LPUNKNOWN pUnkOuter,
-                     const IID & riid,  LPVOID * lplpObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleCreateEmbeddingHelper( const IID & clsid,  LPUNKNOWN pUnkOuter,
-                     DWORD flags,  LPCLASSFACTORY pCF,
-                     const IID & riid,  LPVOID * lplpObj);
-
-extern "C" __declspec(dllimport) BOOL __stdcall   IsAccelerator( HACCEL hAccel,  int cAccelEntries,  LPMSG lpMsg,
-                                         WORD * lpwCmd);
-
-
-extern "C" __declspec(dllimport) HGLOBAL __stdcall OleGetIconOfFile( LPOLESTR lpszPath,  BOOL fUseFileAsLabel);
-
-extern "C" __declspec(dllimport) HGLOBAL __stdcall OleGetIconOfClass( const IID & rclsid,      LPOLESTR lpszLabel,
-                                         BOOL fUseTypeAsLabel);
-
-extern "C" __declspec(dllimport) HGLOBAL __stdcall OleMetafilePictFromIconAndLabel( HICON hIcon,  LPOLESTR lpszLabel,
-                                         LPOLESTR lpszSourceFile,  UINT iIconIndex);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegGetUserType ( const IID & clsid,  DWORD dwFormOfType,
-                                         LPOLESTR * pszUserType);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegGetMiscStatus     ( const IID & clsid,  DWORD dwAspect,
-                                         DWORD * pdwStatus);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegEnumFormatEtc     ( const IID & clsid,  DWORD dwDirection,
-                                         LPENUMFORMATETC * ppenum);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegEnumVerbs ( const IID & clsid,  LPENUMOLEVERB * ppenum);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OLESTREAM *  LPOLESTREAM;
-
-typedef struct _OLESTREAMVTBL
-{
-    DWORD (__stdcall* Get)(LPOLESTREAM, void *, DWORD);
-    DWORD (__stdcall* Put)(LPOLESTREAM, const void *, DWORD);
-} OLESTREAMVTBL;
-typedef  OLESTREAMVTBL *  LPOLESTREAMVTBL;
-
-typedef struct _OLESTREAM
-{
-    LPOLESTREAMVTBL lpstbl;
-} OLESTREAM;
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertOLESTREAMToIStorage
-    ( LPOLESTREAM                lpolestream,
-     LPSTORAGE                   pstg,
-     const DVTARGETDEVICE *   ptd);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertIStorageToOLESTREAM
-    ( LPSTORAGE      pstg,
-     LPOLESTREAM     lpolestream);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetHGlobalFromILockBytes ( LPLOCKBYTES plkbyt,  HGLOBAL * phglobal);
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateILockBytesOnHGlobal ( HGLOBAL hGlobal,  BOOL fDeleteOnRelease,
-                                     LPLOCKBYTES * pplkbyt);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetHGlobalFromStream ( LPSTREAM pstm,  HGLOBAL * phglobal);
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateStreamOnHGlobal ( HGLOBAL hGlobal,  BOOL fDeleteOnRelease,
-                                 LPSTREAM * ppstm);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleDoAutoConvert( LPSTORAGE pStg,  LPCLSID pClsidNew);
-extern "C" __declspec(dllimport) HRESULT __stdcall OleGetAutoConvert( const IID & clsidOld,  LPCLSID pClsidNew);
-extern "C" __declspec(dllimport) HRESULT __stdcall OleSetAutoConvert( const IID & clsidOld,  const IID & clsidNew);
-extern "C" __declspec(dllimport) HRESULT __stdcall GetConvertStg( LPSTORAGE pStg);
-extern "C" __declspec(dllimport) HRESULT __stdcall SetConvertStg( LPSTORAGE pStg,  BOOL fConvert);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertIStorageToOLESTREAMEx
-    ( LPSTORAGE          pstg,
-                                    
-      CLIPFORMAT         cfFormat,   
-      LONG               lWidth,     
-      LONG               lHeight,    
-      DWORD              dwSize,     
-      LPSTGMEDIUM        pmedium,    
-      LPOLESTREAM        polestm);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertOLESTREAMToIStorageEx
-    ( LPOLESTREAM        polestm,
-      LPSTORAGE          pstg,
-                                    
-      CLIPFORMAT *    pcfFormat,  
-      LONG *          plwWidth,   
-      LONG *          plHeight,   
-      DWORD *         pdwSize,    
-      LPSTGMEDIUM        pmedium);   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const GUID  IID_IPrintDialogCallback;
-
-
-
-
-
-
-extern "C" const GUID  IID_IPrintDialogServices;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagOFN_NT4A {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HINSTANCE    hInstance;
-   LPCSTR       lpstrFilter;
-   LPSTR        lpstrCustomFilter;
-   DWORD        nMaxCustFilter;
-   DWORD        nFilterIndex;
-   LPSTR        lpstrFile;
-   DWORD        nMaxFile;
-   LPSTR        lpstrFileTitle;
-   DWORD        nMaxFileTitle;
-   LPCSTR       lpstrInitialDir;
-   LPCSTR       lpstrTitle;
-   DWORD        Flags;
-   WORD         nFileOffset;
-   WORD         nFileExtension;
-   LPCSTR       lpstrDefExt;
-   LPARAM       lCustData;
-   LPOFNHOOKPROC lpfnHook;
-   LPCSTR       lpTemplateName;
-} OPENFILENAME_NT4A, *LPOPENFILENAME_NT4A;
-typedef struct tagOFN_NT4W {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HINSTANCE    hInstance;
-   LPCWSTR      lpstrFilter;
-   LPWSTR       lpstrCustomFilter;
-   DWORD        nMaxCustFilter;
-   DWORD        nFilterIndex;
-   LPWSTR       lpstrFile;
-   DWORD        nMaxFile;
-   LPWSTR       lpstrFileTitle;
-   DWORD        nMaxFileTitle;
-   LPCWSTR      lpstrInitialDir;
-   LPCWSTR      lpstrTitle;
-   DWORD        Flags;
-   WORD         nFileOffset;
-   WORD         nFileExtension;
-   LPCWSTR      lpstrDefExt;
-   LPARAM       lCustData;
-   LPOFNHOOKPROC lpfnHook;
-   LPCWSTR      lpTemplateName;
-} OPENFILENAME_NT4W, *LPOPENFILENAME_NT4W;
-
-typedef OPENFILENAME_NT4W OPENFILENAME_NT4;
-typedef LPOPENFILENAME_NT4W LPOPENFILENAME_NT4;
-
-
-
-
-
-typedef struct tagOFNA {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HINSTANCE    hInstance;
-   LPCSTR       lpstrFilter;
-   LPSTR        lpstrCustomFilter;
-   DWORD        nMaxCustFilter;
-   DWORD        nFilterIndex;
-   LPSTR        lpstrFile;
-   DWORD        nMaxFile;
-   LPSTR        lpstrFileTitle;
-   DWORD        nMaxFileTitle;
-   LPCSTR       lpstrInitialDir;
-   LPCSTR       lpstrTitle;
-   DWORD        Flags;
-   WORD         nFileOffset;
-   WORD         nFileExtension;
-   LPCSTR       lpstrDefExt;
-   LPARAM       lCustData;
-   LPOFNHOOKPROC lpfnHook;
-   LPCSTR       lpTemplateName;
-
-
-
-
-
-   void *		pvReserved;
-   DWORD        dwReserved;
-   DWORD        FlagsEx;
-
-} OPENFILENAMEA, *LPOPENFILENAMEA;
-typedef struct tagOFNW {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HINSTANCE    hInstance;
-   LPCWSTR      lpstrFilter;
-   LPWSTR       lpstrCustomFilter;
-   DWORD        nMaxCustFilter;
-   DWORD        nFilterIndex;
-   LPWSTR       lpstrFile;
-   DWORD        nMaxFile;
-   LPWSTR       lpstrFileTitle;
-   DWORD        nMaxFileTitle;
-   LPCWSTR      lpstrInitialDir;
-   LPCWSTR      lpstrTitle;
-   DWORD        Flags;
-   WORD         nFileOffset;
-   WORD         nFileExtension;
-   LPCWSTR      lpstrDefExt;
-   LPARAM       lCustData;
-   LPOFNHOOKPROC lpfnHook;
-   LPCWSTR      lpTemplateName;
-
-
-
-
-
-   void *		pvReserved;
-   DWORD        dwReserved;
-   DWORD        FlagsEx;
-
-} OPENFILENAMEW, *LPOPENFILENAMEW;
-
-typedef OPENFILENAMEW OPENFILENAME;
-typedef LPOPENFILENAMEW LPOPENFILENAME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetOpenFileNameA(LPOPENFILENAMEA);
-__declspec(dllimport) BOOL  __stdcall GetOpenFileNameW(LPOPENFILENAMEW);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetSaveFileNameA(LPOPENFILENAMEA);
-__declspec(dllimport) BOOL  __stdcall GetSaveFileNameW(LPOPENFILENAMEW);
-
-
-
-
-
-
-
-__declspec(dllimport) short __stdcall GetFileTitleA(LPCSTR, LPSTR, WORD);
-__declspec(dllimport) short __stdcall GetFileTitleW(LPCWSTR, LPWSTR, WORD);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-
-
-typedef struct _OFNOTIFYA
-{
-        NMHDR           hdr;
-        LPOPENFILENAMEA lpOFN;
-        LPSTR           pszFile;        
-} OFNOTIFYA, *LPOFNOTIFYA;
-
-typedef struct _OFNOTIFYW
-{
-        NMHDR           hdr;
-        LPOPENFILENAMEW lpOFN;
-        LPWSTR          pszFile;        
-} OFNOTIFYW, *LPOFNOTIFYW;
-
-typedef OFNOTIFYW OFNOTIFY;
-typedef LPOFNOTIFYW LPOFNOTIFY;
-
-
-
-
-
-
-
-typedef struct _OFNOTIFYEXA
-{
-        NMHDR           hdr;
-        LPOPENFILENAMEA lpOFN;
-        LPVOID          psf;
-        LPVOID          pidl;          
-} OFNOTIFYEXA, *LPOFNOTIFYEXA;
-
-typedef struct _OFNOTIFYEXW
-{
-        NMHDR           hdr;
-        LPOPENFILENAMEW lpOFN;
-        LPVOID          psf;
-        LPVOID          pidl;          
-} OFNOTIFYEXW, *LPOFNOTIFYEXW;
-
-typedef OFNOTIFYEXW OFNOTIFYEX;
-typedef LPOFNOTIFYEXW LPOFNOTIFYEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCHOOSECOLORA {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HWND         hInstance;
-   COLORREF     rgbResult;
-   COLORREF*    lpCustColors;
-   DWORD        Flags;
-   LPARAM       lCustData;
-   LPCCHOOKPROC lpfnHook;
-   LPCSTR       lpTemplateName;
-} CHOOSECOLORA, *LPCHOOSECOLORA;
-typedef struct tagCHOOSECOLORW {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HWND         hInstance;
-   COLORREF     rgbResult;
-   COLORREF*    lpCustColors;
-   DWORD        Flags;
-   LPARAM       lCustData;
-   LPCCHOOKPROC lpfnHook;
-   LPCWSTR      lpTemplateName;
-} CHOOSECOLORW, *LPCHOOSECOLORW;
-
-typedef CHOOSECOLORW CHOOSECOLOR;
-typedef LPCHOOSECOLORW LPCHOOSECOLOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall ChooseColorA(LPCHOOSECOLORA);
-__declspec(dllimport) BOOL __stdcall ChooseColorW(LPCHOOSECOLORW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-typedef struct tagFINDREPLACEA {
-   DWORD        lStructSize;        
-   HWND         hwndOwner;          
-   HINSTANCE    hInstance;          
-                                    
-   DWORD        Flags;              
-   LPSTR        lpstrFindWhat;      
-   LPSTR        lpstrReplaceWith;   
-   WORD         wFindWhatLen;       
-   WORD         wReplaceWithLen;    
-   LPARAM       lCustData;          
-   LPFRHOOKPROC lpfnHook;           
-   LPCSTR       lpTemplateName;     
-} FINDREPLACEA, *LPFINDREPLACEA;
-typedef struct tagFINDREPLACEW {
-   DWORD        lStructSize;        
-   HWND         hwndOwner;          
-   HINSTANCE    hInstance;          
-                                    
-   DWORD        Flags;              
-   LPWSTR       lpstrFindWhat;      
-   LPWSTR       lpstrReplaceWith;   
-   WORD         wFindWhatLen;       
-   WORD         wReplaceWithLen;    
-   LPARAM       lCustData;          
-   LPFRHOOKPROC lpfnHook;           
-   LPCWSTR      lpTemplateName;     
-} FINDREPLACEW, *LPFINDREPLACEW;
-
-typedef FINDREPLACEW FINDREPLACE;
-typedef LPFINDREPLACEW LPFINDREPLACE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) HWND __stdcall FindTextA(LPFINDREPLACEA);
-__declspec(dllimport) HWND __stdcall FindTextW(LPFINDREPLACEW);
-
-
-
-
-
-
-__declspec(dllimport) HWND __stdcall ReplaceTextA(LPFINDREPLACEA);
-__declspec(dllimport) HWND __stdcall ReplaceTextW(LPFINDREPLACEW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-typedef struct tagCHOOSEFONTA {
-   DWORD           lStructSize;
-   HWND            hwndOwner;          
-   HDC             hDC;                
-   LPLOGFONTA      lpLogFont;          
-   INT             iPointSize;         
-   DWORD           Flags;              
-   COLORREF        rgbColors;          
-   LPARAM          lCustData;          
-   LPCFHOOKPROC    lpfnHook;           
-   LPCSTR          lpTemplateName;     
-   HINSTANCE       hInstance;          
-                                       
-   LPSTR           lpszStyle;          
-                                       
-   WORD            nFontType;          
-                                       
-                                       
-   WORD            ___MISSING_ALIGNMENT__;
-   INT             nSizeMin;           
-   INT             nSizeMax;           
-                                       
-} CHOOSEFONTA, *LPCHOOSEFONTA;
-typedef struct tagCHOOSEFONTW {
-   DWORD           lStructSize;
-   HWND            hwndOwner;          
-   HDC             hDC;                
-   LPLOGFONTW      lpLogFont;          
-   INT             iPointSize;         
-   DWORD           Flags;              
-   COLORREF        rgbColors;          
-   LPARAM          lCustData;          
-   LPCFHOOKPROC    lpfnHook;           
-   LPCWSTR         lpTemplateName;     
-   HINSTANCE       hInstance;          
-                                       
-   LPWSTR          lpszStyle;          
-                                       
-   WORD            nFontType;          
-                                       
-                                       
-   WORD            ___MISSING_ALIGNMENT__;
-   INT             nSizeMin;           
-   INT             nSizeMax;           
-                                       
-} CHOOSEFONTW, *LPCHOOSEFONTW;
-
-typedef CHOOSEFONTW CHOOSEFONT;
-typedef LPCHOOSEFONTW LPCHOOSEFONT;
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall ChooseFontA(LPCHOOSEFONTA);
-__declspec(dllimport) BOOL __stdcall ChooseFontW(LPCHOOSEFONTW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPPRINTHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-typedef UINT_PTR (__stdcall *LPSETUPHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-typedef struct tagPDA {
-   DWORD            lStructSize;
-   HWND             hwndOwner;
-   HGLOBAL          hDevMode;
-   HGLOBAL          hDevNames;
-   HDC              hDC;
-   DWORD            Flags;
-   WORD             nFromPage;
-   WORD             nToPage;
-   WORD             nMinPage;
-   WORD             nMaxPage;
-   WORD             nCopies;
-   HINSTANCE        hInstance;
-   LPARAM           lCustData;
-   LPPRINTHOOKPROC  lpfnPrintHook;
-   LPSETUPHOOKPROC  lpfnSetupHook;
-   LPCSTR           lpPrintTemplateName;
-   LPCSTR           lpSetupTemplateName;
-   HGLOBAL          hPrintTemplate;
-   HGLOBAL          hSetupTemplate;
-} PRINTDLGA, *LPPRINTDLGA;
-typedef struct tagPDW {
-   DWORD            lStructSize;
-   HWND             hwndOwner;
-   HGLOBAL          hDevMode;
-   HGLOBAL          hDevNames;
-   HDC              hDC;
-   DWORD            Flags;
-   WORD             nFromPage;
-   WORD             nToPage;
-   WORD             nMinPage;
-   WORD             nMaxPage;
-   WORD             nCopies;
-   HINSTANCE        hInstance;
-   LPARAM           lCustData;
-   LPPRINTHOOKPROC  lpfnPrintHook;
-   LPSETUPHOOKPROC  lpfnSetupHook;
-   LPCWSTR          lpPrintTemplateName;
-   LPCWSTR          lpSetupTemplateName;
-   HGLOBAL          hPrintTemplate;
-   HGLOBAL          hSetupTemplate;
-} PRINTDLGW, *LPPRINTDLGW;
-
-typedef PRINTDLGW PRINTDLG;
-typedef LPPRINTDLGW LPPRINTDLG;
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall PrintDlgA(LPPRINTDLGA);
-__declspec(dllimport) BOOL __stdcall PrintDlgW(LPPRINTDLGW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct __declspec(novtable) IPrintDialogCallback : public IUnknown
-{
-    
-    virtual HRESULT __stdcall QueryInterface ( const IID & riid, LPVOID *ppvObj) = 0;
-    virtual ULONG __stdcall AddRef (void) = 0;
-    virtual ULONG __stdcall Release (void) = 0;
-
-    
-    virtual HRESULT __stdcall InitDone (void) = 0;
-    virtual HRESULT __stdcall SelectionChange (void) = 0;
-    virtual HRESULT __stdcall HandleMessage ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult) = 0;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct __declspec(novtable) IPrintDialogServices : public IUnknown
-{
-    
-    virtual HRESULT __stdcall QueryInterface ( const IID & riid, LPVOID *ppvObj) = 0;
-    virtual ULONG __stdcall AddRef (void) = 0;
-    virtual ULONG __stdcall Release (void) = 0;
-
-    
-    virtual HRESULT __stdcall GetCurrentDevMode ( LPDEVMODE pDevMode, UINT *pcbSize) = 0;
-    virtual HRESULT __stdcall GetCurrentPrinterName ( LPTSTR pPrinterName, UINT *pcchSize) = 0;
-    virtual HRESULT __stdcall GetCurrentPortName ( LPTSTR pPortName, UINT *pcchSize) = 0;
-};
-
-
-
-
-
-typedef struct tagPRINTPAGERANGE {
-   DWORD  nFromPage;
-   DWORD  nToPage;
-} PRINTPAGERANGE, *LPPRINTPAGERANGE;
-
-
-
-
-
-typedef struct tagPDEXA {
-   DWORD                 lStructSize;          
-   HWND                  hwndOwner;            
-   HGLOBAL               hDevMode;             
-   HGLOBAL               hDevNames;            
-   HDC                   hDC;                  
-   DWORD                 Flags;                
-   DWORD                 Flags2;               
-   DWORD                 ExclusionFlags;       
-   DWORD                 nPageRanges;          
-   DWORD                 nMaxPageRanges;       
-   LPPRINTPAGERANGE      lpPageRanges;         
-   DWORD                 nMinPage;             
-   DWORD                 nMaxPage;             
-   DWORD                 nCopies;              
-   HINSTANCE             hInstance;            
-   LPCSTR                lpPrintTemplateName;  
-   LPUNKNOWN             lpCallback;           
-   DWORD                 nPropertyPages;       
-   HPROPSHEETPAGE       *lphPropertyPages;     
-   DWORD                 nStartPage;           
-   DWORD                 dwResultAction;       
-} PRINTDLGEXA, *LPPRINTDLGEXA;
-
-
-
-typedef struct tagPDEXW {
-   DWORD                 lStructSize;          
-   HWND                  hwndOwner;            
-   HGLOBAL               hDevMode;             
-   HGLOBAL               hDevNames;            
-   HDC                   hDC;                  
-   DWORD                 Flags;                
-   DWORD                 Flags2;               
-   DWORD                 ExclusionFlags;       
-   DWORD                 nPageRanges;          
-   DWORD                 nMaxPageRanges;       
-   LPPRINTPAGERANGE      lpPageRanges;         
-   DWORD                 nMinPage;             
-   DWORD                 nMaxPage;             
-   DWORD                 nCopies;              
-   HINSTANCE             hInstance;            
-   LPCWSTR               lpPrintTemplateName;  
-   LPUNKNOWN             lpCallback;           
-   DWORD                 nPropertyPages;       
-   HPROPSHEETPAGE       *lphPropertyPages;     
-   DWORD                 nStartPage;           
-   DWORD                 dwResultAction;       
-} PRINTDLGEXW, *LPPRINTDLGEXW;
-
-typedef PRINTDLGEXW PRINTDLGEX;
-typedef LPPRINTDLGEXW LPPRINTDLGEX;
-
-
-
-
-
-
-
-__declspec(dllimport) HRESULT __stdcall PrintDlgExA(LPPRINTDLGEXA);
-__declspec(dllimport) HRESULT __stdcall PrintDlgExW(LPPRINTDLGEXW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDEVNAMES {
-   WORD wDriverOffset;
-   WORD wDeviceOffset;
-   WORD wOutputOffset;
-   WORD wDefault;
-} DEVNAMES, *LPDEVNAMES;
-
-
-
-
-__declspec(dllimport) DWORD __stdcall CommDlgExtendedError(void);
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall* LPPAGEPAINTHOOK)( HWND, UINT, WPARAM, LPARAM );
-typedef UINT_PTR (__stdcall* LPPAGESETUPHOOK)( HWND, UINT, WPARAM, LPARAM );
-
-typedef struct tagPSDA
-{
-    DWORD           lStructSize;
-    HWND            hwndOwner;
-    HGLOBAL         hDevMode;
-    HGLOBAL         hDevNames;
-    DWORD           Flags;
-    POINT           ptPaperSize;
-    RECT            rtMinMargin;
-    RECT            rtMargin;
-    HINSTANCE       hInstance;
-    LPARAM          lCustData;
-    LPPAGESETUPHOOK lpfnPageSetupHook;
-    LPPAGEPAINTHOOK lpfnPagePaintHook;
-    LPCSTR          lpPageSetupTemplateName;
-    HGLOBAL         hPageSetupTemplate;
-} PAGESETUPDLGA, * LPPAGESETUPDLGA;
-typedef struct tagPSDW
-{
-    DWORD           lStructSize;
-    HWND            hwndOwner;
-    HGLOBAL         hDevMode;
-    HGLOBAL         hDevNames;
-    DWORD           Flags;
-    POINT           ptPaperSize;
-    RECT            rtMinMargin;
-    RECT            rtMargin;
-    HINSTANCE       hInstance;
-    LPARAM          lCustData;
-    LPPAGESETUPHOOK lpfnPageSetupHook;
-    LPPAGEPAINTHOOK lpfnPagePaintHook;
-    LPCWSTR         lpPageSetupTemplateName;
-    HGLOBAL         hPageSetupTemplate;
-} PAGESETUPDLGW, * LPPAGESETUPDLGW;
-
-typedef PAGESETUPDLGW PAGESETUPDLG;
-typedef LPPAGESETUPDLGW LPPAGESETUPDLG;
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall PageSetupDlgA( LPPAGESETUPDLGA );
-__declspec(dllimport) BOOL __stdcall PageSetupDlgW( LPPAGESETUPDLGW );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline
-PUWSTR
-static
-__declspec(deprecated)
-ua_wcscpy(
-     PUWSTR  Destination,
-     PCUWSTR Source
-    )
-{
-#pragma warning(push)
-#pragma warning(disable:4996)
-    return wcscpy(Destination, Source);
-#pragma warning(pop)
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-    
-
-                                         
-
-
-
-                                                      
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SERVICE_DESCRIPTIONA {
-    LPSTR       lpDescription;
-} SERVICE_DESCRIPTIONA, *LPSERVICE_DESCRIPTIONA;
-
-
-
-typedef struct _SERVICE_DESCRIPTIONW {
-    LPWSTR      lpDescription;
-} SERVICE_DESCRIPTIONW, *LPSERVICE_DESCRIPTIONW;
-
-typedef SERVICE_DESCRIPTIONW SERVICE_DESCRIPTION;
-typedef LPSERVICE_DESCRIPTIONW LPSERVICE_DESCRIPTION;
-
-
-
-
-
-
-
-
-typedef enum _SC_ACTION_TYPE {
-        SC_ACTION_NONE          = 0,
-        SC_ACTION_RESTART       = 1,
-        SC_ACTION_REBOOT        = 2,
-        SC_ACTION_RUN_COMMAND   = 3
-} SC_ACTION_TYPE;
-
-typedef struct _SC_ACTION {
-    SC_ACTION_TYPE  Type;
-    DWORD           Delay;
-} SC_ACTION, *LPSC_ACTION;
-
-typedef struct _SERVICE_FAILURE_ACTIONSA {
-    DWORD       dwResetPeriod;
-    LPSTR       lpRebootMsg;
-    LPSTR       lpCommand;
-    DWORD       cActions;
-
-
-
-    SC_ACTION * lpsaActions;
-} SERVICE_FAILURE_ACTIONSA, *LPSERVICE_FAILURE_ACTIONSA;
-typedef struct _SERVICE_FAILURE_ACTIONSW {
-    DWORD       dwResetPeriod;
-    LPWSTR      lpRebootMsg;
-    LPWSTR      lpCommand;
-    DWORD       cActions;
-
-
-
-    SC_ACTION * lpsaActions;
-} SERVICE_FAILURE_ACTIONSW, *LPSERVICE_FAILURE_ACTIONSW;
-
-typedef SERVICE_FAILURE_ACTIONSW SERVICE_FAILURE_ACTIONS;
-typedef LPSERVICE_FAILURE_ACTIONSW LPSERVICE_FAILURE_ACTIONS;
-
-
-
-
-
-
-
-
-
-
-struct SC_HANDLE__ { int unused; }; typedef struct SC_HANDLE__ *SC_HANDLE;
-typedef SC_HANDLE   *LPSC_HANDLE;
-
-struct SERVICE_STATUS_HANDLE__ { int unused; }; typedef struct SERVICE_STATUS_HANDLE__ *SERVICE_STATUS_HANDLE;
-
-
-
-
-
-typedef enum _SC_STATUS_TYPE {
-        SC_STATUS_PROCESS_INFO      = 0
-} SC_STATUS_TYPE;
-
-
-
-
-typedef enum _SC_ENUM_TYPE {
-        SC_ENUM_PROCESS_INFO        = 0
-} SC_ENUM_TYPE;
-
-
-
-
-
-
-typedef struct _SERVICE_STATUS {
-    DWORD   dwServiceType;
-    DWORD   dwCurrentState;
-    DWORD   dwControlsAccepted;
-    DWORD   dwWin32ExitCode;
-    DWORD   dwServiceSpecificExitCode;
-    DWORD   dwCheckPoint;
-    DWORD   dwWaitHint;
-} SERVICE_STATUS, *LPSERVICE_STATUS;
-
-typedef struct _SERVICE_STATUS_PROCESS {
-    DWORD   dwServiceType;
-    DWORD   dwCurrentState;
-    DWORD   dwControlsAccepted;
-    DWORD   dwWin32ExitCode;
-    DWORD   dwServiceSpecificExitCode;
-    DWORD   dwCheckPoint;
-    DWORD   dwWaitHint;
-    DWORD   dwProcessId;
-    DWORD   dwServiceFlags;
-} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;
-
-
-
-
-
-
-typedef struct _ENUM_SERVICE_STATUSA {
-    LPSTR             lpServiceName;
-    LPSTR             lpDisplayName;
-    SERVICE_STATUS    ServiceStatus;
-} ENUM_SERVICE_STATUSA, *LPENUM_SERVICE_STATUSA;
-typedef struct _ENUM_SERVICE_STATUSW {
-    LPWSTR            lpServiceName;
-    LPWSTR            lpDisplayName;
-    SERVICE_STATUS    ServiceStatus;
-} ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW;
-
-typedef ENUM_SERVICE_STATUSW ENUM_SERVICE_STATUS;
-typedef LPENUM_SERVICE_STATUSW LPENUM_SERVICE_STATUS;
-
-
-
-
-
-typedef struct _ENUM_SERVICE_STATUS_PROCESSA {
-    LPSTR                     lpServiceName;
-    LPSTR                     lpDisplayName;
-    SERVICE_STATUS_PROCESS    ServiceStatusProcess;
-} ENUM_SERVICE_STATUS_PROCESSA, *LPENUM_SERVICE_STATUS_PROCESSA;
-typedef struct _ENUM_SERVICE_STATUS_PROCESSW {
-    LPWSTR                    lpServiceName;
-    LPWSTR                    lpDisplayName;
-    SERVICE_STATUS_PROCESS    ServiceStatusProcess;
-} ENUM_SERVICE_STATUS_PROCESSW, *LPENUM_SERVICE_STATUS_PROCESSW;
-
-typedef ENUM_SERVICE_STATUS_PROCESSW ENUM_SERVICE_STATUS_PROCESS;
-typedef LPENUM_SERVICE_STATUS_PROCESSW LPENUM_SERVICE_STATUS_PROCESS;
-
-
-
-
-
-
-
-
-
-typedef LPVOID  SC_LOCK;
-
-typedef struct _QUERY_SERVICE_LOCK_STATUSA {
-    DWORD   fIsLocked;
-    LPSTR   lpLockOwner;
-    DWORD   dwLockDuration;
-} QUERY_SERVICE_LOCK_STATUSA, *LPQUERY_SERVICE_LOCK_STATUSA;
-typedef struct _QUERY_SERVICE_LOCK_STATUSW {
-    DWORD   fIsLocked;
-    LPWSTR  lpLockOwner;
-    DWORD   dwLockDuration;
-} QUERY_SERVICE_LOCK_STATUSW, *LPQUERY_SERVICE_LOCK_STATUSW;
-
-typedef QUERY_SERVICE_LOCK_STATUSW QUERY_SERVICE_LOCK_STATUS;
-typedef LPQUERY_SERVICE_LOCK_STATUSW LPQUERY_SERVICE_LOCK_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _QUERY_SERVICE_CONFIGA {
-    DWORD   dwServiceType;
-    DWORD   dwStartType;
-    DWORD   dwErrorControl;
-    LPSTR   lpBinaryPathName;
-    LPSTR   lpLoadOrderGroup;
-    DWORD   dwTagId;
-    LPSTR   lpDependencies;
-    LPSTR   lpServiceStartName;
-    LPSTR   lpDisplayName;
-} QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA;
-typedef struct _QUERY_SERVICE_CONFIGW {
-    DWORD   dwServiceType;
-    DWORD   dwStartType;
-    DWORD   dwErrorControl;
-    LPWSTR  lpBinaryPathName;
-    LPWSTR  lpLoadOrderGroup;
-    DWORD   dwTagId;
-    LPWSTR  lpDependencies;
-    LPWSTR  lpServiceStartName;
-    LPWSTR  lpDisplayName;
-} QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW;
-
-typedef QUERY_SERVICE_CONFIGW QUERY_SERVICE_CONFIG;
-typedef LPQUERY_SERVICE_CONFIGW LPQUERY_SERVICE_CONFIG;
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *LPSERVICE_MAIN_FUNCTIONW)(
-    DWORD   dwNumServicesArgs,
-    LPWSTR  *lpServiceArgVectors
-    );
-
-typedef void (__stdcall *LPSERVICE_MAIN_FUNCTIONA)(
-    DWORD   dwNumServicesArgs,
-    LPSTR   *lpServiceArgVectors
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SERVICE_TABLE_ENTRYA {
-    LPSTR                       lpServiceName;
-    LPSERVICE_MAIN_FUNCTIONA    lpServiceProc;
-}SERVICE_TABLE_ENTRYA, *LPSERVICE_TABLE_ENTRYA;
-typedef struct _SERVICE_TABLE_ENTRYW {
-    LPWSTR                      lpServiceName;
-    LPSERVICE_MAIN_FUNCTIONW    lpServiceProc;
-}SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;
-
-typedef SERVICE_TABLE_ENTRYW SERVICE_TABLE_ENTRY;
-typedef LPSERVICE_TABLE_ENTRYW LPSERVICE_TABLE_ENTRY;
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *LPHANDLER_FUNCTION)(
-    DWORD    dwControl
-    );
-
-typedef DWORD (__stdcall *LPHANDLER_FUNCTION_EX)(
-    DWORD    dwControl,
-    DWORD    dwEventType,
-    LPVOID   lpEventData,
-    LPVOID   lpContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeServiceConfigA(
-                SC_HANDLE    hService,
-                DWORD        dwServiceType,
-                DWORD        dwStartType,
-                DWORD        dwErrorControl,
-              LPCSTR     lpBinaryPathName,
-              LPCSTR     lpLoadOrderGroup,
-             LPDWORD      lpdwTagId,
-              LPCSTR     lpDependencies,
-              LPCSTR     lpServiceStartName,
-              LPCSTR     lpPassword,
-              LPCSTR     lpDisplayName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeServiceConfigW(
-                SC_HANDLE    hService,
-                DWORD        dwServiceType,
-                DWORD        dwStartType,
-                DWORD        dwErrorControl,
-              LPCWSTR     lpBinaryPathName,
-              LPCWSTR     lpLoadOrderGroup,
-             LPDWORD      lpdwTagId,
-              LPCWSTR     lpDependencies,
-              LPCWSTR     lpServiceStartName,
-              LPCWSTR     lpPassword,
-              LPCWSTR     lpDisplayName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeServiceConfig2A(
-                SC_HANDLE    hService,
-                DWORD        dwInfoLevel,
-              LPVOID       lpInfo
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeServiceConfig2W(
-                SC_HANDLE    hService,
-                DWORD        dwInfoLevel,
-              LPVOID       lpInfo
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseServiceHandle(
-                SC_HANDLE   hSCObject
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ControlService(
-                SC_HANDLE           hService,
-                DWORD               dwControl,
-               LPSERVICE_STATUS    lpServiceStatus
-    );
-
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-CreateServiceA(
-                SC_HANDLE    hSCManager,
-                LPCSTR     lpServiceName,
-              LPCSTR     lpDisplayName,
-                DWORD        dwDesiredAccess,
-                DWORD        dwServiceType,
-                DWORD        dwStartType,
-                DWORD        dwErrorControl,
-              LPCSTR     lpBinaryPathName,
-              LPCSTR     lpLoadOrderGroup,
-             LPDWORD      lpdwTagId,
-              LPCSTR     lpDependencies,
-              LPCSTR     lpServiceStartName,
-              LPCSTR     lpPassword
-    );
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-CreateServiceW(
-                SC_HANDLE    hSCManager,
-                LPCWSTR     lpServiceName,
-              LPCWSTR     lpDisplayName,
-                DWORD        dwDesiredAccess,
-                DWORD        dwServiceType,
-                DWORD        dwStartType,
-                DWORD        dwErrorControl,
-              LPCWSTR     lpBinaryPathName,
-              LPCWSTR     lpLoadOrderGroup,
-             LPDWORD      lpdwTagId,
-              LPCWSTR     lpDependencies,
-              LPCWSTR     lpServiceStartName,
-              LPCWSTR     lpPassword
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteService(
-                SC_HANDLE   hService
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDependentServicesA(
-                    SC_HANDLE               hService,
-                    DWORD                   dwServiceState,
-               
-                    LPENUM_SERVICE_STATUSA  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDependentServicesW(
-                    SC_HANDLE               hService,
-                    DWORD                   dwServiceState,
-               
-                    LPENUM_SERVICE_STATUSW  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumServicesStatusA(
-                    SC_HANDLE               hSCManager,
-                    DWORD                   dwServiceType,
-                    DWORD                   dwServiceState,
-          
-                    LPENUM_SERVICE_STATUSA  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned,
-               LPDWORD                 lpResumeHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumServicesStatusW(
-                    SC_HANDLE               hSCManager,
-                    DWORD                   dwServiceType,
-                    DWORD                   dwServiceState,
-          
-                    LPENUM_SERVICE_STATUSW  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned,
-               LPDWORD                 lpResumeHandle
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumServicesStatusExA(
-                    SC_HANDLE               hSCManager,
-                    SC_ENUM_TYPE            InfoLevel,
-                    DWORD                   dwServiceType,
-                    DWORD                   dwServiceState,
-           
-                    LPBYTE                  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned,
-               LPDWORD                 lpResumeHandle,
-                  LPCSTR                pszGroupName
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumServicesStatusExW(
-                    SC_HANDLE               hSCManager,
-                    SC_ENUM_TYPE            InfoLevel,
-                    DWORD                   dwServiceType,
-                    DWORD                   dwServiceState,
-           
-                    LPBYTE                  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned,
-               LPDWORD                 lpResumeHandle,
-                  LPCWSTR                pszGroupName
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetServiceKeyNameA(
-                    SC_HANDLE               hSCManager,
-                    LPCSTR                lpDisplayName,
-          
-                    LPSTR                 lpServiceName,
-                 LPDWORD                 lpcchBuffer
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetServiceKeyNameW(
-                    SC_HANDLE               hSCManager,
-                    LPCWSTR                lpDisplayName,
-          
-                    LPWSTR                 lpServiceName,
-                 LPDWORD                 lpcchBuffer
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetServiceDisplayNameA(
-                    SC_HANDLE               hSCManager,
-                    LPCSTR                lpServiceName,
-           
-                    LPSTR                 lpDisplayName,
-                 LPDWORD                 lpcchBuffer
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetServiceDisplayNameW(
-                    SC_HANDLE               hSCManager,
-                    LPCWSTR                lpServiceName,
-           
-                    LPWSTR                 lpDisplayName,
-                 LPDWORD                 lpcchBuffer
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-SC_LOCK
-__stdcall
-LockServiceDatabase(
-                    SC_HANDLE               hSCManager
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-NotifyBootConfigStatus(
-                    BOOL                    BootAcceptable
-    );
-
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-OpenSCManagerA(
-                  LPCSTR                lpMachineName,
-                  LPCSTR                lpDatabaseName,
-                    DWORD                   dwDesiredAccess
-    );
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-OpenSCManagerW(
-                  LPCWSTR                lpMachineName,
-                  LPCWSTR                lpDatabaseName,
-                    DWORD                   dwDesiredAccess
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-OpenServiceA(
-                    SC_HANDLE               hSCManager,
-                    LPCSTR                lpServiceName,
-                    DWORD                   dwDesiredAccess
-    );
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-OpenServiceW(
-                    SC_HANDLE               hSCManager,
-                    LPCWSTR                lpServiceName,
-                    DWORD                   dwDesiredAccess
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceConfigA(
-                    SC_HANDLE               hService,
-                
-                    LPQUERY_SERVICE_CONFIGA lpServiceConfig,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceConfigW(
-                    SC_HANDLE               hService,
-                
-                    LPQUERY_SERVICE_CONFIGW lpServiceConfig,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceConfig2A(
-                    SC_HANDLE               hService,
-                    DWORD                   dwInfoLevel,
-           
-                    LPBYTE                  lpBuffer,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceConfig2W(
-                    SC_HANDLE               hService,
-                    DWORD                   dwInfoLevel,
-           
-                    LPBYTE                  lpBuffer,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceLockStatusA(
-                    SC_HANDLE                       hSCManager,
-           
-                    LPQUERY_SERVICE_LOCK_STATUSA    lpLockStatus,
-                    DWORD                           cbBufSize,
-                   LPDWORD                         pcbBytesNeeded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceLockStatusW(
-                    SC_HANDLE                       hSCManager,
-           
-                    LPQUERY_SERVICE_LOCK_STATUSW    lpLockStatus,
-                    DWORD                           cbBufSize,
-                   LPDWORD                         pcbBytesNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceObjectSecurity(
-                    SC_HANDLE               hService,
-                    SECURITY_INFORMATION    dwSecurityInformation,
-           
-                    PSECURITY_DESCRIPTOR    lpSecurityDescriptor,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceStatus(
-                    SC_HANDLE           hService,
-                   LPSERVICE_STATUS    lpServiceStatus
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceStatusEx(
-                    SC_HANDLE           hService,
-                    SC_STATUS_TYPE      InfoLevel,
-           
-                    LPBYTE              lpBuffer,
-                    DWORD               cbBufSize,
-                   LPDWORD             pcbBytesNeeded
-    );
-
-
-__declspec(dllimport)
-SERVICE_STATUS_HANDLE
-__stdcall
-RegisterServiceCtrlHandlerA(
-            LPCSTR                    lpServiceName,
-              
-            LPHANDLER_FUNCTION          lpHandlerProc
-    );
-
-__declspec(dllimport)
-SERVICE_STATUS_HANDLE
-__stdcall
-RegisterServiceCtrlHandlerW(
-            LPCWSTR                    lpServiceName,
-              
-            LPHANDLER_FUNCTION          lpHandlerProc
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-SERVICE_STATUS_HANDLE
-__stdcall
-RegisterServiceCtrlHandlerExA(
-            LPCSTR                    lpServiceName,
-            
-            LPHANDLER_FUNCTION_EX       lpHandlerProc,
-           LPVOID                     lpContext
-    );
-
-__declspec(dllimport)
-SERVICE_STATUS_HANDLE
-__stdcall
-RegisterServiceCtrlHandlerExW(
-            LPCWSTR                    lpServiceName,
-            
-            LPHANDLER_FUNCTION_EX       lpHandlerProc,
-           LPVOID                     lpContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetServiceObjectSecurity(
-                SC_HANDLE               hService,
-                SECURITY_INFORMATION    dwSecurityInformation,
-                PSECURITY_DESCRIPTOR    lpSecurityDescriptor
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetServiceStatus(
-                SERVICE_STATUS_HANDLE   hServiceStatus,
-                LPSERVICE_STATUS        lpServiceStatus
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-StartServiceCtrlDispatcherA(
-         const  SERVICE_TABLE_ENTRYA    *lpServiceStartTable
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-StartServiceCtrlDispatcherW(
-         const  SERVICE_TABLE_ENTRYW    *lpServiceStartTable
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-StartServiceA(
-                    SC_HANDLE            hService,
-                    DWORD                dwNumServiceArgs,
-                   
-                    LPCSTR             *lpServiceArgVectors
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-StartServiceW(
-                    SC_HANDLE            hService,
-                    DWORD                dwNumServiceArgs,
-                   
-                    LPCWSTR             *lpServiceArgVectors
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnlockServiceDatabase(
-                    SC_LOCK             ScLock
-    );
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-typedef struct _MODEMDEVCAPS {
-    DWORD   dwActualSize;
-    DWORD   dwRequiredSize;
-    DWORD   dwDevSpecificOffset;
-    DWORD   dwDevSpecificSize;
-
-    
-    DWORD   dwModemProviderVersion;
-    DWORD   dwModemManufacturerOffset;
-    DWORD   dwModemManufacturerSize;
-    DWORD   dwModemModelOffset;
-    DWORD   dwModemModelSize;
-    DWORD   dwModemVersionOffset;
-    DWORD   dwModemVersionSize;
-
-    
-    DWORD   dwDialOptions;          
-    DWORD   dwCallSetupFailTimer;   
-    DWORD   dwInactivityTimeout;    
-    DWORD   dwSpeakerVolume;        
-    DWORD   dwSpeakerMode;          
-    DWORD   dwModemOptions;         
-    DWORD   dwMaxDTERate;           
-    DWORD   dwMaxDCERate;           
-
-    
-    BYTE    abVariablePortion [1];
-} MODEMDEVCAPS, *PMODEMDEVCAPS, *LPMODEMDEVCAPS;
-
-typedef struct _MODEMSETTINGS {
-    DWORD   dwActualSize;
-    DWORD   dwRequiredSize;
-    DWORD   dwDevSpecificOffset;
-    DWORD   dwDevSpecificSize;
-
-    
-    DWORD   dwCallSetupFailTimer;       
-    DWORD   dwInactivityTimeout;        
-    DWORD   dwSpeakerVolume;            
-    DWORD   dwSpeakerMode;              
-    DWORD   dwPreferredModemOptions;    
-
-    
-    DWORD   dwNegotiatedModemOptions;   
-    DWORD   dwNegotiatedDCERate;        
-
-    
-    BYTE    abVariablePortion [1];
-} MODEMSETTINGS, *PMODEMSETTINGS, *LPMODEMSETTINGS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-struct HIMC__ { int unused; }; typedef struct HIMC__ *HIMC;
-struct HIMCC__ { int unused; }; typedef struct HIMCC__ *HIMCC;
-
-
-
-
-
-typedef HKL   *LPHKL;
-typedef UINT  *LPUINT;
-
-typedef struct tagCOMPOSITIONFORM {
-    DWORD dwStyle;
-    POINT ptCurrentPos;
-    RECT  rcArea;
-} COMPOSITIONFORM, *PCOMPOSITIONFORM,  *NPCOMPOSITIONFORM,  *LPCOMPOSITIONFORM;
-
-
-typedef struct tagCANDIDATEFORM {
-    DWORD dwIndex;
-    DWORD dwStyle;
-    POINT ptCurrentPos;
-    RECT  rcArea;
-} CANDIDATEFORM, *PCANDIDATEFORM,  *NPCANDIDATEFORM,  *LPCANDIDATEFORM;
-
-
-typedef struct tagCANDIDATELIST {
-    DWORD dwSize;
-    DWORD dwStyle;
-    DWORD dwCount;
-    DWORD dwSelection;
-    DWORD dwPageStart;
-    DWORD dwPageSize;
-    DWORD dwOffset[1];
-} CANDIDATELIST, *PCANDIDATELIST,  *NPCANDIDATELIST,  *LPCANDIDATELIST;
-
-typedef struct tagREGISTERWORDA {
-    LPSTR   lpReading;
-    LPSTR   lpWord;
-} REGISTERWORDA, *PREGISTERWORDA,  *NPREGISTERWORDA,  *LPREGISTERWORDA;
-typedef struct tagREGISTERWORDW {
-    LPWSTR  lpReading;
-    LPWSTR  lpWord;
-} REGISTERWORDW, *PREGISTERWORDW,  *NPREGISTERWORDW,  *LPREGISTERWORDW;
-
-typedef REGISTERWORDW REGISTERWORD;
-typedef PREGISTERWORDW PREGISTERWORD;
-typedef NPREGISTERWORDW NPREGISTERWORD;
-typedef LPREGISTERWORDW LPREGISTERWORD;
-
-
-
-
-
-
-
-
-
-typedef struct tagRECONVERTSTRING {
-    DWORD dwSize;
-    DWORD dwVersion;
-    DWORD dwStrLen;
-    DWORD dwStrOffset;
-    DWORD dwCompStrLen;
-    DWORD dwCompStrOffset;
-    DWORD dwTargetStrLen;
-    DWORD dwTargetStrOffset;
-} RECONVERTSTRING, *PRECONVERTSTRING,  *NPRECONVERTSTRING,  *LPRECONVERTSTRING;
-
-
-
-
-
-typedef struct tagSTYLEBUFA {
-    DWORD       dwStyle;
-    CHAR        szDescription[32];
-} STYLEBUFA, *PSTYLEBUFA,  *NPSTYLEBUFA,  *LPSTYLEBUFA;
-typedef struct tagSTYLEBUFW {
-    DWORD       dwStyle;
-    WCHAR       szDescription[32];
-} STYLEBUFW, *PSTYLEBUFW,  *NPSTYLEBUFW,  *LPSTYLEBUFW;
-
-typedef STYLEBUFW STYLEBUF;
-typedef PSTYLEBUFW PSTYLEBUF;
-typedef NPSTYLEBUFW NPSTYLEBUF;
-typedef LPSTYLEBUFW LPSTYLEBUF;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagIMEMENUITEMINFOA {
-    UINT        cbSize;
-    UINT        fType;
-    UINT        fState;
-    UINT        wID;
-    HBITMAP     hbmpChecked;
-    HBITMAP     hbmpUnchecked;
-    DWORD       dwItemData;
-    CHAR        szString[80];
-    HBITMAP     hbmpItem;
-} IMEMENUITEMINFOA, *PIMEMENUITEMINFOA,  *NPIMEMENUITEMINFOA,  *LPIMEMENUITEMINFOA;
-typedef struct tagIMEMENUITEMINFOW {
-    UINT        cbSize;
-    UINT        fType;
-    UINT        fState;
-    UINT        wID;
-    HBITMAP     hbmpChecked;
-    HBITMAP     hbmpUnchecked;
-    DWORD       dwItemData;
-    WCHAR       szString[80];
-    HBITMAP     hbmpItem;
-} IMEMENUITEMINFOW, *PIMEMENUITEMINFOW,  *NPIMEMENUITEMINFOW,  *LPIMEMENUITEMINFOW;
-
-typedef IMEMENUITEMINFOW IMEMENUITEMINFO;
-typedef PIMEMENUITEMINFOW PIMEMENUITEMINFO;
-typedef NPIMEMENUITEMINFOW NPIMEMENUITEMINFO;
-typedef LPIMEMENUITEMINFOW LPIMEMENUITEMINFO;
-
-
-
-
-
-
-
-typedef struct tagIMECHARPOSITION {
-    DWORD       dwSize;
-    DWORD       dwCharPos;
-    POINT       pt;
-    UINT        cLineHeight;
-    RECT        rcDocument;
-} IMECHARPOSITION, *PIMECHARPOSITION,  *NPIMECHARPOSITION,  *LPIMECHARPOSITION;
-
-typedef BOOL    (__stdcall* IMCENUMPROC)(HIMC, LPARAM);
-
-
-
-
-
-
-
-HKL  __stdcall ImmInstallIMEA( LPCSTR lpszIMEFileName,  LPCSTR lpszLayoutText);
-HKL  __stdcall ImmInstallIMEW( LPCWSTR lpszIMEFileName,  LPCWSTR lpszLayoutText);
-
-
-
-
-
-
-HWND __stdcall ImmGetDefaultIMEWnd( HWND);
-
-UINT __stdcall ImmGetDescriptionA( HKL,  LPSTR,  UINT uBufLen);
-UINT __stdcall ImmGetDescriptionW( HKL,  LPWSTR,  UINT uBufLen);
-
-
-
-
-
-
-UINT __stdcall ImmGetIMEFileNameA( HKL,  LPSTR,  UINT uBufLen);
-UINT __stdcall ImmGetIMEFileNameW( HKL,  LPWSTR,  UINT uBufLen);
-
-
-
-
-
-
-DWORD __stdcall ImmGetProperty( HKL,  DWORD);
-
-BOOL __stdcall ImmIsIME( HKL);
-
-BOOL __stdcall ImmSimulateHotKey( HWND,  DWORD);
-
-HIMC __stdcall ImmCreateContext(void);
-BOOL __stdcall ImmDestroyContext( HIMC);
-HIMC __stdcall ImmGetContext( HWND);
-BOOL __stdcall ImmReleaseContext( HWND,  HIMC);
-HIMC __stdcall ImmAssociateContext( HWND,  HIMC);
-
-BOOL __stdcall ImmAssociateContextEx( HWND,  HIMC,  DWORD);
-
-
-LONG  __stdcall ImmGetCompositionStringA( HIMC,  DWORD,  LPVOID,  DWORD);
-LONG  __stdcall ImmGetCompositionStringW( HIMC,  DWORD,  LPVOID,  DWORD);
-
-
-
-
-
-
-BOOL  __stdcall ImmSetCompositionStringA( HIMC,  DWORD dwIndex,  LPVOID lpComp,  DWORD,  LPVOID lpRead,  DWORD);
-BOOL  __stdcall ImmSetCompositionStringW( HIMC,  DWORD dwIndex,  LPVOID lpComp,  DWORD,  LPVOID lpRead,  DWORD);
-
-
-
-
-
-
-DWORD __stdcall ImmGetCandidateListCountA( HIMC,  LPDWORD lpdwListCount);
-DWORD __stdcall ImmGetCandidateListCountW( HIMC,  LPDWORD lpdwListCount);
-
-
-
-
-
-
-DWORD __stdcall ImmGetCandidateListA( HIMC,  DWORD deIndex,  LPCANDIDATELIST,  DWORD dwBufLen);
-DWORD __stdcall ImmGetCandidateListW( HIMC,  DWORD deIndex,  LPCANDIDATELIST,  DWORD dwBufLen);
-
-
-
-
-
-
-DWORD __stdcall ImmGetGuideLineA( HIMC,  DWORD dwIndex,  LPSTR,  DWORD dwBufLen);
-DWORD __stdcall ImmGetGuideLineW( HIMC,  DWORD dwIndex,  LPWSTR,  DWORD dwBufLen);
-
-
-
-
-
-
-BOOL __stdcall ImmGetConversionStatus( HIMC,  LPDWORD,  LPDWORD);
-BOOL __stdcall ImmSetConversionStatus( HIMC,  DWORD,  DWORD);
-BOOL __stdcall ImmGetOpenStatus( HIMC);
-BOOL __stdcall ImmSetOpenStatus( HIMC,  BOOL);
-
-
-BOOL __stdcall ImmGetCompositionFontA( HIMC,  LPLOGFONTA);
-BOOL __stdcall ImmGetCompositionFontW( HIMC,  LPLOGFONTW);
-
-
-
-
-
-
-BOOL __stdcall ImmSetCompositionFontA( HIMC,  LPLOGFONTA);
-BOOL __stdcall ImmSetCompositionFontW( HIMC,  LPLOGFONTW);
-
-
-
-
-
-
-
-BOOL    __stdcall ImmConfigureIMEA( HKL,  HWND,  DWORD,  LPVOID);
-BOOL    __stdcall ImmConfigureIMEW( HKL,  HWND,  DWORD,  LPVOID);
-
-
-
-
-
-
-LRESULT __stdcall ImmEscapeA( HKL,  HIMC,  UINT,  LPVOID);
-LRESULT __stdcall ImmEscapeW( HKL,  HIMC,  UINT,  LPVOID);
-
-
-
-
-
-
-DWORD   __stdcall ImmGetConversionListA( HKL,  HIMC,  LPCSTR,  LPCANDIDATELIST,  DWORD dwBufLen,  UINT uFlag);
-DWORD   __stdcall ImmGetConversionListW( HKL,  HIMC,  LPCWSTR,  LPCANDIDATELIST,  DWORD dwBufLen,  UINT uFlag);
-
-
-
-
-
-
-BOOL    __stdcall ImmNotifyIME( HIMC,  DWORD dwAction,  DWORD dwIndex,  DWORD dwValue);
-
-BOOL __stdcall ImmGetStatusWindowPos( HIMC,  LPPOINT);
-BOOL __stdcall ImmSetStatusWindowPos( HIMC,  LPPOINT);
-BOOL __stdcall ImmGetCompositionWindow( HIMC,  LPCOMPOSITIONFORM);
-BOOL __stdcall ImmSetCompositionWindow( HIMC,  LPCOMPOSITIONFORM);
-BOOL __stdcall ImmGetCandidateWindow( HIMC,  DWORD,  LPCANDIDATEFORM);
-BOOL __stdcall ImmSetCandidateWindow( HIMC,  LPCANDIDATEFORM);
-
-BOOL __stdcall ImmIsUIMessageA( HWND,  UINT,  WPARAM,  LPARAM);
-BOOL __stdcall ImmIsUIMessageW( HWND,  UINT,  WPARAM,  LPARAM);
-
-
-
-
-
-
-
-UINT __stdcall ImmGetVirtualKey( HWND);
-
-typedef int (__stdcall *REGISTERWORDENUMPROCA)(LPCSTR, DWORD, LPCSTR, LPVOID);
-typedef int (__stdcall *REGISTERWORDENUMPROCW)(LPCWSTR, DWORD, LPCWSTR, LPVOID);
-
-
-
-
-
-
-BOOL __stdcall ImmRegisterWordA( HKL,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszRegister);
-BOOL __stdcall ImmRegisterWordW( HKL,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszRegister);
-
-
-
-
-
-
-BOOL __stdcall ImmUnregisterWordA( HKL,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszUnregister);
-BOOL __stdcall ImmUnregisterWordW( HKL,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszUnregister);
-
-
-
-
-
-
-UINT __stdcall ImmGetRegisterWordStyleA( HKL,  UINT nItem,  LPSTYLEBUFA);
-UINT __stdcall ImmGetRegisterWordStyleW( HKL,  UINT nItem,  LPSTYLEBUFW);
-
-
-
-
-
-
-UINT __stdcall ImmEnumRegisterWordA( HKL,  REGISTERWORDENUMPROCA,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszRegister,  LPVOID);
-UINT __stdcall ImmEnumRegisterWordW( HKL,  REGISTERWORDENUMPROCW,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszRegister,  LPVOID);
-
-
-
-
-
-
-
-BOOL __stdcall ImmDisableIME( DWORD);
-BOOL __stdcall ImmEnumInputContext(DWORD idThread, IMCENUMPROC lpfn, LPARAM lParam);
-DWORD __stdcall ImmGetImeMenuItemsA( HIMC,  DWORD,  DWORD,  LPIMEMENUITEMINFOA,  LPIMEMENUITEMINFOA,  DWORD);
-DWORD __stdcall ImmGetImeMenuItemsW( HIMC,  DWORD,  DWORD,  LPIMEMENUITEMINFOW,  LPIMEMENUITEMINFOW,  DWORD);
-
-
-
-
-
-
-BOOL __stdcall ImmDisableTextFrameService(DWORD idThread);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-typedef unsigned char   u_char;
-typedef unsigned short  u_short;
-typedef unsigned int    u_int;
-typedef unsigned long   u_long;
-typedef unsigned __int64 u_int64;
-
-
-
-
-
-
-typedef UINT_PTR        SOCKET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct fd_set {
-        u_int fd_count;               
-        SOCKET  fd_array[64];   
-} fd_set;
-
-extern int __stdcall  __WSAFDIsSet(SOCKET, fd_set  *);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct timeval {
-        long    tv_sec;         
-        long    tv_usec;        
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct  hostent {
-        char     * h_name;           
-        char     *  * h_aliases;  
-        short   h_addrtype;             
-        short   h_length;               
-        char     *  * h_addr_list; 
-
-};
-
-
-
-
-
-struct  netent {
-        char     * n_name;           
-        char     *  * n_aliases;  
-        short   n_addrtype;             
-        u_long  n_net;                  
-};
-
-struct  servent {
-        char     * s_name;           
-        char     *  * s_aliases;  
-
-
-
-
-        short   s_port;                 
-        char     * s_proto;          
-
-};
-
-struct  protoent {
-        char     * p_name;           
-        char     *  * p_aliases;  
-        short   p_proto;                
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct in_addr {
-        union {
-                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
-                struct { u_short s_w1,s_w2; } S_un_w;
-                u_long S_addr;
-        } S_un;
-
-                                
-
-                                
-
-                                
-
-                                
-
-                                
-
-                                
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct sockaddr_in {
-        short   sin_family;
-        u_short sin_port;
-        struct  in_addr sin_addr;
-        char    sin_zero[8];
-};
-
-
-
-
-typedef struct WSAData {
-        WORD                    wVersion;
-        WORD                    wHighVersion;
-
-
-
-
-
-
-
-        char                    szDescription[256+1];
-        char                    szSystemStatus[128+1];
-        unsigned short          iMaxSockets;
-        unsigned short          iMaxUdpDg;
-        char  *              lpVendorInfo;
-
-} WSADATA,  * LPWSADATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                       
-                                       
-                                       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct sockaddr {
-        u_short sa_family;              
-        char    sa_data[14];            
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct sockaddr_storage {
-    short ss_family;               
-    char __ss_pad1[((sizeof(__int64)) - sizeof (short))];  
-                                   
-                                   
-                                   
-    __int64 __ss_align;            
-    char __ss_pad2[(128 - (sizeof (short) + ((sizeof(__int64)) - sizeof (short)) + (sizeof(__int64))))];  
-                                   
-                                   
-                                   
-};
-
-
-
-
-
-struct sockproto {
-        u_short sp_family;              
-        u_short sp_protocol;            
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct  linger {
-        u_short l_onoff;                
-        u_short l_linger;               
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OVERLAPPED *    LPWSAOVERLAPPED;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _WSABUF {
-    u_long      len;     
-    char  *  buf;     
-} WSABUF,  * LPWSABUF;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ULONG   SERVICETYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _flowspec
-{
-    ULONG       TokenRate;              
-    ULONG       TokenBucketSize;        
-    ULONG       PeakBandwidth;          
-    ULONG       Latency;                
-    ULONG       DelayVariation;         
-    SERVICETYPE ServiceType;
-    ULONG       MaxSduSize;             
-    ULONG       MinimumPolicedSize;     
-
-} FLOWSPEC, *PFLOWSPEC, * LPFLOWSPEC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  {
-
-    ULONG   ObjectType;
-    ULONG   ObjectLength;  
-
-
-} QOS_OBJECT_HDR, *LPQOS_OBJECT_HDR;
-
-
-
-
-
-
-
-
-
-          
-
-          
-
-          
-
-          
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _QOS_SD_MODE {
-
-    QOS_OBJECT_HDR   ObjectHdr;
-    ULONG            ShapeDiscardMode;
-
-} QOS_SD_MODE, *LPQOS_SD_MODE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _QOS_SHAPING_RATE {
-
-    QOS_OBJECT_HDR   ObjectHdr;
-    ULONG            ShapingRate;
-
-} QOS_SHAPING_RATE, *LPQOS_SHAPING_RATE;
-
-
-
-
-
-typedef struct _QualityOfService
-{
-    FLOWSPEC      SendingFlowspec;       
-    FLOWSPEC      ReceivingFlowspec;     
-    WSABUF        ProviderSpecific;      
-} QOS,  * LPQOS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned int             GROUP;
-
-
-
-
-
-
-
-typedef struct _WSANETWORKEVENTS {
-       long lNetworkEvents;
-       int iErrorCode[10];
-} WSANETWORKEVENTS,  * LPWSANETWORKEVENTS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _WSAPROTOCOLCHAIN {
-    int ChainLen;                                 
-                                                  
-                                                  
-                                                  
-    DWORD ChainEntries[7];       
-} WSAPROTOCOLCHAIN,  * LPWSAPROTOCOLCHAIN;
-
-
-
-typedef struct _WSAPROTOCOL_INFOA {
-    DWORD dwServiceFlags1;
-    DWORD dwServiceFlags2;
-    DWORD dwServiceFlags3;
-    DWORD dwServiceFlags4;
-    DWORD dwProviderFlags;
-    GUID ProviderId;
-    DWORD dwCatalogEntryId;
-    WSAPROTOCOLCHAIN ProtocolChain;
-    int iVersion;
-    int iAddressFamily;
-    int iMaxSockAddr;
-    int iMinSockAddr;
-    int iSocketType;
-    int iProtocol;
-    int iProtocolMaxOffset;
-    int iNetworkByteOrder;
-    int iSecurityScheme;
-    DWORD dwMessageSize;
-    DWORD dwProviderReserved;
-    CHAR   szProtocol[255+1];
-} WSAPROTOCOL_INFOA,  * LPWSAPROTOCOL_INFOA;
-typedef struct _WSAPROTOCOL_INFOW {
-    DWORD dwServiceFlags1;
-    DWORD dwServiceFlags2;
-    DWORD dwServiceFlags3;
-    DWORD dwServiceFlags4;
-    DWORD dwProviderFlags;
-    GUID ProviderId;
-    DWORD dwCatalogEntryId;
-    WSAPROTOCOLCHAIN ProtocolChain;
-    int iVersion;
-    int iAddressFamily;
-    int iMaxSockAddr;
-    int iMinSockAddr;
-    int iSocketType;
-    int iProtocol;
-    int iProtocolMaxOffset;
-    int iNetworkByteOrder;
-    int iSecurityScheme;
-    DWORD dwMessageSize;
-    DWORD dwProviderReserved;
-    WCHAR  szProtocol[255+1];
-} WSAPROTOCOL_INFOW,  * LPWSAPROTOCOL_INFOW;
-
-typedef WSAPROTOCOL_INFOW WSAPROTOCOL_INFO;
-typedef LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-int
-(__stdcall * LPCONDITIONPROC)(
-     LPWSABUF lpCallerId,
-     LPWSABUF lpCallerData,
-      LPQOS lpSQOS,
-      LPQOS lpGQOS,
-     LPWSABUF lpCalleeId,
-     LPWSABUF lpCalleeData,
-     GROUP  * g,
-     DWORD_PTR dwCallbackData
-    );
-
-typedef
-void
-(__stdcall * LPWSAOVERLAPPED_COMPLETION_ROUTINE)(
-     DWORD dwError,
-     DWORD cbTransferred,
-     LPWSAOVERLAPPED lpOverlapped,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-typedef enum _WSACOMPLETIONTYPE {
-    NSP_NOTIFY_IMMEDIATELY = 0,
-    NSP_NOTIFY_HWND,
-    NSP_NOTIFY_EVENT,
-    NSP_NOTIFY_PORT,
-    NSP_NOTIFY_APC,
-} WSACOMPLETIONTYPE, *PWSACOMPLETIONTYPE,  * LPWSACOMPLETIONTYPE;
-
-typedef struct _WSACOMPLETION {
-    WSACOMPLETIONTYPE Type;
-    union {
-        struct {
-            HWND hWnd;
-            UINT uMsg;
-            WPARAM context;
-        } WindowMessage;
-        struct {
-            LPWSAOVERLAPPED lpOverlapped;
-        } Event;
-        struct {
-            LPWSAOVERLAPPED lpOverlapped;
-            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
-        } Apc;
-        struct {
-            LPWSAOVERLAPPED lpOverlapped;
-            HANDLE hPort;
-            ULONG_PTR Key;
-        } Port;
-    } Parameters;
-} WSACOMPLETION, *PWSACOMPLETION,  *LPWSACOMPLETION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct sockaddr SOCKADDR;
-typedef struct sockaddr *PSOCKADDR;
-typedef struct sockaddr  *LPSOCKADDR;
-
-typedef struct sockaddr_storage SOCKADDR_STORAGE;
-typedef struct sockaddr_storage *PSOCKADDR_STORAGE;
-typedef struct sockaddr_storage  *LPSOCKADDR_STORAGE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SOCKET_ADDRESS {
-    LPSOCKADDR lpSockaddr ;
-    INT iSockaddrLength ;
-} SOCKET_ADDRESS, *PSOCKET_ADDRESS,  * LPSOCKET_ADDRESS ;
-
-
-
-
-typedef struct _CSADDR_INFO {
-    SOCKET_ADDRESS LocalAddr ;
-    SOCKET_ADDRESS RemoteAddr ;
-    INT iSocketType ;
-    INT iProtocol ;
-} CSADDR_INFO, *PCSADDR_INFO,  * LPCSADDR_INFO ;
-
-
-
-
-
-typedef struct _SOCKET_ADDRESS_LIST {
-    INT             iAddressCount;
-    SOCKET_ADDRESS  Address[1];
-} SOCKET_ADDRESS_LIST,  * LPSOCKET_ADDRESS_LIST;
-
-
-
-
-typedef struct _AFPROTOCOLS {
-    INT iAddressFamily;
-    INT iProtocol;
-} AFPROTOCOLS, *PAFPROTOCOLS, *LPAFPROTOCOLS;
-
-
-
-
-
-
-
-
-typedef enum _WSAEcomparator
-{
-    COMP_EQUAL = 0,
-    COMP_NOTLESS
-} WSAECOMPARATOR, *PWSAECOMPARATOR, *LPWSAECOMPARATOR;
-
-typedef struct _WSAVersion
-{
-    DWORD           dwVersion;
-    WSAECOMPARATOR  ecHow;
-}WSAVERSION, *PWSAVERSION, *LPWSAVERSION;
-
-typedef struct _WSAQuerySetA
-{
-    DWORD           dwSize;
-    LPSTR           lpszServiceInstanceName;
-    LPGUID          lpServiceClassId;
-    LPWSAVERSION    lpVersion;
-    LPSTR           lpszComment;
-    DWORD           dwNameSpace;
-    LPGUID          lpNSProviderId;
-    LPSTR           lpszContext;
-    DWORD           dwNumberOfProtocols;
-    LPAFPROTOCOLS   lpafpProtocols;
-    LPSTR           lpszQueryString;
-    DWORD           dwNumberOfCsAddrs;
-    LPCSADDR_INFO   lpcsaBuffer;
-    DWORD           dwOutputFlags;
-    LPBLOB          lpBlob;
-} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA;
-typedef struct _WSAQuerySetW
-{
-    DWORD           dwSize;
-    LPWSTR          lpszServiceInstanceName;
-    LPGUID          lpServiceClassId;
-    LPWSAVERSION    lpVersion;
-    LPWSTR          lpszComment;
-    DWORD           dwNameSpace;
-    LPGUID          lpNSProviderId;
-    LPWSTR          lpszContext;
-    DWORD           dwNumberOfProtocols;
-    LPAFPROTOCOLS   lpafpProtocols;
-    LPWSTR          lpszQueryString;
-    DWORD           dwNumberOfCsAddrs;
-    LPCSADDR_INFO   lpcsaBuffer;
-    DWORD           dwOutputFlags;
-    LPBLOB          lpBlob;
-} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW;
-
-typedef WSAQUERYSETW WSAQUERYSET;
-typedef PWSAQUERYSETW PWSAQUERYSET;
-typedef LPWSAQUERYSETW LPWSAQUERYSET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _WSAESETSERVICEOP
-{
-    RNRSERVICE_REGISTER=0,
-    RNRSERVICE_DEREGISTER,
-    RNRSERVICE_DELETE
-} WSAESETSERVICEOP, *PWSAESETSERVICEOP, *LPWSAESETSERVICEOP;
-
-
-
-
-
-typedef struct _WSANSClassInfoA
-{
-    LPSTR   lpszName;
-    DWORD   dwNameSpace;
-    DWORD   dwValueType;
-    DWORD   dwValueSize;
-    LPVOID  lpValue;
-}WSANSCLASSINFOA, *PWSANSCLASSINFOA, *LPWSANSCLASSINFOA;
-typedef struct _WSANSClassInfoW
-{
-    LPWSTR  lpszName;
-    DWORD   dwNameSpace;
-    DWORD   dwValueType;
-    DWORD   dwValueSize;
-    LPVOID  lpValue;
-}WSANSCLASSINFOW, *PWSANSCLASSINFOW, *LPWSANSCLASSINFOW;
-
-typedef WSANSCLASSINFOW WSANSCLASSINFO;
-typedef PWSANSCLASSINFOW PWSANSCLASSINFO;
-typedef LPWSANSCLASSINFOW LPWSANSCLASSINFO;
-
-
-
-
-
-
-typedef struct _WSAServiceClassInfoA
-{
-    LPGUID              lpServiceClassId;
-    LPSTR               lpszServiceClassName;
-    DWORD               dwCount;
-    LPWSANSCLASSINFOA   lpClassInfos;
-}WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA;
-typedef struct _WSAServiceClassInfoW
-{
-    LPGUID              lpServiceClassId;
-    LPWSTR              lpszServiceClassName;
-    DWORD               dwCount;
-    LPWSANSCLASSINFOW   lpClassInfos;
-}WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW;
-
-typedef WSASERVICECLASSINFOW WSASERVICECLASSINFO;
-typedef PWSASERVICECLASSINFOW PWSASERVICECLASSINFO;
-typedef LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO;
-
-
-
-
-
-
-typedef struct _WSANAMESPACE_INFOA {
-    GUID                NSProviderId;
-    DWORD               dwNameSpace;
-    BOOL                fActive;
-    DWORD               dwVersion;
-    LPSTR               lpszIdentifier;
-} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA;
-typedef struct _WSANAMESPACE_INFOW {
-    GUID                NSProviderId;
-    DWORD               dwNameSpace;
-    BOOL                fActive;
-    DWORD               dwVersion;
-    LPWSTR              lpszIdentifier;
-} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW;
-
-typedef WSANAMESPACE_INFOW WSANAMESPACE_INFO;
-typedef PWSANAMESPACE_INFOW PWSANAMESPACE_INFO;
-typedef LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO;
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-accept(
-     SOCKET s,
-     struct sockaddr  * addr,
-      int  * addrlen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-bind(
-     SOCKET s,
-     const struct sockaddr  * name,
-     int namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-closesocket(
-     SOCKET s
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-connect(
-     SOCKET s,
-     const struct sockaddr  * name,
-     int namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-ioctlsocket(
-     SOCKET s,
-     long cmd,
-      u_long  * argp
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-getpeername(
-     SOCKET s,
-     struct sockaddr  * name,
-      int  * namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-getsockname(
-     SOCKET s,
-     struct sockaddr  * name,
-      int  * namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-getsockopt(
-     SOCKET s,
-     int level,
-     int optname,
-     char  * optval,
-      int  * optlen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-u_long
- __stdcall
-htonl(
-     u_long hostlong
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-u_short
- __stdcall
-htons(
-     u_short hostshort
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-unsigned long
- __stdcall
-inet_addr(
-     const char  * cp
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-char  *
- __stdcall
-inet_ntoa(
-     struct in_addr in
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-listen(
-     SOCKET s,
-     int backlog
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-u_long
- __stdcall
-ntohl(
-     u_long netlong
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-u_short
- __stdcall
-ntohs(
-     u_short netshort
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-recv(
-     SOCKET s,
-     char  * buf,
-     int len,
-     int flags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-recvfrom(
-     SOCKET s,
-     char  * buf,
-     int len,
-     int flags,
-     struct sockaddr  * from,
-      int  * fromlen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-select(
-     int nfds,
-      fd_set  * readfds,
-      fd_set  * writefds,
-      fd_set  *exceptfds,
-     const struct timeval  * timeout
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-send(
-     SOCKET s,
-     const char  * buf,
-     int len,
-     int flags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-sendto(
-     SOCKET s,
-     const char  * buf,
-     int len,
-     int flags,
-     const struct sockaddr  * to,
-     int tolen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-setsockopt(
-     SOCKET s,
-     int level,
-     int optname,
-     const char  * optval,
-     int optlen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-shutdown(
-     SOCKET s,
-     int how
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-socket(
-     int af,
-     int type,
-     int protocol
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct hostent  *
- __stdcall
-gethostbyaddr(
-     const char  * addr,
-     int len,
-     int type
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct hostent  *
- __stdcall
-gethostbyname(
-     const char  * name
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-gethostname(
-     char  * name,
-     int namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct servent  *
- __stdcall
-getservbyport(
-     int port,
-     const char  * proto
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct servent  *
- __stdcall
-getservbyname(
-     const char  * name,
-     const char  * proto
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct protoent  *
- __stdcall
-getprotobynumber(
-     int number
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct protoent  *
- __stdcall
-getprotobyname(
-     const char  * name
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAStartup(
-     WORD wVersionRequested,
-     LPWSADATA lpWSAData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSACleanup(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
- __stdcall
-WSASetLastError(
-     int iError
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAGetLastError(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSAIsBlocking(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAUnhookBlockingHook(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-FARPROC
- __stdcall
-WSASetBlockingHook(
-     FARPROC lpBlockFunc
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSACancelBlockingCall(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetServByName(
-     HWND hWnd,
-     u_int wMsg,
-     const char  * name,
-     const char  * proto,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetServByPort(
-     HWND hWnd,
-     u_int wMsg,
-     int port,
-     const char  * proto,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetProtoByName(
-     HWND hWnd,
-     u_int wMsg,
-     const char  * name,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetProtoByNumber(
-     HWND hWnd,
-     u_int wMsg,
-     int number,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetHostByName(
-     HWND hWnd,
-     u_int wMsg,
-     const char  * name,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetHostByAddr(
-     HWND hWnd,
-     u_int wMsg,
-     const char  * addr,
-     int len,
-     int type,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSACancelAsyncRequest(
-     HANDLE hAsyncTaskHandle
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAAsyncSelect(
-     SOCKET s,
-     HWND hWnd,
-     u_int wMsg,
-     long lEvent
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-WSAAccept(
-     SOCKET s,
-     struct sockaddr  * addr,
-      LPINT addrlen,
-     LPCONDITIONPROC lpfnCondition,
-     DWORD_PTR dwCallbackData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSACloseEvent(
-     HANDLE hEvent
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAConnect(
-     SOCKET s,
-     const struct sockaddr  * name,
-     int namelen,
-     LPWSABUF lpCallerData,
-     LPWSABUF lpCalleeData,
-     LPQOS lpSQOS,
-     LPQOS lpGQOS
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSACreateEvent(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSADuplicateSocketA(
-     SOCKET s,
-     DWORD dwProcessId,
-     LPWSAPROTOCOL_INFOA lpProtocolInfo
-    );
-__declspec(dllimport)
-int
- __stdcall
-WSADuplicateSocketW(
-     SOCKET s,
-     DWORD dwProcessId,
-     LPWSAPROTOCOL_INFOW lpProtocolInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAEnumNetworkEvents(
-     SOCKET s,
-     HANDLE hEventObject,
-     LPWSANETWORKEVENTS lpNetworkEvents
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAEnumProtocolsA(
-     LPINT lpiProtocols,
-     LPWSAPROTOCOL_INFOA lpProtocolBuffer,
-      LPDWORD lpdwBufferLength
-    );
-__declspec(dllimport)
-int
- __stdcall
-WSAEnumProtocolsW(
-     LPINT lpiProtocols,
-     LPWSAPROTOCOL_INFOW lpProtocolBuffer,
-      LPDWORD lpdwBufferLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAEventSelect(
-     SOCKET s,
-     HANDLE hEventObject,
-     long lNetworkEvents
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSAGetOverlappedResult(
-     SOCKET s,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPDWORD lpcbTransfer,
-     BOOL fWait,
-     LPDWORD lpdwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSAGetQOSByName(
-     SOCKET s,
-     LPWSABUF lpQOSName,
-     LPQOS lpQOS
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAHtonl(
-     SOCKET s,
-     u_long hostlong,
-     u_long  * lpnetlong
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAHtons(
-     SOCKET s,
-     u_short hostshort,
-     u_short  * lpnetshort
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAIoctl(
-     SOCKET s,
-     DWORD dwIoControlCode,
-     LPVOID lpvInBuffer,
-     DWORD cbInBuffer,
-     LPVOID lpvOutBuffer,
-     DWORD cbOutBuffer,
-     LPDWORD lpcbBytesReturned,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-WSAJoinLeaf(
-     SOCKET s,
-     const struct sockaddr  * name,
-     int namelen,
-     LPWSABUF lpCallerData,
-     LPWSABUF lpCalleeData,
-     LPQOS lpSQOS,
-     LPQOS lpGQOS,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSANtohl(
-     SOCKET s,
-     u_long netlong,
-     u_long  * lphostlong
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSANtohs(
-     SOCKET s,
-     u_short netshort,
-     u_short  * lphostshort
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSARecv(
-     SOCKET s,
-      LPWSABUF lpBuffers,
-     DWORD dwBufferCount,
-     LPDWORD lpNumberOfBytesRecvd,
-      LPDWORD lpFlags,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSARecvDisconnect(
-     SOCKET s,
-     LPWSABUF lpInboundDisconnectData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSARecvFrom(
-     SOCKET s,
-      LPWSABUF lpBuffers,
-     DWORD dwBufferCount,
-     LPDWORD lpNumberOfBytesRecvd,
-      LPDWORD lpFlags,
-     struct sockaddr  * lpFrom,
-      LPINT lpFromlen,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSAResetEvent(
-     HANDLE hEvent
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSASend(
-     SOCKET s,
-     LPWSABUF lpBuffers,
-     DWORD dwBufferCount,
-     LPDWORD lpNumberOfBytesSent,
-     DWORD dwFlags,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSASendDisconnect(
-     SOCKET s,
-     LPWSABUF lpOutboundDisconnectData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSASendTo(
-     SOCKET s,
-     LPWSABUF lpBuffers,
-     DWORD dwBufferCount,
-     LPDWORD lpNumberOfBytesSent,
-     DWORD dwFlags,
-     const struct sockaddr  * lpTo,
-     int iTolen,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSASetEvent(
-     HANDLE hEvent
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-WSASocketA(
-     int af,
-     int type,
-     int protocol,
-     LPWSAPROTOCOL_INFOA lpProtocolInfo,
-     GROUP g,
-     DWORD dwFlags
-    );
-__declspec(dllimport)
-SOCKET
- __stdcall
-WSASocketW(
-     int af,
-     int type,
-     int protocol,
-     LPWSAPROTOCOL_INFOW lpProtocolInfo,
-     GROUP g,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
- __stdcall
-WSAWaitForMultipleEvents(
-     DWORD cEvents,
-     const HANDLE  * lphEvents,
-     BOOL fWaitAll,
-     DWORD dwTimeout,
-     BOOL fAlertable
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAAddressToStringA(
-         LPSOCKADDR          lpsaAddress,
-         DWORD               dwAddressLength,
-         LPWSAPROTOCOL_INFOA lpProtocolInfo,
-      LPSTR             lpszAddressString,
-      LPDWORD             lpdwAddressStringLength
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAAddressToStringW(
-         LPSOCKADDR          lpsaAddress,
-         DWORD               dwAddressLength,
-         LPWSAPROTOCOL_INFOW lpProtocolInfo,
-      LPWSTR             lpszAddressString,
-      LPDWORD             lpdwAddressStringLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAStringToAddressA(
-         LPSTR               AddressString,
-         INT                 AddressFamily,
-         LPWSAPROTOCOL_INFOA lpProtocolInfo,
-        LPSOCKADDR          lpAddress,
-      LPINT               lpAddressLength
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAStringToAddressW(
-         LPWSTR              AddressString,
-         INT                 AddressFamily,
-         LPWSAPROTOCOL_INFOW lpProtocolInfo,
-        LPSOCKADDR          lpAddress,
-      LPINT               lpAddressLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceBeginA(
-      LPWSAQUERYSETA lpqsRestrictions,
-      DWORD          dwControlFlags,
-     LPHANDLE       lphLookup
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceBeginW(
-      LPWSAQUERYSETW lpqsRestrictions,
-      DWORD          dwControlFlags,
-     LPHANDLE       lphLookup
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceNextA(
-         HANDLE           hLookup,
-         DWORD            dwControlFlags,
-      LPDWORD          lpdwBufferLength,
-        LPWSAQUERYSETA   lpqsResults
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceNextW(
-         HANDLE           hLookup,
-         DWORD            dwControlFlags,
-      LPDWORD          lpdwBufferLength,
-        LPWSAQUERYSETW   lpqsResults
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSANSPIoctl(
-      HANDLE           hLookup,
-      DWORD            dwControlCode,
-      LPVOID           lpvInBuffer,
-      DWORD            cbInBuffer,
-     LPVOID           lpvOutBuffer,
-      DWORD            cbOutBuffer,
-     LPDWORD          lpcbBytesReturned,
-      LPWSACOMPLETION  lpCompletion
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceEnd(
-     HANDLE  hLookup
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAInstallServiceClassA(
-      LPWSASERVICECLASSINFOA   lpServiceClassInfo
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAInstallServiceClassW(
-      LPWSASERVICECLASSINFOW   lpServiceClassInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSARemoveServiceClass(
-      LPGUID  lpServiceClassId
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAGetServiceClassInfoA(
-      LPGUID  lpProviderId,
-      LPGUID  lpServiceClassId,
-      LPDWORD  lpdwBufSize,
-     LPWSASERVICECLASSINFOA lpServiceClassInfo
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAGetServiceClassInfoW(
-      LPGUID  lpProviderId,
-      LPGUID  lpServiceClassId,
-      LPDWORD  lpdwBufSize,
-     LPWSASERVICECLASSINFOW lpServiceClassInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAEnumNameSpaceProvidersA(
-      LPDWORD              lpdwBufferLength,
-        LPWSANAMESPACE_INFOA lpnspBuffer
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAEnumNameSpaceProvidersW(
-      LPDWORD              lpdwBufferLength,
-        LPWSANAMESPACE_INFOW lpnspBuffer
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAGetServiceClassNameByClassIdA(
-          LPGUID  lpServiceClassId,
-         LPSTR lpszServiceClassName,
-       LPDWORD lpdwBufferLength
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAGetServiceClassNameByClassIdW(
-          LPGUID  lpServiceClassId,
-         LPWSTR lpszServiceClassName,
-       LPDWORD lpdwBufferLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSASetServiceA(
-     LPWSAQUERYSETA lpqsRegInfo,
-     WSAESETSERVICEOP essoperation,
-     DWORD dwControlFlags
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSASetServiceW(
-     LPWSAQUERYSETW lpqsRegInfo,
-     WSAESETSERVICEOP essoperation,
-     DWORD dwControlFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAProviderConfigChange(
-      LPHANDLE lpNotificationHandle,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct sockaddr_in SOCKADDR_IN;
-typedef struct sockaddr_in *PSOCKADDR_IN;
-typedef struct sockaddr_in  *LPSOCKADDR_IN;
-
-typedef struct linger LINGER;
-typedef struct linger *PLINGER;
-typedef struct linger  *LPLINGER;
-
-typedef struct in_addr IN_ADDR;
-typedef struct in_addr *PIN_ADDR;
-typedef struct in_addr  *LPIN_ADDR;
-
-typedef struct fd_set FD_SET;
-typedef struct fd_set *PFD_SET;
-typedef struct fd_set  *LPFD_SET;
-
-typedef struct hostent HOSTENT;
-typedef struct hostent *PHOSTENT;
-typedef struct hostent  *LPHOSTENT;
-
-typedef struct servent SERVENT;
-typedef struct servent *PSERVENT;
-typedef struct servent  *LPSERVENT;
-
-typedef struct protoent PROTOENT;
-typedef struct protoent *PPROTOENT;
-typedef struct protoent  *LPPROTOENT;
-
-typedef struct timeval TIMEVAL;
-typedef struct timeval *PTIMEVAL;
-typedef struct timeval  *LPTIMEVAL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-#pragma warning(disable: 4786) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4514)       
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-#pragma deprecated("_ftcscat")
-#pragma deprecated("_ftcschr")
-#pragma deprecated("_ftcscpy")
-#pragma deprecated("_ftcscspn")
-#pragma deprecated("_ftcslen")
-#pragma deprecated("_ftcsncat")
-#pragma deprecated("_ftcsncpy")
-#pragma deprecated("_ftcspbrk")
-#pragma deprecated("_ftcsrchr")
-#pragma deprecated("_ftcsspn")
-#pragma deprecated("_ftcsstr")
-#pragma deprecated("_ftcstok")
-#pragma deprecated("_ftcsdup")
-#pragma deprecated("_ftcsnset")
-#pragma deprecated("_ftcsrev")
-#pragma deprecated("_ftcsset")
-#pragma deprecated("_ftcscmp")
-#pragma deprecated("_ftcsicmp")
-#pragma deprecated("_ftcsnccmp")
-#pragma deprecated("_ftcsncmp")
-#pragma deprecated("_ftcsncicmp")
-#pragma deprecated("_ftcsnicmp")
-#pragma deprecated("_ftcscoll")
-#pragma deprecated("_ftcsicoll")
-#pragma deprecated("_ftcsnccoll")
-#pragma deprecated("_ftcsncoll")
-#pragma deprecated("_ftcsncicoll")
-#pragma deprecated("_ftcsnicoll")
-#pragma deprecated("_ftcsclen")
-#pragma deprecated("_ftcsnccat")
-#pragma deprecated("_ftcsnccpy")
-#pragma deprecated("_ftcsncset")
-#pragma deprecated("_ftcsdec")
-#pragma deprecated("_ftcsinc")
-#pragma deprecated("_ftcsnbcnt")
-#pragma deprecated("_ftcsnccnt")
-#pragma deprecated("_ftcsnextc")
-#pragma deprecated("_ftcsninc")
-#pragma deprecated("_ftcsspnp")
-#pragma deprecated("_ftcslwr")
-#pragma deprecated("_ftcsupr")
-#pragma deprecated("_ftclen")
-#pragma deprecated("_ftccpy")
-#pragma deprecated("_ftccmp")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _iobuf {
-        char *_ptr;
-        int   _cnt;
-        char *_base;
-        int   _flag;
-        int   _file;
-        int   _charbuf;
-        int   _bufsiz;
-        char *_tmpfname;
-        };
-typedef struct _iobuf FILE;
-
-
-
-
-
-
-__declspec(dllimport) FILE * __cdecl __iob_func(void);
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long _fsize_t; 
-
-
-
-
-
-struct _wfinddata32_t {
-        unsigned    attrib;
-        __time32_t  time_create;    
-        __time32_t  time_access;    
-        __time32_t  time_write;
-        _fsize_t    size;
-        wchar_t     name[260];
-};
-
-
-
-struct _wfinddata32i64_t {
-        unsigned    attrib;
-        __time32_t  time_create;    
-        __time32_t  time_access;    
-        __time32_t  time_write;
-        __int64     size;
-        wchar_t     name[260];
-};
-
-struct _wfinddata64i32_t {
-        unsigned    attrib;
-        __time64_t  time_create;    
-        __time64_t  time_access;    
-        __time64_t  time_write;
-        _fsize_t    size;
-        wchar_t     name[260];
-};
-
-struct _wfinddata64_t {
-        unsigned    attrib;
-        __time64_t  time_create;    
-        __time64_t  time_access;    
-        __time64_t  time_write;
-        __int64     size;
-        wchar_t     name[260];
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)         wchar_t * __cdecl _wgetcwd(       wchar_t * _DstBuf,      int _SizeInWords);
-__declspec(dllimport)         wchar_t * __cdecl _wgetdcwd(     int _Drive,        wchar_t * _DstBuf,      int _SizeInWords);
-        wchar_t * __cdecl _wgetdcwd_nolock(     int _Drive,        wchar_t * _DstBuf,      int _SizeInWords);
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _wchdir(       const wchar_t * _Path);
-__declspec(dllimport)  int __cdecl _wmkdir(       const wchar_t * _Path);
-__declspec(dllimport)  int __cdecl _wrmdir(       const wchar_t * _Path);
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _waccess(       const wchar_t * _Filename,      int _AccessMode);
-__declspec(dllimport)  errno_t __cdecl _waccess_s(       const wchar_t * _Filename,      int _AccessMode);
-__declspec(dllimport)  int __cdecl _wchmod(       const wchar_t * _Filename,      int _Mode);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _wcreat(       const wchar_t * _Filename,      int _PermissionMode);
-__declspec(dllimport)  intptr_t __cdecl _wfindfirst32(       const wchar_t * _Filename,      struct _wfinddata32_t * _FindData);
-__declspec(dllimport)  int __cdecl _wfindnext32(     intptr_t _FindHandle,      struct _wfinddata32_t * _FindData);
-__declspec(dllimport)  int __cdecl _wunlink(       const wchar_t * _Filename);
-__declspec(dllimport)  int __cdecl _wrename(       const wchar_t * _NewFilename,        const wchar_t * _OldFilename);
-__declspec(dllimport) errno_t __cdecl _wmktemp_s(           wchar_t * _TemplateName,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wmktemp_s(       wchar_t (&_TemplateName)[_Size]) { return _wmktemp_s(_TemplateName, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wmktemp_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wmktemp( wchar_t *_TemplateName);
-
-
-__declspec(dllimport)  intptr_t __cdecl _wfindfirst32i64(       const wchar_t * _Filename,      struct _wfinddata32i64_t * _FindData);
-__declspec(dllimport)  intptr_t __cdecl _wfindfirst64i32(       const wchar_t * _Filename,      struct _wfinddata64i32_t * _FindData);
-__declspec(dllimport)  intptr_t __cdecl _wfindfirst64(       const wchar_t * _Filename,      struct _wfinddata64_t * _FindData);
-__declspec(dllimport)  int __cdecl _wfindnext32i64(     intptr_t _FindHandle,      struct _wfinddata32i64_t * _FindData);
-__declspec(dllimport)  int __cdecl _wfindnext64i32(     intptr_t _FindHandle,      struct _wfinddata64i32_t * _FindData);
-__declspec(dllimport)  int __cdecl _wfindnext64(     intptr_t _FindHandle,      struct _wfinddata64_t * _FindData);
-
-
-__declspec(dllimport)  errno_t __cdecl _wsopen_s(     int * _FileHandle,        const wchar_t * _Filename,      int _OpenFlag,      int _ShareFlag,      int _PermissionFlag);
-
-
-
-
-
-
-
-
-
-extern "C++" __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _wopen(       const wchar_t * _Filename,      int _OpenFlag,      int _PermissionMode = 0);
-extern "C++" __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _wsopen(       const wchar_t * _Filename,      int _OpenFlag,      int _ShareFlag, int _PermissionMode = 0);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  wchar_t * __cdecl _wsetlocale(     int _Category,          const wchar_t * _Locale);
-
-
-
-
-
-
-
-
-__declspec(dllimport) intptr_t __cdecl _wexecl(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wexecle(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wexeclp(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wexeclpe(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wexecv(       const wchar_t * _Filename,        const wchar_t * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _wexecve(       const wchar_t * _Filename,        const wchar_t * const * _ArgList,
-                 const wchar_t * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _wexecvp(       const wchar_t * _Filename,        const wchar_t * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _wexecvpe(       const wchar_t * _Filename,        const wchar_t * const * _ArgList, 
-                 const wchar_t * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _wspawnl(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wspawnle(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wspawnlp(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wspawnlpe(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wspawnv(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _wspawnve(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList,
-                 const wchar_t * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _wspawnvp(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _wspawnvpe(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList,
-                 const wchar_t * const * _Env);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned short _ino_t;      
-
-
-typedef unsigned short ino_t;
-
-
-
-
-
-typedef unsigned int _dev_t;        
-
-
-typedef unsigned int dev_t;
-
-
-
-
-
-typedef long _off_t;                
-
-
-typedef long off_t;
-
-
-
-
-
-
-struct _stat32 {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        _off_t     st_size;
-        __time32_t st_atime;
-        __time32_t st_mtime;
-        __time32_t st_ctime;
-        };
-
-
-
-struct stat {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        _off_t     st_size;
-        time_t st_atime;
-        time_t st_mtime;
-        time_t st_ctime;
-        };
-
-
-
-
-
-struct _stat32i64 {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        __int64    st_size;
-        __time32_t st_atime;
-        __time32_t st_mtime;
-        __time32_t st_ctime;
-        };
-
-struct _stat64i32 {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        _off_t     st_size;
-        __time64_t st_atime;
-        __time64_t st_mtime;
-        __time64_t st_ctime;
-        };
-
-struct _stat64 {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        __int64    st_size;
-        __time64_t st_atime;
-        __time64_t st_mtime;
-        __time64_t st_ctime;
-        };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __cdecl _wstat32(       const wchar_t * _Name,      struct _stat32 * _Stat);
-
-
-__declspec(dllimport) int __cdecl _wstat32i64(       const wchar_t * _Name,      struct _stat32i64 * _Stat);
-__declspec(dllimport) int __cdecl _wstat64i32(       const wchar_t * _Name,      struct _stat64i32 * _Stat);
-__declspec(dllimport) int __cdecl _wstat64(       const wchar_t * _Name,      struct _stat64 * _Stat);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _cgetws_s(       wchar_t * _Buffer, size_t _SizeInWords,      size_t * _SizeRead);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _cgetws_s(       wchar_t (&_Buffer)[_Size], size_t * _Size) { return _cgetws_s(_Buffer, _Size, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cgetws_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _cgetws(         wchar_t *_Buffer);
-__declspec(dllimport)  wint_t __cdecl _getwch(void);
-__declspec(dllimport)  wint_t __cdecl _getwche(void);
-__declspec(dllimport)  wint_t __cdecl _putwch(wchar_t _WCh);
-__declspec(dllimport)  wint_t __cdecl _ungetwch(wint_t _WCh);
-__declspec(dllimport)  int __cdecl _cputws(       const wchar_t * _String);
-__declspec(dllimport)  int __cdecl _cwprintf(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _cwprintf_s(        const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _cwscanf(        const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _cwscanf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _cwscanf_s(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _cwscanf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vcwprintf(        const wchar_t *_Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vcwprintf_s(        const wchar_t *_Format, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _cwprintf_p(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vcwprintf_p(        const wchar_t*  _Format, va_list _ArgList);
-
-__declspec(dllimport) int __cdecl _cwprintf_l(       const  wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport) int __cdecl _cwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport) int __cdecl _vcwprintf_l(        const wchar_t *_Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport) int __cdecl _vcwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport) int __cdecl _cwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport) int __cdecl _vcwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
- wint_t __cdecl _putwch_nolock(wchar_t _WCh);
- wint_t __cdecl _getwch_nolock(void);
- wint_t __cdecl _getwche_nolock(void);
- wint_t __cdecl _ungetwch_nolock(wint_t _WCh);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  FILE * __cdecl _wfsopen(       const wchar_t * _Filename,        const wchar_t * _Mode,      int _ShFlag);
-
-
-__declspec(dllimport)  wint_t __cdecl fgetwc(     FILE * _File);
-__declspec(dllimport)  wint_t __cdecl _fgetwchar(void);
-__declspec(dllimport)  wint_t __cdecl fputwc(       wchar_t _Ch,      FILE * _File);
-__declspec(dllimport)  wint_t __cdecl _fputwchar(       wchar_t _Ch);
-__declspec(dllimport)  wint_t __cdecl getwc(     FILE * _File);
-__declspec(dllimport)  wint_t __cdecl getwchar(void);
-__declspec(dllimport)  wint_t __cdecl putwc(       wchar_t _Ch,      FILE * _File);
-__declspec(dllimport)  wint_t __cdecl putwchar(       wchar_t _Ch);
-__declspec(dllimport)  wint_t __cdecl ungetwc(     wint_t _Ch,      FILE * _File);
-
-__declspec(dllimport)  wchar_t * __cdecl fgetws(       wchar_t * _Dst,      int _SizeInWords,      FILE * _File);
-__declspec(dllimport)  int __cdecl fputws(       const wchar_t * _Str,      FILE * _File);
-__declspec(dllimport)  wchar_t * __cdecl _getws_s(       wchar_t * _Str,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline wchar_t * __cdecl _getws_s(     wchar_t (&_String)[_Size]) { return _getws_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_getws_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _getws( wchar_t *_String);
-__declspec(dllimport)  int __cdecl _putws(       const wchar_t * _Str);
-
-__declspec(dllimport)  int __cdecl fwprintf(     FILE * _File,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl fwprintf_s(     FILE * _File,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl wprintf(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl wprintf_s(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _scwprintf(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl vfwprintf(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vfwprintf_s(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vwprintf(        const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vwprintf_s(        const wchar_t * _Format, va_list _ArgList);
-
-__declspec(dllimport) int __cdecl swprintf_s(       wchar_t * _Dst,      size_t _SizeInWords,         const wchar_t * _Format, ...);
-extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl swprintf_s(     wchar_t (&_Dest)[_Size],         const wchar_t * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return vswprintf_s(_Dest, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
-__declspec(dllimport) int __cdecl vswprintf_s(       wchar_t * _Dst,      size_t _SizeInWords,         const wchar_t * _Format, va_list _ArgList);
-extern "C++" { template <size_t _Size> inline int __cdecl vswprintf_s(     wchar_t (&_Dest)[_Size],         const wchar_t * _Format, va_list _Args) { return vswprintf_s(_Dest, _Size, _Format, _Args); } }
-
-__declspec(dllimport)  int __cdecl _swprintf_c(       wchar_t * _DstBuf,      size_t _SizeInWords,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vswprintf_c(       wchar_t * _DstBuf,      size_t _SizeInWords,         const wchar_t * _Format, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _snwprintf_s(       wchar_t * _DstBuf,      size_t _DstSizeInWords,      size_t _MaxCount,         const wchar_t * _Format, ...);
-extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl _snwprintf_s(     wchar_t (&_Dest)[_Size],      size_t _Count,         const wchar_t * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return _vsnwprintf_s(_Dest, _Size, _Count, _Format, _ArgList); } __pragma(warning(pop)); }
-__declspec(dllimport)  int __cdecl _vsnwprintf_s(       wchar_t * _DstBuf,      size_t _DstSizeInWords,      size_t _MaxCount,         const wchar_t * _Format, va_list _ArgList);
-extern "C++" { template <size_t _Size> inline int __cdecl _vsnwprintf_s(     wchar_t (&_Dest)[_Size],      size_t _Count,         const wchar_t * _Format, va_list _Args) { return _vsnwprintf_s(_Dest, _Size, _Count, _Format, _Args); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _snwprintf(     wchar_t *_Dest,      size_t _Count,         const wchar_t * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnwprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _vsnwprintf(     wchar_t *_Dest,      size_t _Count,         const wchar_t * _Format, va_list _Args);
-
-__declspec(dllimport)  int __cdecl _fwprintf_p(     FILE * _File,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _wprintf_p(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vfwprintf_p(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vwprintf_p(        const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _swprintf_p(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vswprintf_p(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _scwprintf_p(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vscwprintf_p(        const wchar_t * _Format, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _wprintf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _wprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _wprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _fwprintf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _fwprintf_p_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _fwprintf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vfwprintf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vfwprintf_p_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vfwprintf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _swprintf_c_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _swprintf_p_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _swprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vswprintf_c_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vswprintf_p_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vswprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _scwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _scwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vscwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwprintf_l(     wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snwprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnwprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsnwprintf_l(     wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsnwprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable:4141 4996)
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_swprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl _swprintf(     wchar_t *_Dest,         const wchar_t * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "vswprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl _vswprintf(     wchar_t *_Dest,         const wchar_t * _Format, va_list _Args);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "__swprintf_l_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl __swprintf_l(     wchar_t *_Dest,         const wchar_t * _Format, _locale_t _Plocinfo, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vswprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl __vswprintf_l(     wchar_t *_Dest,         const wchar_t * _Format, _locale_t _Plocinfo, va_list _Args);
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning( push )
-#pragma warning( disable : 4793 4412 )
-static __inline int swprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, ...)
-{
-    va_list _Arglist;
-    int _Ret;
-    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-    _Ret = _vswprintf_c_l(_String, _Count, _Format, 0, _Arglist);
-    ( _Arglist = (va_list)0 );
-    return _Ret;
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4412 )
-static __inline int __cdecl vswprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, va_list _Ap)
-{
-    return _vswprintf_c_l(_String, _Count, _Format, 0, _Ap);
-}
-#pragma warning( pop )
-
-
-
-
-#pragma warning( push )
-#pragma warning( disable : 4793 4412 )
-static __inline int _swprintf_l(wchar_t * _String, size_t _Count, const wchar_t * _Format, _locale_t _Plocinfo, ...)
-{
-    va_list _Arglist;
-    int _Ret;
-    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Plocinfo) ) + ( (sizeof(_Plocinfo) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-    _Ret = _vswprintf_c_l(_String, _Count, _Format, _Plocinfo, _Arglist);
-    ( _Arglist = (va_list)0 );
-    return _Ret;
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4412 )
-static __inline int __cdecl _vswprintf_l(wchar_t * _String, size_t _Count, const wchar_t * _Format, _locale_t _Plocinfo, va_list _Ap)
-{
-    return _vswprintf_c_l(_String, _Count, _Format, _Plocinfo, _Ap);
-}
-#pragma warning( pop )
-
-
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-
-#pragma warning( push )
-#pragma warning( disable : 4793 4141 )
-extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "swprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int swprintf(     wchar_t * _String,         const wchar_t * _Format, ...)
-{
-    va_list _Arglist;
-    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-    int _Ret = _vswprintf(_String, _Format, _Arglist);
-    ( _Arglist = (va_list)0 );
-    return _Ret;
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4141 )
-extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "vswprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int __cdecl vswprintf(     wchar_t * _String,         const wchar_t * _Format, va_list _Ap)
-{
-    return _vswprintf(_String, _Format, _Ap);
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4793 4141 )
-extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_swprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int _swprintf_l(     wchar_t * _String,         const wchar_t * _Format, _locale_t _Plocinfo, ...)
-{
-    va_list _Arglist;
-    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Plocinfo) ) + ( (sizeof(_Plocinfo) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-    int _Ret = __vswprintf_l(_String, _Format, _Plocinfo, _Arglist);
-    ( _Arglist = (va_list)0 );
-    return _Ret;
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4141 )
-extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vswprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int __cdecl _vswprintf_l(     wchar_t * _String,         const wchar_t * _Format, _locale_t _Plocinfo, va_list _Ap)
-{
-    return __vswprintf_l(_String, _Format, _Plocinfo, _Ap);
-}
-#pragma warning( pop )
-
-#pragma warning( pop )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  wchar_t * __cdecl _wtempnam(         const wchar_t * _Directory,          const wchar_t * _FilePrefix);
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _vscwprintf(        const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vscwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "fwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl fwscanf(     FILE * _File,         const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_fwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _fwscanf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl fwscanf_s(     FILE * _File,         const wchar_t * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _fwscanf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "swscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl swscanf(       const wchar_t * _Src,         const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_swscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _swscanf_l(       const wchar_t * _Src,         const wchar_t * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl swscanf_s(       const wchar_t *_Src,         const wchar_t * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _swscanf_s_l(       const wchar_t * _Src,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwscanf(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwscanf_l(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snwscanf_s(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _snwscanf_s_l(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl wscanf(        const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _wscanf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl wscanf_s(        const wchar_t * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _wscanf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  FILE * __cdecl _wfdopen(     int _FileHandle ,        const wchar_t * _Mode);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wfopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl _wfopen(       const wchar_t * _Filename,        const wchar_t * _Mode);
-__declspec(dllimport)  errno_t __cdecl _wfopen_s(                  FILE ** _File,        const wchar_t * _Filename,        const wchar_t * _Mode);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wfreopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl _wfreopen(       const wchar_t * _Filename,        const wchar_t * _Mode,      FILE * _OldFile);
-__declspec(dllimport)  errno_t __cdecl _wfreopen_s(                  FILE ** _File,        const wchar_t * _Filename,        const wchar_t * _Mode,      FILE * _OldFile);
-
-
-
-
-
-__declspec(dllimport)  FILE * __cdecl _wpopen(       const wchar_t *_Command,        const wchar_t * _Mode);
-__declspec(dllimport)  int __cdecl _wremove(       const wchar_t * _Filename);
-__declspec(dllimport)  errno_t __cdecl _wtmpnam_s(       wchar_t * _DstBuf,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wtmpnam_s(       wchar_t (&_Buffer)[_Size]) { return _wtmpnam_s(_Buffer, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wtmpnam_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wtmpnam( wchar_t *_Buffer);
-
-__declspec(dllimport)  wint_t __cdecl _fgetwc_nolock(     FILE * _File);
-__declspec(dllimport)  wint_t __cdecl _fputwc_nolock(       wchar_t _Ch,      FILE * _File);
-__declspec(dllimport)  wint_t __cdecl _ungetwc_nolock(     wint_t _Ch,      FILE * _File);
-
-
-
-
-
-
-
-inline wint_t __cdecl getwchar()
-        {return (fgetwc((&__iob_func()[0]))); }   
-inline wint_t __cdecl putwchar(wchar_t _C)
-        {return (fputwc(_C, (&__iob_func()[1]))); }       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct tm {
-        int tm_sec;     
-        int tm_min;     
-        int tm_hour;    
-        int tm_mday;    
-        int tm_mon;     
-        int tm_year;    
-        int tm_wday;    
-        int tm_yday;    
-        int tm_isdst;   
-        };
-
-
-
-
-
-
- 
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wasctime_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wasctime(     const struct tm * _Tm);
-__declspec(dllimport) errno_t __cdecl _wasctime_s(       wchar_t *_Buf,      size_t _SizeInWords,      const struct tm * _Tm);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wasctime_s(       wchar_t (&_Buffer)[_Size],      const struct tm * _Time) { return _wasctime_s(_Buffer, _Size, _Time); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctime32_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wctime32(     const __time32_t *_Time);
-__declspec(dllimport) errno_t __cdecl _wctime32_s(       wchar_t* _Buf,      size_t _SizeInWords,      const __time32_t * _Time);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wctime32_s(       wchar_t (&_Buffer)[_Size],      const __time32_t * _Time) { return _wctime32_s(_Buffer, _Size, _Time); } }
-
-__declspec(dllimport) size_t __cdecl wcsftime(       wchar_t * _Buf,      size_t _SizeInWords,         const wchar_t * _Format,       const struct tm * _Tm);
-__declspec(dllimport) size_t __cdecl _wcsftime_l(       wchar_t * _Buf,      size_t _SizeInWords,         const wchar_t *_Format,      const struct tm *_Tm,        _locale_t _Locale);
-
-__declspec(dllimport) errno_t __cdecl _wstrdate_s(       wchar_t * _Buf,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wstrdate_s(       wchar_t (&_Buffer)[_Size]) { return _wstrdate_s(_Buffer, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wstrdate_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wstrdate( wchar_t *_Buffer);
-
-__declspec(dllimport) errno_t __cdecl _wstrtime_s(       wchar_t * _Buf,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wstrtime_s(       wchar_t (&_Buffer)[_Size]) { return _wstrtime_s(_Buffer, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wstrtime_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wstrtime( wchar_t *_Buffer);
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctime64_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wctime64(     const __time64_t * _Time);
-__declspec(dllimport) errno_t __cdecl _wctime64_s(       wchar_t* _Buf,      size_t _SizeInWords,      const __time64_t *_Time);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wctime64_s(       wchar_t (&_Buffer)[_Size],      const __time64_t * _Time) { return _wctime64_s(_Buffer, _Size, _Time); } }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable:4996)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static __inline wchar_t * __cdecl _wctime(const time_t * _Time)
-{
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-    return _wctime64(_Time);
-#pragma warning( pop )
-}
-
-static __inline errno_t __cdecl _wctime_s(wchar_t *_Buffer, size_t _SizeInWords, const time_t * _Time)
-{
-    return _wctime64_s(_Buffer, _SizeInWords, _Time);
-}
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-typedef int mbstate_t;
-typedef wchar_t _Wint_t;
-
-__declspec(dllimport) wint_t __cdecl btowc(int);
-__declspec(dllimport) size_t __cdecl mbrlen(           const char * _Ch,      size_t _SizeInBytes,
-                                     mbstate_t * _State);
-__declspec(dllimport) size_t __cdecl mbrtowc(       wchar_t * _DstCh,            const char * _SrcCh,
-                                    size_t _SizeInBytes,        mbstate_t * _State);
-__declspec(dllimport) errno_t __cdecl mbsrtowcs_s(       size_t* _Retval,          wchar_t * _Dst,      size_t _SizeInWords,                  const char ** _PSrc,      size_t _N,        mbstate_t * _State);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl mbsrtowcs_s(       size_t * _Retval,        wchar_t (&_Dest)[_Size],                  const char ** _PSource,      size_t _Count,        mbstate_t * _State) { return mbsrtowcs_s(_Retval, _Dest, _Size, _PSource, _Count, _State); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "mbsrtowcs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl mbsrtowcs( wchar_t *_Dest,  const char ** _PSrc,  size_t _Count,  mbstate_t * _State);
-
-__declspec(dllimport) errno_t __cdecl wcrtomb_s(       size_t * _Retval,          char * _Dst,
-             size_t _SizeInBytes,        wchar_t _Ch,        mbstate_t * _State);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcrtomb_s(       size_t * _Retval,          char (&_Dest)[_Size],        wchar_t _Source,        mbstate_t * _State) { return wcrtomb_s(_Retval, _Dest, _Size, _Source, _State); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcrtomb_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcrtomb( char *_Dest,  wchar_t _Source,  mbstate_t * _State);
-__declspec(dllimport) errno_t __cdecl wcsrtombs_s(       size_t * _Retval,          char * _Dst,
-             size_t _SizeInBytes,                const wchar_t ** _Src,      size_t _Size,        mbstate_t * _State);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsrtombs_s(       size_t * _Retval,          char (&_Dest)[_Size],                const wchar_t ** _PSrc,      size_t _Count,        mbstate_t * _State) { return wcsrtombs_s(_Retval, _Dest, _Size, _PSrc, _Count, _State); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsrtombs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcsrtombs( char *_Dest,  const wchar_t ** _PSource,  size_t _Count,  mbstate_t * _State);
-__declspec(dllimport) int __cdecl wctob(     wint_t _WCh);
-
-
-
-
-
-
-
-__declspec(dllimport)  void *  __cdecl memmove(         void * _Dst,          const void * _Src,      size_t _MaxCount);
-
- void *  __cdecl memcpy(         void * _Dst,          const void * _Src,      size_t _MaxCount);
-
-__declspec(dllimport) errno_t __cdecl memcpy_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
-__declspec(dllimport) errno_t __cdecl memmove_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
-
-__inline int __cdecl fwide(       FILE * _F, int _M)
-        {(void)_F; return (_M); }
-__inline int __cdecl mbsinit(       const mbstate_t *_P)
-        {return (_P == 0 || *_P == 0); }
-__inline const wchar_t * __cdecl wmemchr(       const wchar_t *_S,        wchar_t _C,      size_t _N)
-        {for (; 0 < _N; ++_S, --_N)
-                if (*_S == _C)
-                        return (const wchar_t *)(_S);
-        return (0); }
-__inline int __cdecl wmemcmp(       const wchar_t *_S1,        const wchar_t *_S2,      size_t _N)
-        {for (; 0 < _N; ++_S1, ++_S2, --_N)
-                if (*_S1 != *_S2)
-                        return (*_S1 < *_S2 ? -1 : +1);
-        return (0); }
-
-__inline  wchar_t * __cdecl wmemcpy(       wchar_t *_S1,          const wchar_t *_S2,      size_t _N)
-        {
-#pragma warning( push )
-#pragma warning( disable : 4996 6386 )
-            return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
-#pragma warning( pop )
-        }
-
-
-__inline errno_t __cdecl wmemcpy_s(         wchar_t *_S1,      rsize_t _N1,          const wchar_t *_S2, rsize_t _N)
-        {
-#pragma warning( push )
-#pragma warning( disable : 6386 )
-            return memcpy_s(_S1, _N1*sizeof(wchar_t), _S2, _N*sizeof(wchar_t));
-        }
-#pragma warning( pop )
-
-
-__inline  wchar_t * __cdecl wmemmove(         wchar_t *_S1,          const wchar_t *_S2,      size_t _N)
-        {
-#pragma warning( push )
-#pragma warning( disable : 4996 6386 )
-#pragma warning( disable : 6387)
-			
-            return (wchar_t *)memmove(_S1, _S2, _N*sizeof(wchar_t));
-#pragma warning( pop )
-        }
-
-
-__inline errno_t __cdecl wmemmove_s(         wchar_t *_S1,      rsize_t _N1,          const wchar_t *_S2,      rsize_t _N)
-        {
-#pragma warning( push )
-#pragma warning( disable : 6386 )
-            return memmove_s(_S1, _N1*sizeof(wchar_t), _S2, _N*sizeof(wchar_t));
-#pragma warning( pop )
-        }
-
-
-__inline wchar_t * __cdecl wmemset(       wchar_t *_S,        wchar_t _C,      size_t _N)
-        {
-            wchar_t *_Su = _S;
-            for (; 0 < _N; ++_Su, --_N)
-            {
-                *_Su = _C;
-            }
-            return (_S);
-        }
-
-
-extern "C++" {
-inline wchar_t * __cdecl wmemchr(       wchar_t *_S,      wchar_t _C,      size_t _N)
-        { return (wchar_t *)wmemchr((const wchar_t *)_S, _C, _N); }
-}
-
-
-
-
-}       
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-typedef wchar_t     _TCHAR;
-typedef wchar_t     _TSCHAR;
-typedef wchar_t     _TUCHAR;
-typedef wchar_t     _TXCHAR;
-typedef wint_t      _TINT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline  size_t __cdecl _tclen(       const wchar_t *_Cpc)
-{ 
-    
-    (void *)_Cpc;
-    return 1;
-}
-__inline void __cdecl _tccpy(     wchar_t *_Pc1,        const wchar_t *_Cpc2) { *_Pc1 = (wchar_t)*_Cpc2; }
-__inline void __cdecl _tccpy_l(     wchar_t *_Pc1,        const wchar_t *_Cpc2,        _locale_t _Locale)
-{
-    (void)_Locale;
-    _tccpy(_Pc1, _Cpc2);
-}
-__inline  int __cdecl _tccmp(       const wchar_t *_Cpc1,        const wchar_t *_Cpc2) { return (int) ((*_Cpc1)-(*_Cpc2)); }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline  wchar_t * __cdecl _wcsdec(       const wchar_t * _Cpc1,        const wchar_t * _Cpc2) { return (wchar_t *)((_Cpc1)>=(_Cpc2) ? 0 : ((_Cpc2)-1)); }
-__inline  wchar_t * __cdecl _wcsinc(       const wchar_t * _Pc) { return (wchar_t *)(_Pc+1); }
-__inline  unsigned int __cdecl _wcsnextc(       const wchar_t * _Cpc) { return (unsigned int)*_Cpc; }
-__inline  wchar_t * __cdecl _wcsninc(       const wchar_t * _Pc,      size_t _Sz) { return (wchar_t *)(_Pc+_Sz); }
-__inline  size_t __cdecl _wcsncnt(          const wchar_t * _String,      size_t _Cnt) 
-{ 
-        size_t n = _Cnt; 
-        wchar_t *cp = (wchar_t *)_String; 
-        while (n-- && *cp) 
-                cp++; 
-        return _Cnt - n - 1; 
-}
-__inline  wchar_t * __cdecl _wcsspnp
-( 
-           const wchar_t * _Cpc1, 
-           const wchar_t * _Cpc2
-)
-{
-    return _Cpc1==0 ? 0 : ((*(_Cpc1 += wcsspn(_Cpc1,_Cpc2))!='\0') ? (wchar_t*)_Cpc1 : 0); 
-}
-
-
-__inline  errno_t __cdecl _wcsncpy_s_l(       wchar_t *_Destination,      size_t _Destination_size_chars,        const wchar_t *_Source,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-    return wcsncpy_s(_Destination, _Destination_size_chars, _Source, _Count);
-}
-
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsncpy_s_l(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale) { return _wcsncpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsncpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsncpy_l(     wchar_t *_Dst,        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-#pragma warning( push )
-#pragma warning( disable : 4996 6054)
-    return wcsncpy(_Dst, _Source, _Count);
-#pragma warning( pop )
-}
-
-
-
-
-__inline  errno_t __cdecl _wcsncat_s_l(           wchar_t *_Destination,      size_t _Destination_size_chars,        const wchar_t *_Source,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-    return wcsncat_s(_Destination, _Destination_size_chars, _Source, _Count);
-}
-
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsncat_s_l(       wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale) { return _wcsncat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsncat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsncat_l(         wchar_t *_Dst,        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-#pragma warning( push )
-#pragma warning( disable : 4996 6054 6059)
-
-    return wcsncat(_Dst, _Source, _Count);
-#pragma warning( pop )
-}
-
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcstok_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * _wcstok_l(           wchar_t * _String,        const wchar_t * _Delimiters,        _locale_t _Locale) 
-{
-    (void)_Locale;
-#pragma warning(push)
-#pragma warning(disable:4996)
-	return wcstok(_String,_Delimiters);
-#pragma warning(pop)
-}
-
-__inline wchar_t * _wcstok_s_l(           wchar_t * _String,        const wchar_t * _Delimiters,                        wchar_t **_Current_position,        _locale_t _Locale) 
-{
-    (void)_Locale;
-    return wcstok_s(_String, _Delimiters, _Current_position);
-}
-
-__inline  errno_t _wcsnset_s_l(           wchar_t * _Destination,      size_t _Destination_size_chars,        wchar_t _Value,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-    return _wcsnset_s(_Destination, _Destination_size_chars, _Value, _Count);
-}
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsnset_s_l(           wchar_t (&_Dest)[_Size],        wchar_t _Value,      size_t _Count,        _locale_t _Locale) { return _wcsnset_s_l(_Dest, _Size, _Value, _Count, _Locale); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsnset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsnset_l(           wchar_t *_Dst,        wchar_t _Value,      size_t _MaxCount,        _locale_t _Locale)
-{
-    (void)_Locale;
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-    return _wcsnset(_Dst, _Value, _MaxCount);
-#pragma warning( pop )
-}
-
-
-
-__inline  errno_t _wcsset_s_l(           wchar_t * _Destination,      size_t _Destination_size_chars,        wchar_t _Value,        _locale_t _Locale) 
-{
-    (void)_Locale;
-    return _wcsset_s(_Destination, _Destination_size_chars, _Value);
-}
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsset_s_l(           wchar_t (&_Dest)[_Size],        wchar_t _Value,        _locale_t _Locale) { return _wcsset_s_l(_Dest, _Size, _Value, _Locale); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsset_l(         wchar_t *_Dst,        wchar_t _Value,        _locale_t _Locale)
-{
-    (void)_Locale;
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-    return _wcsset(_Dst, _Value);
-#pragma warning( pop )
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  unsigned char * __cdecl _mbsdup(       const unsigned char * _Str);
-
-
-
-
-
-__declspec(dllimport)  unsigned int __cdecl _mbbtombc(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbbtombc_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbbtype(     unsigned char _Ch,      int _CType);
-__declspec(dllimport)  int __cdecl _mbbtype_l(     unsigned char _Ch,      int _CType,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbctombb(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctombb_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport) int __cdecl _mbsbtype(         const unsigned char * _Str,      size_t _Pos);
-__declspec(dllimport) int __cdecl _mbsbtype_l(         const unsigned char * _Str,      size_t _Pos,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbscat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscat_s(       unsigned char (&_Dst)[_Size],        const unsigned char * _DstSizeInBytes) { return _mbscat_s(_Dst, _Size, _DstSizeInBytes); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscat( unsigned char *_Dest,  const unsigned char * _Source);
-__declspec(dllimport) errno_t __cdecl _mbscat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,        _locale_t _Locale) { return _mbscat_s_l(_Dest, _Size, _Source, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscat_l(         unsigned char *_Dest,        const unsigned char * _Source,        _locale_t _Locale);
-__declspec(dllimport)   const unsigned char * __cdecl _mbschr(       const unsigned char * _Str,      unsigned int _Ch);
-__declspec(dllimport)   const unsigned char * __cdecl _mbschr_l(       const unsigned char * _Str,      unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbscmp(       const unsigned char * _Str1,        const unsigned char * _Str2);
-__declspec(dllimport)  int __cdecl _mbscmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbscoll(       const unsigned char * _Str1,        const unsigned char * _Str2);
-__declspec(dllimport)  int __cdecl _mbscoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbscpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source) { return _mbscpy_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscpy( unsigned char *_Dest,  const unsigned char * _Source);
-__declspec(dllimport) errno_t __cdecl _mbscpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,        _locale_t _Locale) { return _mbscpy_s(_Dest, _Size, _Source, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscpy_l(     unsigned char *_Dest,        const unsigned char * _Source,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbscspn(       const unsigned char * _Str,        const unsigned char * _Control);
-__declspec(dllimport)  size_t __cdecl _mbscspn_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbsdec(         const unsigned char * _Start,        const unsigned char * _Pos);
-__declspec(dllimport)  unsigned char * __cdecl _mbsdec_l(         const unsigned char * _Start,        const unsigned char * _Pos,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsicmp(       const unsigned char * _Str1,        const unsigned char * _Str2);
-__declspec(dllimport)  int __cdecl _mbsicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsicoll(       const unsigned char * _Str1,        const unsigned char * _Str2);
-__declspec(dllimport)  int __cdecl _mbsicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbsinc(       const unsigned char * _Ptr);
-__declspec(dllimport)  unsigned char * __cdecl _mbsinc_l(       const unsigned char * _Ptr,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbslen(       const unsigned char * _Str);
-__declspec(dllimport)  size_t __cdecl _mbslen_l(       const unsigned char * _Str,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbsnlen(       const unsigned char * _Str,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _mbsnlen_l(       const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbslwr_s(         unsigned char *_Str,      size_t _SizeInBytes);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbslwr_s(         unsigned char (&_String)[_Size]) { return _mbslwr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbslwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbslwr( unsigned char *_String);
-__declspec(dllimport) errno_t __cdecl _mbslwr_s_l(         unsigned char *_Str,      size_t _SizeInBytes,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbslwr_s_l(       unsigned char (&_String)[_Size],        _locale_t _Locale) { return _mbslwr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbslwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbslwr_l(         unsigned char *_String,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsnbcat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcat_s(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsnbcat_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcat( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
-__declspec(dllimport) errno_t __cdecl _mbsnbcat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsnbcat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcat_l(         unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnbcmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnbcmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnbcoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnbcoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbsnbcnt(         const unsigned char * _Str,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _mbsnbcnt_l(         const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsnbcpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsnbcpy_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcpy( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
-__declspec(dllimport) errno_t __cdecl _mbsnbcpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcpy_s_l(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsnbcpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcpy_l(       unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnbicmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnbicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnbicoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnbicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsnbset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Ch,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount) { return _mbsnbset_s(_Dest, _Size, _Val, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbset(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount);
-__declspec(dllimport) errno_t __cdecl _mbsnbset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Ch,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale) { return _mbsnbset_s_l(_Dest, _Size, _Val, _MaxCount, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbset_l(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsncat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncat_s(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsncat_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncat( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
-__declspec(dllimport) errno_t __cdecl _mbsncat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsncat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncat_l(         unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbsnccnt(         const unsigned char * _Str,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _mbsnccnt_l(         const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsncmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsncmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsncoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsncoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsncpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsncpy_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncpy( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
-__declspec(dllimport) errno_t __cdecl _mbsncpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncpy_s_l(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsncpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncpy_l(     unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbsnextc (       const unsigned char * _Str);
-__declspec(dllimport)  unsigned int __cdecl _mbsnextc_l(       const unsigned char * _Str,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnicmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnicoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbsninc(         const unsigned char * _Str,      size_t _Count);
-__declspec(dllimport)  unsigned char * __cdecl _mbsninc_l(         const unsigned char * _Str,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsnset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount) { return _mbsnset_s(_Dest, _Size, _Val, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnset(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount);
-__declspec(dllimport) errno_t __cdecl _mbsnset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale) { return _mbsnset_s_l(_Dest, _Size, _Val, _MaxCount, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnset_l(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)   const unsigned char * __cdecl _mbspbrk(       const unsigned char * _Str,        const unsigned char * _Control);
-__declspec(dllimport)   const unsigned char * __cdecl _mbspbrk_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
-__declspec(dllimport)   const unsigned char * __cdecl _mbsrchr(       const unsigned char * _Str,      unsigned int _Ch);
-__declspec(dllimport)   const unsigned char * __cdecl _mbsrchr_l(       const unsigned char *_Str,      unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport) unsigned char * __cdecl _mbsrev(         unsigned char * _Str);
-__declspec(dllimport) unsigned char * __cdecl _mbsrev_l(         unsigned char *_Str,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val) { return _mbsset_s(_Dest, _Size, _Val); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsset(         unsigned char *_String,      unsigned int _Val);
-__declspec(dllimport) errno_t __cdecl _mbsset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,        _locale_t _Locale) { return _mbsset_s_l(_Dest, _Size, _Val, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsset_l(         unsigned char *_String,      unsigned int _Val,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbsspn(       const unsigned char *_Str,        const unsigned char * _Control);
-__declspec(dllimport)  size_t __cdecl _mbsspn_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbsspnp(       const unsigned char * _Str1,        const unsigned char *_Str2);
-__declspec(dllimport)  unsigned char * __cdecl _mbsspnp_l(       const unsigned char *_Str1,        const unsigned char *_Str2,        _locale_t _Locale);
-__declspec(dllimport)   const unsigned char * __cdecl _mbsstr(       const unsigned char * _Str,        const unsigned char * _Substr);
-__declspec(dllimport)   const unsigned char * __cdecl _mbsstr_l(       const unsigned char * _Str,        const unsigned char * _Substr,        _locale_t _Locale);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  unsigned char * __cdecl _mbstok(           unsigned char * _Str,        const unsigned char * _Delim);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstok_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  unsigned char * __cdecl _mbstok_l(           unsigned char *_Str,        const unsigned char * _Delim,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbstok_s(           unsigned char *_Str,        const unsigned char * _Delim,                        unsigned char ** _Context);
-__declspec(dllimport)  unsigned char * __cdecl _mbstok_s_l(           unsigned char * _Str,        const unsigned char * _Delim,                        unsigned char ** _Context,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsupr_s(           unsigned char *_Str,      size_t _SizeInBytes);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsupr_s(       unsigned char (&_String)[_Size]) { return _mbsupr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsupr( unsigned char *_String);
-__declspec(dllimport) errno_t __cdecl _mbsupr_s_l(           unsigned char *_Str,      size_t _SizeInBytes,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsupr_s_l(       unsigned char (&_String)[_Size],        _locale_t _Locale) { return _mbsupr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsupr_l(         unsigned char *_String,        _locale_t _Locale);
-
-__declspec(dllimport)  size_t __cdecl _mbclen(       const unsigned char *_Str);
-__declspec(dllimport)  size_t __cdecl _mbclen_l(       const unsigned char * _Str,        _locale_t _Locale);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbccpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _mbccpy(     unsigned char * _Dst,        const unsigned char * _Src);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbccpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _mbccpy_l(     unsigned char *_Dst,        const unsigned char *_Src,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbccpy_s(     unsigned char * _Dst,      size_t _DstSizeInBytes,        int * _PCopied,        const unsigned char * _Src);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbccpy_s(     unsigned char (&_Dest)[_Size],        int * _PCopied,        const unsigned char * _Source) { return _mbccpy_s(_Dest, _Size, _PCopied, _Source); } }
-__declspec(dllimport) errno_t __cdecl _mbccpy_s_l(     unsigned char * _Dst,      size_t _DstSizeInBytes,        int * _PCopied,        const unsigned char * _Src,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbccpy_s_l(     unsigned char (&_Dest)[_Size],        int * _PCopied,        const unsigned char * _Source,        _locale_t _Locale) { return _mbccpy_s_l(_Dest, _Size, _PCopied, _Source, _Locale); } }
-
-
-
-
-
-extern "C++" {
-inline  unsigned char * __cdecl _mbschr(       unsigned char *_String,      unsigned int _Char)
-{
-    return ((unsigned char *)_mbschr((const unsigned char *)_String, _Char)); 
-}
-
-inline  unsigned char * __cdecl _mbschr_l(       unsigned char *_String,      unsigned int _Char,        _locale_t _Locale)
-{
-    return ((unsigned char *)_mbschr_l((const unsigned char *)_String, _Char, _Locale)); 
-}
-
-inline  unsigned char * __cdecl _mbspbrk(       unsigned char *_String,        const unsigned char *_CharSet)
-{
-    return ((unsigned char *)_mbspbrk((const unsigned char *)_String, _CharSet)); 
-}
-
-inline  unsigned char * __cdecl _mbspbrk_l(       unsigned char *_String,        const unsigned char *_CharSet,        _locale_t _Locale)
-{
-    return ((unsigned char *)_mbspbrk_l((const unsigned char *)_String, _CharSet, _Locale)); 
-}
-
-inline  unsigned char * __cdecl _mbsrchr(       unsigned char *_String,      unsigned int _Char)
-{
-    return ((unsigned char *)_mbsrchr((const unsigned char *)_String, _Char)); 
-}
-
-inline  unsigned char * __cdecl _mbsrchr_l(       unsigned char *_String,      unsigned int _Char,        _locale_t _Locale)
-{
-    return ((unsigned char *)_mbsrchr_l((const unsigned char *)_String, _Char, _Locale)); 
-}
-
-inline  unsigned char * __cdecl _mbsstr(       unsigned char *_String,        const unsigned char *_Match)
-{
-    return ((unsigned char *)_mbsstr((const unsigned char *)_String, _Match)); 
-}
-
-inline  unsigned char * __cdecl _mbsstr_l(       unsigned char *_String,        const unsigned char *_Match,        _locale_t _Locale)
-{
-    return ((unsigned char *)_mbsstr_l((const unsigned char *)_String, _Match, _Locale)); 
-}
-}
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _ismbcalnum(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcalnum_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcalpha(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcalpha_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcdigit(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcdigit_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcgraph(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcgraph_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbclegal(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbclegal_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbclower(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbclower_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcprint(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcprint_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcpunct(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcpunct_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcspace(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcspace_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcupper(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcupper_l(     unsigned int _Ch,        _locale_t _Locale);
-
-__declspec(dllimport)  unsigned int __cdecl _mbctolower(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctolower_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbctoupper(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctoupper_l(     unsigned int _Ch,        _locale_t _Locale);
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _ismbblead(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbblead_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbbtrail(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbbtrail_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbslead(         const unsigned char * _Str,        const unsigned char * _Pos);
-__declspec(dllimport)  int __cdecl _ismbslead_l(         const unsigned char * _Str,        const unsigned char * _Pos,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbstrail(         const unsigned char * _Str,        const unsigned char * _Pos);
-__declspec(dllimport)  int __cdecl _ismbstrail_l(         const unsigned char * _Str,        const unsigned char * _Pos,        _locale_t _Locale);
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _ismbchira(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbchira_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbckata(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbckata_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcsymbol(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcsymbol_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcl0(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcl0_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcl1(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcl1_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcl2(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcl2_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbcjistojms(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbcjistojms_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbcjmstojis(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbcjmstojis_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbctohira(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctohira_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbctokata(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctokata_l(     unsigned int _Ch,        _locale_t _Locale);
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-#pragma warning (push)
-#pragma warning(disable: 4127) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern unsigned long  __cdecl __threadid(void);
-
-__declspec(dllimport) extern uintptr_t __cdecl __threadhandle(void);
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template<typename T>
-class AtlLimits;
-
-template<>
-class AtlLimits<int __w64>
-{
-public:
-	static const int _Min=(-2147483647 - 1);
-	static const int _Max=2147483647;
-};
-
-template<>
-class AtlLimits<unsigned int __w64>
-{
-public:
-	static const unsigned int _Min=0;
-	static const unsigned int _Max=0xffffffff;
-};
-
-template<>
-class AtlLimits<long __w64>
-{
-public:
-	static const long _Min=(-2147483647L - 1);
-	static const long _Max=2147483647L;
-};
-
-template<>
-class AtlLimits<unsigned long __w64>
-{
-public:
-	static const unsigned long _Min=0;
-	static const unsigned long _Max=0xffffffffUL;
-};
-
-template<>
-class AtlLimits<long long>
-{
-public:
-	static const long long _Min=(-9223372036854775807i64 - 1);
-	static const long long _Max=9223372036854775807i64;
-};
-
-template<>
-class AtlLimits<unsigned long long>
-{
-public:
-	static const unsigned long long _Min=0;
-	static const unsigned long long _Max=0xffffffffffffffffui64;
-};
-
-
-template<typename T>
-inline HRESULT AtlAdd(T* ptResult, T tLeft, T tRight)
-{
-	if(::ATL::AtlLimits<T>::_Max-tLeft < tRight)
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*ptResult= tLeft + tRight;
-	return ((HRESULT)0x00000000L);
-}
-
-
-template<typename T>
-inline HRESULT AtlMultiply(T* ptResult,	T tLeft, T tRight)
-{
-	
-	if(tLeft==0)
-	{
-		*ptResult=0;
-		return ((HRESULT)0x00000000L);
-	}
-	if(::ATL::AtlLimits<T>::_Max/tLeft < tRight)
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*ptResult= tLeft * tRight;
-	return ((HRESULT)0x00000000L);
-}
-
-
-template<>
-inline HRESULT AtlMultiply(int __w64	*piResult, int __w64	iLeft, int __w64 iRight)
-{
-	__int64 i64Result=static_cast<__int64>(iLeft) * static_cast<__int64>(iRight);
-	if(i64Result>2147483647 || i64Result < (-2147483647 - 1))
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*piResult=static_cast<int __w64>(i64Result);
-	return ((HRESULT)0x00000000L);
-}
-
-template<>
-inline HRESULT AtlMultiply(unsigned int	__w64 *piResult, unsigned int __w64 iLeft, unsigned int __w64 iRight)
-{
-	unsigned __int64 i64Result=static_cast<unsigned __int64>(iLeft) * static_cast<unsigned __int64>(iRight);
-	if(i64Result>0xffffffff)
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*piResult=static_cast<unsigned int __w64>(i64Result);
-	return ((HRESULT)0x00000000L);
-}
-
-template<>
-inline HRESULT AtlMultiply(long	__w64 *piResult, long __w64 iLeft, long __w64 iRight)
-{
-	__int64 i64Result=static_cast<__int64>(iLeft) * static_cast<__int64>(iRight);
-	if(i64Result>2147483647L || i64Result < (-2147483647L - 1))
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*piResult=static_cast<long __w64>(i64Result);
-	return ((HRESULT)0x00000000L);
-}
-
-template<>
-inline HRESULT AtlMultiply(unsigned long __w64 *piResult, unsigned long __w64 iLeft, unsigned long __w64 iRight)
-{
-	unsigned __int64 i64Result=static_cast<unsigned __int64>(iLeft) * static_cast<unsigned __int64>(iRight);
-	if(i64Result>0xffffffffUL)
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*piResult=static_cast<unsigned long __w64>(i64Result);
-	return ((HRESULT)0x00000000L);
-}
-
-template <typename T>
-inline T AtlMultiplyThrow(T tLeft, T tRight)
-{
-	T tResult;
-	HRESULT hr=AtlMultiply(&tResult, tLeft, tRight);
-	if(((HRESULT)(hr) < 0))
-	{
-		ATL::AtlThrowImpl(hr);
-	}
-	return tResult;
-}
-
-template <typename T>
-inline T AtlAddThrow(T tLeft, T	tRight)
-{
-	T tResult;
-	HRESULT hr=AtlAdd(&tResult, tLeft, tRight);
-	if(((HRESULT)(hr) < 0))
-	{
-		ATL::AtlThrowImpl(hr);
-	}
-	return tResult;
-}
-
-inline LPVOID AtlCoTaskMemCAlloc(ULONG nCount, ULONG nSize)
-{
-	HRESULT hr;
-	ULONG nBytes=0;
-	if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, nCount, nSize)) < 0))
-	{
-		return 0;
-	}
-	return ::CoTaskMemAlloc(nBytes);
-}
-
-inline LPVOID AtlCoTaskMemRecalloc(void	*pvMemory, ULONG nCount, ULONG nSize)
-{
-	HRESULT hr;
-	ULONG nBytes=0;
-	if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, nCount, nSize)) < 0))
-	{
-		return 0;
-	}
-	return ::CoTaskMemRealloc(pvMemory, nBytes);
-}
-
-}	
-#pragma pack(pop)
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-namespace Checked
-{
-    void __cdecl memcpy_s(void *s1, size_t s1max, const void *s2, size_t n);
-}
-
-
-
-
-class CCRTAllocator 
-{
-public:
-	static void* Reallocate(void* p, size_t nBytes) throw()
-	{
-		return realloc(p, nBytes);
-	}
-
-	static void* Allocate(size_t nBytes) throw()
-	{
-		return malloc(nBytes);
-	}
-
-	static void Free(void* p) throw()
-	{
-		free(p);
-	}
-};
-
-class CLocalAllocator
-{
-public:
-	static void* Allocate(size_t nBytes) throw()
-	{
-		return ::LocalAlloc(0x0000, nBytes);
-	}
-	static void* Reallocate(void* p, size_t nBytes) throw()
-	{
-		if (p==0){
-			return ( Allocate(nBytes) );
-		
-		}
-		if (nBytes==0){
-			Free(p);
-			return 0;
-		}
-			return ::LocalReAlloc(p, nBytes, 0);
-		 
-	}
-	static void Free(void* p) throw()
-	{
-		::LocalFree(p);
-	}
-};
-
-class CGlobalAllocator
-{
-public:
-	static void* Allocate(size_t nBytes) throw()
-	{
-		return ::GlobalAlloc(0x0000, nBytes);
-	}
-	static void* Reallocate(void* p, size_t nBytes) throw()
-	{
-		if (p==0){
-			return ( Allocate(nBytes) );
-		
-		}
-		if (nBytes==0){
-			Free(p);
-			return 0;
-		}
-		return ( ::GlobalReAlloc(p, nBytes, 0) );
-	}
-	static void Free(void* p) throw()
-	{
-		::GlobalFree(p);
-	}
-};
-
-template <class T, class Allocator = CCRTAllocator>
-class CHeapPtrBase
-{
-protected:
-	CHeapPtrBase() throw() :
-		m_pData(0)
-	{
-	}
-	CHeapPtrBase(CHeapPtrBase<T, Allocator>& p) throw()
-	{
-		m_pData = p.Detach();  
-	}
-	explicit CHeapPtrBase(T* pData) throw() :
-		m_pData(pData)
-	{
-	}
-
-public:
-	~CHeapPtrBase() throw()
-	{
-		Free();
-	}
-
-protected:
-	CHeapPtrBase<T, Allocator>& operator=(CHeapPtrBase<T, Allocator>& p) throw()
-	{
-		if(m_pData != p.m_pData)
-			Attach(p.Detach());  
-		return *this;
-	}
-
-public:
-	operator T*() const throw()
-	{
-		return m_pData;
-	}
-
-	T* operator->() const throw()
-	{
-		(void) ((!!((m_pData != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 342, 0, L"m_pData != 0")) || (__debugbreak(), 0));
-		return m_pData;
-	}
-
-	T** operator&() throw()
-	{
-		do { (void) ((!!((m_pData == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 348, 0, L"m_pData == 0")) || (__debugbreak(), 0)); ; } while(0);
-		return &m_pData;
-	}
-
-	
-	bool AllocateBytes(size_t nBytes) throw()
-	{
-		(void) ((!!((m_pData == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 355, 0, L"m_pData == 0")) || (__debugbreak(), 0));
-		m_pData = static_cast<T*>(Allocator::Allocate(nBytes));
-		if (m_pData == 0)
-			return false;
-
-		return true;
-	}
-
-	
-	void Attach(T* pData) throw()
-	{
-		Allocator::Free(m_pData);
-		m_pData = pData;
-	}
-
-	
-	T* Detach() throw() 
-	{
-		T* pTemp = m_pData;
-		m_pData = 0;
-		return pTemp;
-	}
-
-	
-	void Free() throw()
-	{
-		Allocator::Free(m_pData);
-		m_pData = 0;
-	}
-
-	
-	bool ReallocateBytes(size_t nBytes) throw()
-	{
-		T* pNew;
-
-		pNew = static_cast<T*>(Allocator::Reallocate(m_pData, nBytes));
-		if (pNew == 0)
-			return false;
-		m_pData = pNew;
-
-		return true;
-	}
-
-public:
-	T* m_pData;
-};
-
-template <typename T, class Allocator = CCRTAllocator>
-class CHeapPtr :
-	public CHeapPtrBase<T, Allocator>
-{
-public:
-	CHeapPtr() throw()
-	{
-	}
-	CHeapPtr(CHeapPtr<T, Allocator>& p) throw() :
-		CHeapPtrBase<T, Allocator>(p)
-	{
-	}
-	explicit CHeapPtr(T* p) throw() :
-		CHeapPtrBase<T, Allocator>(p)
-	{
-	}
-
-	CHeapPtr<T, Allocator>& operator=(CHeapPtr<T, Allocator>& p) throw()
-	{
-		CHeapPtrBase<T, Allocator>::operator=(p);
-
-		return *this;
-	}
-
-	
-	bool Allocate(size_t nElements = 1) throw()
-	{
-		size_t nBytes=0;
-		if(((HRESULT)(::ATL::AtlMultiply(&nBytes, nElements, sizeof(T))) < 0))
-		{
-			return false;
-		}
-		return AllocateBytes(nBytes);
-	}
-
-	
-	bool Reallocate(size_t nElements) throw()
-	{
-		size_t nBytes=0;
-		if(((HRESULT)(::ATL::AtlMultiply(&nBytes, nElements, sizeof(T))) < 0))
-		{
-			return false;
-		}
-		return ReallocateBytes(nBytes);
-	}
-};
-
-template< typename T, int t_nFixedBytes = 128, class Allocator = CCRTAllocator >
-class CTempBuffer
-{
-public:
-	CTempBuffer() throw() :
-		m_p( 0 )
-	{
-	}
-	CTempBuffer( size_t nElements ) throw( ... ) :
-		m_p( 0 )
-	{
-		Allocate( nElements );
-	}
-
-	~CTempBuffer() throw()
-	{
-		if( m_p != reinterpret_cast< T* >( m_abFixedBuffer ) )
-		{
-			FreeHeap();
-		}
-	}
-
-	operator T*() const throw()
-	{
-		return( m_p );
-	}
-	T* operator->() const throw()
-	{
-		(void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 477, 0, L"m_p != 0")) || (__debugbreak(), 0));
-		return( m_p );
-	}
-
-	T* Allocate( size_t nElements ) throw( ... )
-	{
-		return( AllocateBytes( ::ATL::AtlMultiplyThrow(nElements,sizeof( T )) ) );
-	}
-
-	T* Reallocate( size_t nElements ) throw( ... )
-	{
-		do { int __atl_condVal=!!(nElements < size_t(-1)/sizeof(T)); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 488, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);		
-		size_t nNewSize = nElements*sizeof( T ) ;
-				
-		if (m_p == 0)
-			return AllocateBytes(nNewSize);
-
-		if (nNewSize > t_nFixedBytes)
-		{
-			if( m_p == reinterpret_cast< T* >( m_abFixedBuffer ) )
-			{
-				
-				AllocateHeap(nNewSize);
-				Checked::memcpy_s(m_p, nNewSize, m_abFixedBuffer, t_nFixedBytes);
-			}
-			else
-			{
-				ReAllocateHeap( nNewSize );
-			}
-		}
-		else
-		{
-			m_p = reinterpret_cast< T* >( m_abFixedBuffer );
-		}
-
-		return m_p;
-	}
-
-	T* AllocateBytes( size_t nBytes )
-	{
-		(void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 517, 0, L"m_p == 0")) || (__debugbreak(), 0));
-		if( nBytes > t_nFixedBytes )
-		{
-			AllocateHeap( nBytes );
-		}
-		else
-		{
-			m_p = reinterpret_cast< T* >( m_abFixedBuffer );
-		}
-
-		return( m_p );
-	}
-
-private:
-	__declspec( noinline ) void AllocateHeap( size_t nBytes )
-	{
-		T* p = static_cast< T* >( Allocator::Allocate( nBytes ) );
-		if( p == 0 )
-		{
-			ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-		}
-		m_p = p;
-	}
- 
-	__declspec( noinline ) void ReAllocateHeap( size_t nNewSize)
-	{
-		T* p = static_cast< T* >( Allocator::Reallocate(m_p, nNewSize) );
-		if ( p == 0 )
-		{
-			ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-		}
-		m_p = p;
-	}
-
-	__declspec( noinline ) void FreeHeap() throw()
-	{
-		Allocator::Free( m_p );
-	}
-
-private:
-	T* m_p;
-	BYTE m_abFixedBuffer[t_nFixedBytes];
-};
-
-
-
-
-namespace _ATL_SAFE_ALLOCA_IMPL
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline bool _AtlVerifyStackAvailable(SIZE_T Size)
-{
-    bool bStackAvailable = true;
-
-    __try
-    {
-		SIZE_T size=0;
-		HRESULT hrAdd=::ATL::AtlAdd(&size, Size, static_cast<SIZE_T>(0x2000));
-		if(((HRESULT)(hrAdd) < 0))
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 589, 0, L"0")) || (__debugbreak(), 0));
-			bStackAvailable = false;
-		}
-		else
-		{
-			PVOID p = _alloca(size);
-			(p);
-		}
-    }
-    __except ((((DWORD )0xC00000FDL) == _exception_code()) ?
-                   1 :
-                   0)
-    {
-        bStackAvailable = false;
-        _resetstkoflw();
-    }
-    return bStackAvailable;
-}
-
-
-
-template < class Allocator>
-class CAtlSafeAllocBufferManager
-{
-private :
-	struct CAtlSafeAllocBufferNode
-	{
-		CAtlSafeAllocBufferNode* m_pNext;
-
-		BYTE _pad[4];
-
-
-
-
-
-
-
-		void* GetData()
-		{
-			return (this + 1);
-		}
-	};
-
-	CAtlSafeAllocBufferNode* m_pHead;
-public :
-	
-	CAtlSafeAllocBufferManager() : m_pHead(0) {};
-	void* Allocate(SIZE_T nRequestedSize)
-	{
-		CAtlSafeAllocBufferNode *p = (CAtlSafeAllocBufferNode*)Allocator::Allocate(::ATL::AtlAddThrow(nRequestedSize, static_cast<SIZE_T>(sizeof(CAtlSafeAllocBufferNode))));
-		if (p == 0)
-			return 0;
-		
-		
-		p->m_pNext = m_pHead;
-		m_pHead = p;
-		
-		return p->GetData();
-	}
-	~CAtlSafeAllocBufferManager()
-	{
-		
-		while (m_pHead != 0)
-		{
-			CAtlSafeAllocBufferNode* p = m_pHead;
-			m_pHead = m_pHead->m_pNext;
-			Allocator::Free(p);
-		}
-	}
-};
-
-}	
-
-}	
- #pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline void* __stdcall InterlockedExchangePointer(void** pp, void* pNew) throw()
-{
-	return( reinterpret_cast<void*>(static_cast<LONG_PTR>(::InterlockedExchange(reinterpret_cast<LONG*>(pp), static_cast<LONG>(reinterpret_cast<LONG_PTR>(pNew))))) );
-}
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-typedef UINT (__stdcall *ATLGETTHREADACP)();
-
-inline UINT __stdcall _AtlGetThreadACPFake() throw()
-{
-	UINT nACP = 0;
-
-	LCID lcidThread = ::GetThreadLocale();
-
-	char szACP[7];
-	
-	
-	
-	if (::GetLocaleInfoA(lcidThread, 0x00001004, szACP, 7) != 0)
-	{
-		char* pch = szACP;
-		while (*pch != '\0')
-		{
-			nACP *= 10;
-			nACP += *pch++ - '0';
-		}
-	}
-	
-	if (nACP == 0)
-		nACP = ::GetACP();
-
-	return nACP;
-}
-
-inline UINT __stdcall _AtlGetThreadACPReal() throw()
-{
-	return( 3 );
-}
-
-extern ATLGETTHREADACP g_pfnGetThreadACP;
-
-inline UINT __stdcall _AtlGetThreadACPThunk() throw()
-{
-	OSVERSIONINFO ver;
-	ATLGETTHREADACP pfnGetThreadACP;
-
-	ver.dwOSVersionInfoSize = sizeof( ver );
-	::GetVersionExW( &ver );
-	if( (ver.dwPlatformId == 2) && (ver.dwMajorVersion >= 5) )
-	{
-		
-		pfnGetThreadACP = _AtlGetThreadACPReal;
-	}
-	else
-	{
-		pfnGetThreadACP = _AtlGetThreadACPFake;
-	}
-	InterlockedExchangePointer( reinterpret_cast< void** >(&g_pfnGetThreadACP), reinterpret_cast< void** >(pfnGetThreadACP) );
-
-	return( g_pfnGetThreadACP() );
-}
-
-inline UINT __stdcall _AtlGetConversionACP() throw()
-{
-	return( g_pfnGetThreadACP() );
-}
-
-
-
-
-
-
-
-
-
-template <class _CharType>
-inline  void AtlConvAllocMemory(              _CharType** ppBuff,     int nLength,       _CharType* pszFixedBuffer,     int nFixedBufferLength)
-{
-	do { int __atl_condVal=!!(ppBuff != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 174, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
-	do { int __atl_condVal=!!(nLength >= 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 175, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
-	do { int __atl_condVal=!!(pszFixedBuffer != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 176, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
-
-	
-	if (*ppBuff != pszFixedBuffer)
-	{
-		if( nLength > nFixedBufferLength )
-		{
-			_CharType* ppReallocBuf = static_cast< _CharType* >( _recalloc(*ppBuff, nLength,sizeof( _CharType ) ) );
-			if (ppReallocBuf == 0) 
-			{
-				ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-			}
-			*ppBuff = ppReallocBuf;
-		} else
-		{
-			free(*ppBuff);
-			*ppBuff=pszFixedBuffer;
-		}
-
-	} else 
-	{
-		if( nLength > nFixedBufferLength )
-		{
-			*ppBuff = static_cast< _CharType* >( calloc(nLength,sizeof( _CharType ) ) );
-		} else
-		{			
-			*ppBuff=pszFixedBuffer;
-		}
-	}
-
-	if (*ppBuff == 0)
-	{
-		ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-	}
-
-}
-
-template <class _CharType>
-inline void AtlConvFreeMemory(_CharType* pBuff,_CharType* pszFixedBuffer,int nFixedBufferLength)
-{
-	(nFixedBufferLength);
-	if( pBuff != pszFixedBuffer )
-	{
-		free( pBuff );
-	} 	
-
-	else
-	{		
-		memset(pszFixedBuffer,0xFD,nFixedBufferLength*sizeof(_CharType));
-	}
-
-
-}
-
-template< int t_nBufferLength = 128 >
-class CW2WEX
-{
-public:
-	CW2WEX(        LPCWSTR psz ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz );
-	}
-	CW2WEX(        LPCWSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		(void)nCodePage;  
-
-		Init( psz );
-	}
-	~CW2WEX() throw()
-	{
-		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
-	}
-
-	operator LPWSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-private:
-	void Init(        LPCWSTR psz ) throw(...)
-	{
-		if (psz == 0)
-		{
-			m_psz = 0;
-			return;
-		}
-		int nLength = lstrlenW( psz )+1;
-		AtlConvAllocMemory(&m_psz,nLength,m_szBuffer,t_nBufferLength);
-		Checked::memcpy_s( m_psz, nLength*sizeof( wchar_t ), psz, nLength*sizeof( wchar_t ));
-	}
-
-public:
-	LPWSTR m_psz;
-	wchar_t m_szBuffer[t_nBufferLength];
-
-private:
-	CW2WEX( const CW2WEX& ) throw();
-	CW2WEX& operator=( const CW2WEX& ) throw();
-};
-typedef CW2WEX<> CW2W;
-
-template< int t_nBufferLength = 128 >
-class CA2AEX
-{
-public:
-	CA2AEX(        LPCSTR psz ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz );
-	}
-	CA2AEX(        LPCSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		(void)nCodePage;  
-
-		Init( psz );
-	}
-	~CA2AEX() throw()
-	{
-		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
-	}
-
-	operator LPSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-private:
-	void Init(        LPCSTR psz ) throw(...)
-	{
-		if (psz == 0)
-		{
-			m_psz = 0;
-			return;
-		}
-		int nLength = lstrlenA( psz )+1;
-		AtlConvAllocMemory(&m_psz,nLength,m_szBuffer,t_nBufferLength);		
-		Checked::memcpy_s( m_psz, nLength*sizeof( char ), psz, nLength*sizeof( char ));
-	}
-
-public:
-	LPSTR m_psz;
-	char m_szBuffer[t_nBufferLength];
-
-private:
-	CA2AEX( const CA2AEX& ) throw();
-	CA2AEX& operator=( const CA2AEX& ) throw();
-};
-typedef CA2AEX<> CA2A;
-
-template< int t_nBufferLength = 128 >
-class CA2CAEX
-{
-public:
-	CA2CAEX(      LPCSTR psz ) throw(...) :
-		m_psz( psz )
-	{
-	}
-	CA2CAEX(      LPCSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( psz )
-	{
-		(void)nCodePage;
-	}
-	~CA2CAEX() throw()
-	{
-	}
-
-	operator LPCSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-public:
-	LPCSTR m_psz;
-
-private:
-	CA2CAEX( const CA2CAEX& ) throw();
-	CA2CAEX& operator=( const CA2CAEX& ) throw();
-};
-typedef CA2CAEX<> CA2CA;
-
-template< int t_nBufferLength = 128 >
-class CW2CWEX
-{
-public:
-	CW2CWEX(      LPCWSTR psz ) throw(...) :
-		m_psz( psz )
-	{
-	}
-	CW2CWEX(      LPCWSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( psz )
-	{
-		(void)nCodePage;
-	}
-	~CW2CWEX() throw()
-	{
-	}
-
-	operator LPCWSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-public:
-	LPCWSTR m_psz;
-
-private:
-	CW2CWEX( const CW2CWEX& ) throw();
-	CW2CWEX& operator=( const CW2CWEX& ) throw();
-};
-typedef CW2CWEX<> CW2CW;
-
-template< int t_nBufferLength = 128 >
-class CA2WEX
-{
-public:
-	CA2WEX(        LPCSTR psz ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz, _AtlGetConversionACP() );
-	}
-	CA2WEX(        LPCSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz, nCodePage );
-	}
-	~CA2WEX() throw()
-	{
-		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
-	}
-
-	operator LPWSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-private:
-	void Init(        LPCSTR psz, UINT nCodePage ) throw(...)
-	{
-		if (psz == 0)
-		{
-			m_psz = 0;
-			return;
-		}
-		int nLengthA = lstrlenA( psz )+1;
-		int nLengthW = nLengthA;
-
-		AtlConvAllocMemory(&m_psz,nLengthW,m_szBuffer,t_nBufferLength);
-
-		BOOL bFailed=(0 == ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, m_psz, nLengthW ) );
-		if (bFailed)
-		{
-			if (GetLastError()==122L)
-			{
-				nLengthW = ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, 0, 0);
-				AtlConvAllocMemory(&m_psz,nLengthW,m_szBuffer,t_nBufferLength);
-				bFailed=(0 == ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, m_psz, nLengthW ) );
-			}			
-		}
-		if (bFailed)
-		{
-			AtlThrowLastWin32();
-		}		
-	}
-
-public:
-	LPWSTR m_psz;
-	wchar_t m_szBuffer[t_nBufferLength];
-
-private:
-	CA2WEX( const CA2WEX& ) throw();
-	CA2WEX& operator=( const CA2WEX& ) throw();
-};
-typedef CA2WEX<> CA2W;
-
-template< int t_nBufferLength = 128 >
-class CW2AEX
-{
-public:
-	CW2AEX(        LPCWSTR psz ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz, _AtlGetConversionACP() );
-	}
-	CW2AEX(        LPCWSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz, nCodePage );
-	}
-	~CW2AEX() throw()
-	{		
-		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
-	}
-
-	operator LPSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-private:
-	void Init(        LPCWSTR psz,      UINT nConvertCodePage ) throw(...)
-	{
-		if (psz == 0)
-		{
-			m_psz = 0;
-			return;
-		}
-		int nLengthW = lstrlenW( psz )+1;		 
-		int nLengthA = nLengthW*4;
-		
-		AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);
-
-		BOOL bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, 0, 0 ));
-		if (bFailed)
-		{
-			if (GetLastError()==122L)
-			{
-				nLengthA = ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, 0, 0, 0, 0 );
-				AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);
-				bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, 0, 0 ));
-			}			
-		}
-		if (bFailed)
-		{
-			AtlThrowLastWin32();
-		}
-	}
-
-public:
-	LPSTR m_psz;
-	char m_szBuffer[t_nBufferLength];
-
-private:
-	CW2AEX( const CW2AEX& ) throw();
-	CW2AEX& operator=( const CW2AEX& ) throw();
-};
-typedef CW2AEX<> CW2A;
-
-
-
-	
-	
-	
-	
-	
-	
-	
-	
-
-	
-	
-	
-	
-	
-	
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-};  
-#pragma pack(pop)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-	
-
-
-
-
-
-
-
-	
-
-
-
-	extern "C" __declspec(dllimport) LPDEVMODEA __stdcall AtlDevModeW2A(LPDEVMODEA lpDevModeA, const DEVMODEW* lpDevModeW);
-
-
-
-
-inline          LPWSTR __stdcall AtlA2WHelper(       LPWSTR lpw,        LPCSTR lpa,      int nChars,      UINT acp) throw()
-{
-	(void) ((!!((lpa != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 596, 0, L"lpa != 0")) || (__debugbreak(), 0));
-	(void) ((!!((lpw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 597, 0, L"lpw != 0")) || (__debugbreak(), 0));
-	if (lpw == 0 || lpa == 0)
-		return 0;
-	
-	
-	
-	lpw[0] = '\0';
-	int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
-	if(ret == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 607, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}		
-	return lpw;
-}
-
-inline          LPSTR __stdcall AtlW2AHelper(       LPSTR lpa,        LPCWSTR lpw,      int nChars,      UINT acp) throw()
-{
-	(void) ((!!((lpw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 615, 0, L"lpw != 0")) || (__debugbreak(), 0));
-	(void) ((!!((lpa != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 616, 0, L"lpa != 0")) || (__debugbreak(), 0));
-	if (lpa == 0 || lpw == 0)
-		return 0;
-	
-	
-	
-	lpa[0] = '\0';
-	int ret = WideCharToMultiByte(acp, 0, lpw, -1, lpa, nChars, 0, 0);
-	if(ret == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 626, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-	return lpa;
-}
-inline          LPWSTR __stdcall AtlA2WHelper(       LPWSTR lpw,        LPCSTR lpa,      int nChars) throw()
-{
-	return AtlA2WHelper(lpw, lpa, nChars, 0);
-}
-
-inline          LPSTR __stdcall AtlW2AHelper(       LPSTR lpa,        LPCWSTR lpw,      int nChars) throw()
-{
-	return AtlW2AHelper(lpa, lpw, nChars, 0);
-}
-
-
-	
-
-
-
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	inline int ocslen(       LPCOLESTR x) throw() { return lstrlenW(x); }
-
-
-	inline bool ocscpy_s(       LPOLESTR dest,      size_t maxSize,        LPCOLESTR src) throw() 
-		{ return 0 == memcpy_s(dest, maxSize*sizeof(WCHAR), src, (ocslen(src)+1)*sizeof(WCHAR)); }
-	inline bool ocscat_s(       LPOLESTR dest,      size_t maxSize,        LPCOLESTR src) throw() 
-		{ return 0 == wcscat_s(dest, maxSize,src); }
-
-
-
-
-
-
-
-
-
-
-
-
-	__declspec(deprecated("ocscpy is not safe. Intead, use ocscpy_s"))
-	inline OLECHAR* ocscpy(     LPOLESTR dest,        LPCOLESTR src) throw()
-	{
-#pragma warning(push)
-#pragma warning(disable:4996)
-		return wcscpy(dest, src);
-#pragma warning(pop)
-	}
-	__declspec(deprecated("ocscat is not safe. Intead, use ocscat_s"))
-	inline OLECHAR* ocscat(     LPOLESTR dest,        LPCOLESTR src) throw()
-	{
-#pragma warning(push)
-#pragma warning(disable:4996)
-		return wcscat(dest, src);
-#pragma warning(pop)
-	}
-
-
-
-
-
-	inline LPCOLESTR T2COLE_EX(       LPCTSTR lp, UINT) { return lp; }
-	inline LPCOLESTR T2COLE_EX_DEF(       LPCTSTR lp) { return lp; }
-	inline LPCTSTR OLE2CT_EX(       LPCOLESTR lp, UINT) { return lp; }
-	inline LPCTSTR OLE2CT_EX_DEF(       LPCOLESTR lp) { return lp; }
-	inline LPOLESTR T2OLE_EX(       LPTSTR lp, UINT) { return lp; }
-	inline LPOLESTR T2OLE_EX_DEF(       LPTSTR lp) { return lp; }
-	inline LPTSTR OLE2T_EX(       LPOLESTR lp, UINT) { return lp; }	
-	inline LPTSTR OLE2T_EX_DEF(       LPOLESTR lp) { return lp; }	
-
-
-
-	inline LPCOLESTR T2COLE(       LPCTSTR lp) { return lp; }
-	inline LPCTSTR OLE2CT(       LPCOLESTR lp) { return lp; }
-	inline LPOLESTR T2OLE(       LPTSTR lp) { return lp; }
-	inline LPTSTR OLE2T(       LPOLESTR lp) { return lp; }
-	inline LPOLESTR CharNextO(     LPCOLESTR lp) throw() {return CharNextW(lp);}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	inline LPOLESTR W2OLE_EX(       LPWSTR lp, UINT) { return lp; }
-	inline LPOLESTR W2OLE_EX_DEF(       LPWSTR lp) { return lp; }
-	inline LPWSTR OLE2W_EX(       LPOLESTR lp, UINT) { return lp; }
-	inline LPWSTR OLE2W_EX_DEF(       LPOLESTR lp) { return lp; }
-	
-	
-	
-	
-	inline LPCOLESTR W2COLE_EX(       LPCWSTR lp, UINT) { return lp; }
-	inline LPCOLESTR W2COLE_EX_DEF(       LPCWSTR lp) { return lp; }
-	inline LPCWSTR OLE2CW_EX(       LPCOLESTR lp, UINT) { return lp; }
-	inline LPCWSTR OLE2CW_EX_DEF(       LPCOLESTR lp) { return lp; }
-	
-	
-	
-	
-
-
-
-	inline LPOLESTR W2OLE(       LPWSTR lp) { return lp; }
-	inline LPWSTR OLE2W(       LPOLESTR lp) { return lp; }
-	
-	
-	inline LPCOLESTR W2COLE(       LPCWSTR lp) { return lp; }
-	inline LPCWSTR OLE2CW(       LPCOLESTR lp) { return lp; }
-	
-	
-	
-
-
-
-
-	
-	
-	
-	
-	inline LPWSTR T2W_EX(       LPTSTR lp, UINT) { return lp; }
-	inline LPWSTR T2W_EX_DEF(       LPTSTR lp) { return lp; }
-	inline LPTSTR W2T_EX(       LPWSTR lp, UINT) { return lp; }
-	inline LPTSTR W2T_DEF(       LPWSTR lp) { return lp; }
-	
-	
-	
-	
-	inline LPCWSTR T2CW_EX(       LPCTSTR lp, UINT) { return lp; }
-	inline LPCWSTR T2CW_EX_DEF(       LPCTSTR lp) { return lp; }
-	inline LPCTSTR W2CT_EX(       LPCWSTR lp, UINT) { return lp; }
-	inline LPCTSTR W2CT_EX_DEF(       LPCWSTR lp) { return lp; }
-
-
-
-	
-	
-	inline LPWSTR T2W(       LPTSTR lp) { return lp; }
-	inline LPTSTR W2T(       LPWSTR lp) { return lp; }
-	
-	
-	inline LPCWSTR T2CW(       LPCTSTR lp) { return lp; }
-	inline LPCTSTR W2CT(       LPCWSTR lp) { return lp; }
-
-
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline  BSTR A2WBSTR(       LPCSTR lp, int nLen = -1)
-{
-	if (lp == 0 || nLen == 0)
-		return 0;
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	BSTR str = 0;
-	int nConvertedLen = MultiByteToWideChar(_acp_ex, 0, lp,
-		nLen, 0, 0);
-	int nAllocLen = nConvertedLen;
-	if (nLen == -1)
-		nAllocLen -= 1;  
-	str = ::SysAllocStringLen(0, nAllocLen);
-
-	if (str != 0)
-	{
-		int nResult;
-		nResult = MultiByteToWideChar(_acp_ex, 0, lp, nLen, str, nConvertedLen);
-		(void) ((!!((nResult == nConvertedLen))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 978, 0, L"nResult == nConvertedLen")) || (__debugbreak(), 0));
-		if(nResult != nConvertedLen)
-		{
-			SysFreeString(str);
-			return 0;
-		}
-
-	}
-	return str;
-}
-
-inline BSTR OLE2BSTR(       LPCOLESTR lp) {return ::SysAllocString(lp);}
-
-
-	inline BSTR T2BSTR_EX(       LPCTSTR lp) {return ::SysAllocString(lp);}
-	inline BSTR A2BSTR_EX(       LPCSTR lp) {return A2WBSTR(lp);}
-	inline BSTR W2BSTR_EX(       LPCWSTR lp) {return ::SysAllocString(lp);}
-
-
-
-	inline BSTR T2BSTR(       LPCTSTR lp) {return ::SysAllocString(lp);}
-	inline BSTR A2BSTR(       LPCSTR lp) {return A2WBSTR(lp);}
-	inline BSTR W2BSTR(       LPCWSTR lp) {return ::SysAllocString(lp);}
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline LPDEVMODEW AtlDevModeA2W(     LPDEVMODEW lpDevModeW,      const DEVMODEA* lpDevModeA)
-{
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	(void) ((!!((lpDevModeW != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1025, 0, L"lpDevModeW != 0")) || (__debugbreak(), 0));
-	if (lpDevModeA == 0 || lpDevModeW == 0)
-	{
-		return 0;
-	}
-
-	AtlA2WHelper(lpDevModeW->dmDeviceName, (LPCSTR)lpDevModeA->dmDeviceName, 32, _acp_ex);
-
-
-	if(0 != memcpy_s(&lpDevModeW->dmSpecVersion, (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmFormName)) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmSpecVersion)),
-		&lpDevModeA->dmSpecVersion, (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmFormName)) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmSpecVersion))))
-	{
-		return 0;
-	}
-
-
-
-
-
-	AtlA2WHelper(lpDevModeW->dmFormName, (LPCSTR)lpDevModeA->dmFormName, 32, _acp_ex);
-
-
-	if(0 != memcpy_s(&lpDevModeW->dmLogPixels, sizeof(DEVMODEW) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmLogPixels)),
-		&lpDevModeA->dmLogPixels, sizeof(DEVMODEW) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmLogPixels))))
-	{
-		return 0;
-	}
-
-
-
-
-
-	if (lpDevModeA->dmDriverExtra != 0)
-	{
-		
-#pragma warning(push)
-#pragma warning(disable:26000)
-
-		if(0 != memcpy_s(lpDevModeW+1, lpDevModeA->dmDriverExtra, lpDevModeA+1, lpDevModeA->dmDriverExtra))
-		{
-			return 0;
-		}
-
-
-
-#pragma warning(pop)
-	}
-	lpDevModeW->dmSize = sizeof(DEVMODEW);
-	return lpDevModeW;
-}
-
-inline LPTEXTMETRICW AtlTextMetricA2W(     LPTEXTMETRICW lptmW,      LPTEXTMETRICA lptmA)
-{
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	(void) ((!!((lptmW != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1079, 0, L"lptmW != 0")) || (__debugbreak(), 0));
-	if (lptmA == 0 || lptmW == 0)
-		return 0;
-
-
-	if(0 != memcpy_s(lptmW, sizeof(LONG) * 11, lptmA, sizeof(LONG) * 11))
-	{
-		return 0;
-	}
-
-
-
-
-
-	if(0 != memcpy_s(&lptmW->tmItalic, sizeof(BYTE) * 5, &lptmA->tmItalic, sizeof(BYTE) * 5))
-	{
-		return 0;
-	}
-
-
-
-
-	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmFirstChar, 1, &lptmW->tmFirstChar, 1) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1103, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-		
-	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmLastChar, 1, &lptmW->tmLastChar, 1) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1109, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-		
-	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmDefaultChar, 1, &lptmW->tmDefaultChar, 1)== 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1115, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-		
-	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmBreakChar, 1, &lptmW->tmBreakChar, 1) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1121, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-	
-	return lptmW;
-}
-
-inline LPTEXTMETRICA AtlTextMetricW2A(     LPTEXTMETRICA lptmA,      LPTEXTMETRICW lptmW)
-{
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	(void) ((!!((lptmA != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1131, 0, L"lptmA != 0")) || (__debugbreak(), 0));
-	if (lptmW == 0 || lptmA == 0)
-	{
-		return 0;
-	}
-
-
-	if(0 != memcpy_s(lptmA, sizeof(LONG) * 11, lptmW, sizeof(LONG) * 11))
-	{
-		return 0;
-	}
-
-
-
-
-
-	if(0 != memcpy_s(&lptmA->tmItalic, sizeof(BYTE) * 5, &lptmW->tmItalic, sizeof(BYTE) * 5))
-	{
-		return 0;
-	}
-
-
-
-	
-	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmFirstChar, 1, (LPSTR)&lptmA->tmFirstChar, 1, 0, 0) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1157, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-
-	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmLastChar, 1, (LPSTR)&lptmA->tmLastChar, 1, 0, 0) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1163, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-
-	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmDefaultChar, 1, (LPSTR)&lptmA->tmDefaultChar, 1, 0, 0) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1169, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-
-	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmBreakChar, 1, (LPSTR)&lptmA->tmBreakChar, 1, 0, 0) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1175, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-
-	return lptmA;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	inline LPDEVMODEW DEVMODEOLE2T_EX(LPDEVMODEW lp) { return lp; }
-	inline LPDEVMODEW DEVMODET2OLE_EX(LPDEVMODEW lp) { return lp; }
-	inline LPTEXTMETRICW TEXTMETRICOLE2T_EX(LPTEXTMETRICW lp) { return lp; }
-	inline LPTEXTMETRICW TEXTMETRICT2OLE_EX(LPTEXTMETRICW lp) { return lp; }
-
-	inline LPDEVMODEW DEVMODEOLE2T(LPDEVMODEW lp) { return lp; }
-	inline LPDEVMODEW DEVMODET2OLE(LPDEVMODEW lp) { return lp; }
-	inline LPTEXTMETRICW TEXTMETRICOLE2T(LPTEXTMETRICW lp) { return lp; }
-	inline LPTEXTMETRICW TEXTMETRICT2OLE(LPTEXTMETRICW lp) { return lp; }
-
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning (pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) FILE * __cdecl __iob_func(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef __int64 fpos_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _filbuf(     FILE * _File );
-__declspec(dllimport)  int __cdecl _flsbuf(     int _Ch,      FILE * _File);
-
-
-
-
-__declspec(dllimport)  FILE * __cdecl _fsopen(       const char * _Filename,        const char * _Mode,      int _ShFlag);
-
-
-__declspec(dllimport) void __cdecl clearerr(     FILE * _File);
-__declspec(dllimport)  errno_t __cdecl clearerr_s(     FILE * _File );
-__declspec(dllimport)  int __cdecl fclose(     FILE * _File);
-__declspec(dllimport)  int __cdecl _fcloseall(void);
-
-
-
-
-__declspec(dllimport)  FILE * __cdecl _fdopen(     int _FileHandle,        const char * _Mode);
-
-
-__declspec(dllimport)  int __cdecl feof(     FILE * _File);
-__declspec(dllimport)  int __cdecl ferror(     FILE * _File);
-__declspec(dllimport)  int __cdecl fflush(       FILE * _File);
-__declspec(dllimport)  int __cdecl fgetc(     FILE * _File);
-__declspec(dllimport)  int __cdecl _fgetchar(void);
-__declspec(dllimport)  int __cdecl fgetpos(     FILE * _File ,      fpos_t * _Pos);
-__declspec(dllimport)  char * __cdecl fgets(       char * _Buf,      int _MaxCount,      FILE * _File);
-
-
-
-
-__declspec(dllimport)  int __cdecl _fileno(     FILE * _File);
-
-
-
-
-
-
-
-__declspec(dllimport)  char * __cdecl _tempnam(         const char * _DirName,          const char * _FilePrefix);
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _flushall(void);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "fopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl fopen(       const char * _Filename,        const char * _Mode);
-
-__declspec(dllimport)  errno_t __cdecl fopen_s(                  FILE ** _File,        const char * _Filename,        const char * _Mode);
-
-__declspec(dllimport)  int __cdecl fprintf(     FILE * _File,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl fprintf_s(     FILE * _File,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl fputc(     int _Ch,      FILE * _File);
-__declspec(dllimport)  int __cdecl _fputchar(     int _Ch);
-__declspec(dllimport)  int __cdecl fputs(       const char * _Str,      FILE * _File);
-__declspec(dllimport)  size_t __cdecl fread(     void * _DstBuf,      size_t _ElementSize,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  size_t __cdecl fread_s(     void * _DstBuf,      size_t _DstSize,      size_t _ElementSize,      size_t _Count,      FILE * _File);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "freopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl freopen(       const char * _Filename,        const char * _Mode,      FILE * _File);
-
-__declspec(dllimport)  errno_t __cdecl freopen_s(                  FILE ** _File,        const char * _Filename,        const char * _Mode,      FILE * _OldFile);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "fscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl fscanf(     FILE * _File,         const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_fscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _fscanf_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl fscanf_s(     FILE * _File,         const char * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _fscanf_s_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl fsetpos(     FILE * _File,      const fpos_t * _Pos);
-__declspec(dllimport)  int __cdecl fseek(     FILE * _File,      long _Offset,      int _Origin);
-__declspec(dllimport)  long __cdecl ftell(     FILE * _File);
-
-__declspec(dllimport)  int __cdecl _fseeki64(     FILE * _File,      __int64 _Offset,      int _Origin);
-__declspec(dllimport)  __int64 __cdecl _ftelli64(     FILE * _File);
-
-__declspec(dllimport)  size_t __cdecl fwrite(       const void * _Str,      size_t _Size,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  int __cdecl getc(     FILE * _File);
-__declspec(dllimport)  int __cdecl getchar(void);
-__declspec(dllimport)  int __cdecl _getmaxstdio(void);
-
-__declspec(dllimport) char * __cdecl gets_s(       char * _Buf,      rsize_t _Size);
-
-extern "C++" { template <size_t _Size> inline char * __cdecl gets_s(     char (&_Buffer)[_Size]) { return gets_s(_Buffer, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "gets_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl gets( char *_Buffer);
- int __cdecl _getw(     FILE * _File);
-
-
-
-
-__declspec(dllimport)  int __cdecl _pclose(     FILE * _File);
-__declspec(dllimport)  FILE * __cdecl _popen(       const char * _Command,        const char * _Mode);
-__declspec(dllimport)  int __cdecl printf(        const char * _Format, ...);
-__declspec(dllimport)  int __cdecl printf_s(        const char * _Format, ...);
-__declspec(dllimport)  int __cdecl putc(     int _Ch,      FILE * _File);
-__declspec(dllimport)  int __cdecl putchar(     int _Ch);
-__declspec(dllimport)  int __cdecl puts(       const char * _Str);
-__declspec(dllimport)  int __cdecl _putw(     int _Word,      FILE * _File);
-
-
-__declspec(dllimport)  int __cdecl remove(       const char * _Filename);
-__declspec(dllimport)  int __cdecl rename(       const char * _OldFilename,        const char * _NewFilename);
-__declspec(dllimport)  int __cdecl _unlink(       const char * _Filename);
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_unlink" ". See online help for details.")) __declspec(dllimport)  int __cdecl unlink(       const char * _Filename);
-
-
-__declspec(dllimport) void __cdecl rewind(     FILE * _File);
-__declspec(dllimport)  int __cdecl _rmtmp(void);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "scanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl scanf(        const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_scanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _scanf_l(        const char * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl scanf_s(        const char * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _scanf_s_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "setvbuf" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl setbuf(     FILE * _File,              char * _Buffer);
-__declspec(dllimport)  int __cdecl _setmaxstdio(     int _Max);
-__declspec(dllimport)  unsigned int __cdecl _set_output_format(     unsigned int _Format);
-__declspec(dllimport)  unsigned int __cdecl _get_output_format(void);
-__declspec(dllimport)  int __cdecl setvbuf(     FILE * _File,          char * _Buf,      int _Mode,      size_t _Size);
-__declspec(dllimport)  int __cdecl _snprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, ...);
-extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl _snprintf_s(     char (&_Dest)[_Size],      size_t _Size,         const char * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return _vsnprintf_s(_Dest, _Size, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
-__declspec(dllimport)  int __cdecl sprintf_s(       char * _DstBuf,      size_t _DstSize,         const char * _Format, ...);
-extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl sprintf_s(     char (&_Dest)[_Size],         const char * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return vsprintf_s(_Dest, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
-__declspec(dllimport)  int __cdecl _scprintf(        const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "sscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl sscanf(       const char * _Src,         const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_sscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _sscanf_l(       const char * _Src,         const char * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl sscanf_s(       const char * _Src,         const char * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _sscanf_s_l(       const char * _Src,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snscanf(         const char * _Src,      size_t _MaxCount,         const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snscanf_l(         const char * _Src,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snscanf_s(         const char * _Src,      size_t _MaxCount,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _snscanf_s_l(         const char * _Src,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "tmpfile_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl tmpfile(void);
-
-__declspec(dllimport)  errno_t __cdecl tmpfile_s(                FILE ** _File);
-__declspec(dllimport)  errno_t __cdecl tmpnam_s(       char * _Buf,      rsize_t _Size);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl tmpnam_s(       char (&_Buf)[_Size]) { return tmpnam_s(_Buf, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "tmpnam_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl tmpnam( char *_Buffer);
-__declspec(dllimport)  int __cdecl ungetc(     int _Ch,      FILE * _File);
-__declspec(dllimport)  int __cdecl vfprintf(     FILE * _File,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vfprintf_s(     FILE * _File,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vprintf(        const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vprintf_s(        const char * _Format, va_list _ArgList);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "vsnprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl vsnprintf(     char * _DstBuf,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vsnprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsnprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-extern "C++" { template <size_t _Size> inline int __cdecl _vsnprintf_s(     char (&_Dest)[_Size],      size_t _Size,         const char * _Format, va_list _Args) { return _vsnprintf_s(_Dest, _Size, _Size, _Format, _Args); } }
-#pragma warning(push)
-#pragma warning(disable:4793)
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _snprintf(     char *_Dest,      size_t _Count,         const char * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _vsnprintf(     char *_Dest,      size_t _Count,         const char * _Format, va_list _Args);
-#pragma warning(pop)
-__declspec(dllimport) int __cdecl vsprintf_s(       char * _DstBuf,      size_t _Size,         const char * _Format, va_list _ArgList);
-extern "C++" { template <size_t _Size> inline int __cdecl vsprintf_s(     char (&_Dest)[_Size],         const char * _Format, va_list _Args) { return vsprintf_s(_Dest, _Size, _Format, _Args); } }
-#pragma warning(push)
-#pragma warning(disable:4793)
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "sprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl sprintf( char *_Dest,  const char * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "vsprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl vsprintf( char *_Dest,  const char * _Format, va_list _Args);
-#pragma warning(pop)
-__declspec(dllimport)  int __cdecl _vscprintf(        const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _snprintf_c(     char * _DstBuf,      size_t _MaxCount,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _vsnprintf_c(     char *_DstBuf,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _fprintf_p(     FILE * _File,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _printf_p(        const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _sprintf_p(       char * _Dst,      size_t _MaxCount,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _vfprintf_p(     FILE * _File,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vprintf_p(        const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsprintf_p(       char * _Dst,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _scprintf_p(        const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _vscprintf_p(        const char * _Format, va_list _ArgList);
-__declspec(dllimport) int __cdecl _set_printf_count_output(     int _Value);
-__declspec(dllimport) int __cdecl _get_printf_count_output();
-
-__declspec(dllimport)  int __cdecl _printf_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _printf_p_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _printf_s_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vprintf_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vprintf_p_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vprintf_s_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _fprintf_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _fprintf_p_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _fprintf_s_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vfprintf_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vfprintf_p_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vfprintf_s_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_sprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _sprintf_l(     char * _DstBuf,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _sprintf_p_l(       char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _sprintf_s_l(       char * _DstBuf,      size_t _DstSize,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsprintf_l(     char * _DstBuf,        const char * _Format,        _locale_t, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsprintf_p_l(       char * _DstBuf,      size_t _MaxCount,         const char* _Format,        _locale_t _Locale,  va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsprintf_s_l(       char * _DstBuf,      size_t _DstSize,         const char * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _scprintf_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _scprintf_p_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vscprintf_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vscprintf_p_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snprintf_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snprintf_c_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snprintf_s_l(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsnprintf_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsnprintf_c_l(     char * _DstBuf,      size_t _MaxCount, const char *,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsnprintf_s_l(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char* _Format,       _locale_t _Locale, va_list _ArgList);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) void __cdecl _lock_file(     FILE * _File);
-__declspec(dllimport) void __cdecl _unlock_file(     FILE * _File);
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _fclose_nolock(     FILE * _File);
-__declspec(dllimport)  int __cdecl _fflush_nolock(       FILE * _File);
-__declspec(dllimport)  size_t __cdecl _fread_nolock(     void * _DstBuf,      size_t _ElementSize,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  size_t __cdecl _fread_nolock_s(     void * _DstBuf,      size_t _DstSize,      size_t _ElementSize,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  int __cdecl _fseek_nolock(     FILE * _File,      long _Offset,      int _Origin);
-__declspec(dllimport)  long __cdecl _ftell_nolock(     FILE * _File);
-__declspec(dllimport)  int __cdecl _fseeki64_nolock(     FILE * _File,      __int64 _Offset,      int _Origin);
-__declspec(dllimport)  __int64 __cdecl _ftelli64_nolock(     FILE * _File);
-__declspec(dllimport)  size_t __cdecl _fwrite_nolock(       const void * _DstBuf,      size_t _Size,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  int __cdecl _ungetc_nolock(     int _Ch,      FILE * _File);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_tempnam" ". See online help for details.")) __declspec(dllimport) char * __cdecl tempnam(         const char * _Directory,          const char * _FilePrefix);
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fcloseall" ". See online help for details.")) __declspec(dllimport)  int __cdecl fcloseall(void);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fdopen" ". See online help for details.")) __declspec(dllimport)  FILE * __cdecl fdopen(     int _FileHandle,         const char * _Format);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fgetchar" ". See online help for details.")) __declspec(dllimport)  int __cdecl fgetchar(void);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fileno" ". See online help for details.")) __declspec(dllimport)  int __cdecl fileno(     FILE * _File);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_flushall" ". See online help for details.")) __declspec(dllimport)  int __cdecl flushall(void);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fputchar" ". See online help for details.")) __declspec(dllimport)  int __cdecl fputchar(     int _Ch);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_getw" ". See online help for details.")) __declspec(dllimport)  int __cdecl getw(     FILE * _File);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_putw" ". See online help for details.")) __declspec(dllimport)  int __cdecl putw(     int _Ch,      FILE * _File);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_rmtmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl rmtmp(void);
-
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-extern "C" {
-
-
-
-typedef enum ATLTRACESTATUS
-{
-	ATLTRACESTATUS_INHERIT, ATLTRACESTATUS_ENABLED, ATLTRACESTATUS_DISABLED
-} ATLTRACESTATUS;
-
-DWORD_PTR __stdcall AtlTraceOpenProcess( DWORD idProcess );
-void __stdcall AtlTraceCloseProcess( DWORD_PTR dwProcess );
-void __stdcall AtlTraceSnapshotProcess( DWORD_PTR dwProcess );
-
-DWORD_PTR __stdcall AtlTraceRegister(HINSTANCE hInst,
-	int (__cdecl *fnCrtDbgReport)(int,const char *,int,const char *,const char *,...));
-BOOL __stdcall AtlTraceUnregister(DWORD_PTR dwModule);
-
-DWORD_PTR __stdcall AtlTraceRegisterCategoryA(DWORD_PTR dwModule, const CHAR szCategoryName[64]);
-DWORD_PTR __stdcall AtlTraceRegisterCategoryU(DWORD_PTR dwModule, const WCHAR szCategoryName[64]);
-
-BOOL __stdcall AtlTraceModifyProcess(DWORD_PTR dwProcess, UINT nLevel, BOOL bEnabled, BOOL bFuncAndCategoryNames, BOOL bFileNameAndLineNo);
-BOOL __stdcall AtlTraceModifyModule(DWORD_PTR dwProcess, DWORD_PTR dwModule, UINT nLevel, ATLTRACESTATUS eStatus);
-BOOL __stdcall AtlTraceModifyCategory(DWORD_PTR dwProcess, DWORD_PTR dwCategory, UINT nLevel, ATLTRACESTATUS eStatus);
-BOOL __stdcall AtlTraceGetProcess(DWORD_PTR dwProcess, UINT *pnLevel, BOOL *pbEnabled, BOOL *pbFuncAndCategoryNames, BOOL *pbFileNameAndLineNo);
-BOOL __stdcall AtlTraceGetModule(DWORD_PTR dwProcess, DWORD_PTR dwModule, UINT *pnLevel, ATLTRACESTATUS *pStatus);
-BOOL __stdcall AtlTraceGetCategory(DWORD_PTR dwProcess, DWORD_PTR dwCategory, UINT *pnLevel, ATLTRACESTATUS *pStatus);
-
-__declspec(deprecated("AtlTraceGetUpdateEventNameA is unsafe. Instead use AtlTraceGetUpdateEventNameA_s")) 
-void __stdcall AtlTraceGetUpdateEventNameA(     CHAR *pszEventName);
-__declspec(deprecated("AtlTraceGetUpdateEventNameU is unsafe. Instead use AtlTraceGetUpdateEventNameU_s")) 
-void __stdcall AtlTraceGetUpdateEventNameU(     WCHAR *pszEventName);
-
-void __stdcall AtlTraceGetUpdateEventNameA_s(       CHAR *pszEventName,      size_t cchEventName);
-void __stdcall AtlTraceGetUpdateEventNameU_s(       WCHAR *pszEventName,      size_t cchEventName);
-
-void __cdecl AtlTraceVA(DWORD_PTR dwModule, const char *pszFileName, int nLineNo,
-						DWORD_PTR dwCategory, UINT nLevel, const CHAR *pszFormat, va_list ptr);
-void __cdecl AtlTraceVU(DWORD_PTR dwModule,const char *pszFileName, int nLineNo,
-						DWORD_PTR dwCategory, UINT nLevel, const WCHAR *pszFormat, va_list ptr);
-
-BOOL __stdcall AtlTraceLoadSettingsA(const CHAR *pszFileName, DWORD_PTR dwProcess = 0);
-BOOL __stdcall AtlTraceLoadSettingsU(const WCHAR *pszFileName, DWORD_PTR dwProcess = 0);
-BOOL __stdcall AtlTraceSaveSettingsA(const CHAR *pszFileName, DWORD_PTR dwProcess = 0);
-BOOL __stdcall AtlTraceSaveSettingsU(const WCHAR *pszFileName, DWORD_PTR dwProcess = 0);
-
-typedef struct ATLTRACESETTINGS
-{
-	UINT nLevel;
-	ATLTRACESTATUS eStatus;
-} ATLTRACESETTINGS;
-
-typedef struct ATLTRACEPROCESSSETTINGS
-{
-	UINT nLevel;
-	BOOL bEnabled, bFuncAndCategoryNames, bFileNameAndLineNo;
-} ATLTRACEPROCESSSETTINGS;
-
-typedef struct ATLTRACEPROCESSINFO
-{
-	WCHAR szName[64], szPath[260];
-	DWORD dwId;
-	ATLTRACEPROCESSSETTINGS settings;
-	int nModules;
-} ATLTRACEPROCESSINFO;
-
-typedef struct ATLTRACEMODULEINFO
-{
-	WCHAR szName[64], szPath[260];
-	ATLTRACESETTINGS settings;
-	DWORD_PTR dwModule;
-	int nCategories;
-} ATLTRACEMODULEINFO;
-
-typedef struct ATLTRACECATEGORYINFO
-{
-	WCHAR szName[64];
-	ATLTRACESETTINGS settings;
-	DWORD_PTR dwCategory;
-} ATLTRACECATEGORYINFO;
-
-BOOL __stdcall AtlTraceGetProcessInfo(DWORD_PTR dwProcess, ATLTRACEPROCESSINFO* pProcessInfo);
-void __stdcall AtlTraceGetModuleInfo(DWORD_PTR dwProcess, int iModule, ATLTRACEMODULEINFO* pModuleInfo);
-void __stdcall AtlTraceGetCategoryInfo(DWORD_PTR dwProcess, DWORD_PTR dwModule, int iCategory, ATLTRACECATEGORYINFO* pAtlTraceCategoryInfo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-};
-
-};  
-#pragma pack(pop)
-
-
-
-
-
-extern "C" IMAGE_DOS_HEADER __ImageBase;
-
- 
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-class CTraceCategory
-{
-public:
-	explicit CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel = 0 ) throw();
-
-
-	UINT GetLevel() const throw();
-	void SetLevel( UINT nLevel ) throw();
-	ATLTRACESTATUS GetStatus() const throw();
-	void SetStatus( ATLTRACESTATUS eStatus) throw();
-
-
-	operator DWORD_PTR() const throw();
-
-public:
-
-	DWORD_PTR m_dwCategory;
-
-};
-
-
-
-class CTrace
-{
-public:
-	typedef int (__cdecl *fnCrtDbgReport_t)(int,const char *,int,const char *,const char *,...);
-
-private:
-	CTrace(
-
-
-
-		fnCrtDbgReport_t pfnCrtDbgReport = _CrtDbgReport)
-
-		: m_hInst(reinterpret_cast<HINSTANCE>(&__ImageBase)),
-			m_dwModule( 0 )
-	{
-		m_dwModule = AtlTraceRegister(m_hInst, pfnCrtDbgReport);
-	}
-
-	~CTrace()
-	{
-		AtlTraceUnregister(m_dwModule);
-	}
-
-public:
-	bool ChangeCategory(DWORD_PTR dwCategory, UINT nLevel, ATLTRACESTATUS eStatus)
-	{
-		return 0 !=
-			AtlTraceModifyCategory(0, dwCategory, nLevel, eStatus);
-	}
-
-	bool GetCategory(DWORD_PTR dwCategory, UINT *pnLevel, ATLTRACESTATUS *peStatus)
-	{
-		(void) ((!!((pnLevel && peStatus))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atltrace.h", 90, 0, L"pnLevel && peStatus")) || (__debugbreak(), 0));
-		return 0 != AtlTraceGetCategory(0, dwCategory, pnLevel, peStatus);
-	}
-	UINT GetLevel()
-	{
-		ATLTRACESTATUS eStatus;
-		UINT nLevel;
-		AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus);
-
-		return nLevel;
-	}
-	void SetLevel(UINT nLevel)
-	{
-		AtlTraceModifyModule(0, m_dwModule, nLevel, ATLTRACESTATUS_ENABLED);
-	}
-	ATLTRACESTATUS GetStatus()
-	{
-		ATLTRACESTATUS eStatus;
-		UINT nLevel;
-		AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus);
-
-		return eStatus;
-	}
-	void SetStatus(ATLTRACESTATUS eStatus)
-	{
-		ATLTRACESTATUS eOldStatus;
-		UINT nLevel;
-		AtlTraceGetModule(0, m_dwModule, &nLevel, &eOldStatus);
-		AtlTraceModifyModule(0, m_dwModule, nLevel, eStatus);
-	}
-	void __cdecl TraceV(const char *pszFileName, int nLine,
-		DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const;
-	void __cdecl TraceV(const char *pszFileName, int nLine,
-		DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const;
-
-	DWORD_PTR RegisterCategory(LPCSTR pszCategory)
-		{return(AtlTraceRegisterCategoryA(m_dwModule, pszCategory));}
-
-	DWORD_PTR RegisterCategory(LPCWSTR pszCategory)
-		{return(AtlTraceRegisterCategoryU(m_dwModule, pszCategory));}
-
-
-	bool LoadSettings(LPCTSTR pszFileName = 0) const
-		{return 0 != AtlTraceLoadSettingsU(pszFileName);}
-	void SaveSettings(LPCTSTR pszFileName = 0) const
-		{AtlTraceSaveSettingsU(pszFileName);}
-
-public:
-	static CTrace s_trace;
-
-protected:
-	HINSTANCE m_hInst;
-	DWORD_PTR m_dwModule;
-};
-
-    inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine,
-		DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const
-	{
-		AtlTraceVA(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
-	}
-	inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine,
-		DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const
-	{
-		AtlTraceVU(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
-	}
-
-extern CTraceCategory atlTraceGeneral;
-
-class CTraceFileAndLineInfo
-{
-public:
-	CTraceFileAndLineInfo(const char *pszFileName, int nLineNo)
-		: m_pszFileName(pszFileName), m_nLineNo(nLineNo)
-	{}
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const char *pszFmt, ...) const
-	{
-		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
-		( ptr = (va_list)0 );
-	}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const wchar_t *pszFmt, ...) const
-	{
-		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
-		( ptr = (va_list)0 );
-	}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl operator()(const char *pszFmt, ...) const
-	{
-		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr);
-		( ptr = (va_list)0 );
-	}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl operator()(const wchar_t *pszFmt, ...) const
-	{
-		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr);
-		( ptr = (va_list)0 );
-	}
-#pragma warning(pop)
-
-private:
-	
-	CTraceFileAndLineInfo &__cdecl operator=(const CTraceFileAndLineInfo &right);
-
-	const char *const m_pszFileName;
-	const int m_nLineNo;
-};
-
-
-
-
-
-inline CTraceCategory::CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel ) throw() :
-	m_dwCategory( 0 )
-{
-	m_dwCategory = ATL::CTrace::s_trace.RegisterCategory( pszCategoryName );
-	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nStartingLevel, ATLTRACESTATUS_INHERIT);
-}
-
-inline CTraceCategory::operator DWORD_PTR() const throw()
-{
-	return( m_dwCategory );
-}
-
-inline UINT CTraceCategory::GetLevel() const throw()
-{
-	UINT nLevel;
-	ATLTRACESTATUS eStatus;
-	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus );
-
-	return( nLevel );
-}
-
-inline void CTraceCategory::SetLevel( UINT nLevel ) throw()
-{
-	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, ATLTRACESTATUS_ENABLED );
-}
-
-inline ATLTRACESTATUS CTraceCategory::GetStatus() const throw()
-{
-	UINT nLevel;
-	ATLTRACESTATUS eStatus;
-	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus );
-
-	return( eStatus );
-}
-
-inline void CTraceCategory::SetStatus( ATLTRACESTATUS eStatus ) throw()
-{
-	UINT nLevel;
-	ATLTRACESTATUS eOldStatus;
-	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eOldStatus );
-	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, eStatus );
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}  
- 
-namespace ATL
-{
-
-
-
-
-
-
-
-extern ATL::CTraceCategory atlTraceGeneral;
-extern ATL::CTraceCategory atlTraceCOM;  
-extern ATL::CTraceCategory atlTraceQI;	
-extern ATL::CTraceCategory atlTraceRegistrar;
-extern ATL::CTraceCategory atlTraceRefcount;
-extern ATL::CTraceCategory atlTraceWindowing;
-extern ATL::CTraceCategory atlTraceControls;
-extern ATL::CTraceCategory atlTraceHosting; 
-extern ATL::CTraceCategory atlTraceDBClient;  
-extern ATL::CTraceCategory atlTraceDBProvider;
-extern ATL::CTraceCategory atlTraceSnapin;
-extern ATL::CTraceCategory atlTraceNotImpl;   
-extern ATL::CTraceCategory atlTraceAllocation;
-extern ATL::CTraceCategory atlTraceException;
-extern ATL::CTraceCategory atlTraceTime;
-extern ATL::CTraceCategory atlTraceCache;		
-extern ATL::CTraceCategory atlTraceStencil;
-extern ATL::CTraceCategory atlTraceString;
-extern ATL::CTraceCategory atlTraceMap;	
-extern ATL::CTraceCategory atlTraceUtil;		
-extern ATL::CTraceCategory atlTraceSecurity;
-extern ATL::CTraceCategory atlTraceSync;
-extern ATL::CTraceCategory atlTraceISAPI;		
-
-
-extern ATL::CTraceCategory atlTraceUser;
-extern ATL::CTraceCategory atlTraceUser2;
-extern ATL::CTraceCategory atlTraceUser3;
-extern ATL::CTraceCategory atlTraceUser4;
-
-#pragma deprecated( atlTraceUser )
-#pragma deprecated( atlTraceUser2 )
-#pragma deprecated( atlTraceUser3 )
-#pragma deprecated( atlTraceUser4 )
-
-
-
-
-class CNoUIAssertHook
-{
-public:
-	CNoUIAssertHook()
-	{
-		(void) ((!!((s_pfnPrevHook == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atltrace.h", 329, 0, L"s_pfnPrevHook == 0")) || (__debugbreak(), 0));
-		s_pfnPrevHook = _CrtSetReportHook(CrtHookProc);
-	}
-	~CNoUIAssertHook()
-	{
-		_CrtSetReportHook(s_pfnPrevHook);
-		s_pfnPrevHook = 0;
-	}
-
-private:
-	static int __cdecl CrtHookProc(     int eReportType,        char* pszMessage,      int* pnRetVal)
-	{
-		
-		if (eReportType == 2)
-		{
-			::OutputDebugStringA( "ASSERTION FAILED\n" );
-			::OutputDebugStringA( pszMessage );
-			
-			if (pnRetVal != 0)
-			{
-				*pnRetVal = 1;
-			}
-			return 1;
-		}
-
-		if (s_pfnPrevHook != 0)
-		{
-			return s_pfnPrevHook(eReportType, pszMessage, pnRetVal);
-		}
-		else
-		{
-			return 0;
-		}
-	}
-
-private:
-	static _CRT_REPORT_HOOK s_pfnPrevHook;
-};
-
-__declspec( selectany ) _CRT_REPORT_HOOK CNoUIAssertHook::s_pfnPrevHook = 0;
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-inline void __cdecl AtlTraceU(LPCSTR pszFormat, ...)
-{
-	va_list ptr;
-	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	ATL::CTrace::s_trace.TraceV(0, -1, atlTraceGeneral, 0, pszFormat, ptr);
-	( ptr = (va_list)0 );
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-inline void __cdecl AtlTraceU(LPCWSTR pszFormat, ...)
-{
-	va_list ptr;
-	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	ATL::CTrace::s_trace.TraceV(0, -1, atlTraceGeneral, 0, pszFormat, ptr);
-	( ptr = (va_list)0 );
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFormat, ...)
-{
-	va_list ptr;
-	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	ATL::CTrace::s_trace.TraceV(0, -1, dwCategory, nLevel, pszFormat, ptr);
-	( ptr = (va_list)0 );
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFormat, ...)
-{
-	va_list ptr;
-	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	ATL::CTrace::s_trace.TraceV(0, -1, dwCategory, nLevel, pszFormat, ptr);
-	( ptr = (va_list)0 );
-}
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-};  
-#pragma pack(pop)
-
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-
-inline void __declspec(noreturn) _AtlRaiseException( DWORD dwExceptionCode, DWORD dwExceptionFlags = 0x1 )
-{
-	RaiseException( dwExceptionCode, dwExceptionFlags, 0, 0 );
-}
-
-class CAtlException
-{
-public:
-	CAtlException() throw() :
-		m_hr( ((HRESULT)0x80004005L) )
-	{
-	}
-
-	CAtlException( HRESULT hr ) throw() :
-		m_hr( hr )
-	{
-	}
-
-	operator HRESULT() const throw()
-	{
-		return( m_hr );
-	}
-
-public:
-	HRESULT m_hr;
-};
-
-
-
-
-
-
-
-
-
-__declspec( noinline ) __declspec(noreturn) inline void __stdcall AtlThrowImpl( HRESULT hr )
-{
-	ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlexcept.h", 64)(atlTraceException, 0, L"AtlThrow: hr = 0x%x\n", hr );
-
-
-
-
-
-
-
-
-
-
-	throw CAtlException( hr );
-
-};
-
-
-
-__declspec( noinline ) __declspec(noreturn) inline void __stdcall AtlThrowLastWin32()
-{
-	DWORD dwError = ::GetLastError();
-	ATL::AtlThrowImpl( ((HRESULT)(dwError) <= 0 ? ((HRESULT)(dwError)) : ((HRESULT) (((dwError) & 0x0000FFFF) | (7 << 16) | 0x80000000))) );
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-};  
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-inline errno_t AtlCrtErrorCheck(errno_t nError)
-{
-	switch(nError)
-	{
-	case 12:
-		ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-		break;
-	case 22:
-	case 34:
-		ATL::AtlThrowImpl(((HRESULT)0x80070057L));
-		break;
-	case 0:
-	case 80:
-		break;
-	default:
-		ATL::AtlThrowImpl(((HRESULT)0x80004005L));
-		break;
-	}
-	return nError;
-}
-
-
-
-
-namespace Checked
-{
-
-
-
-
-
-
-
-
-
-inline void __cdecl memcpy_s(        void *_S1,      size_t _S1max,        const void *_S2,      size_t _N)
-{
-	AtlCrtErrorCheck(::memcpy_s(_S1, _S1max, _S2, _N));
-}
-
-inline void __cdecl wmemcpy_s(       wchar_t *_S1,      size_t _N1,        const wchar_t *_S2,      size_t _N)
-{
-	AtlCrtErrorCheck(::wmemcpy_s(_S1, _N1, _S2, _N));
-}
-
-inline void __cdecl memmove_s(       void *_S1,      size_t _S1max,        const void *_S2, size_t _N)
-{
-	AtlCrtErrorCheck(::memmove_s(_S1, _S1max, _S2, _N));
-}
-
-inline void __cdecl strcpy_s(     char *_S1,      size_t _S1max,        const char *_S2)
-{
-	AtlCrtErrorCheck(::strcpy_s(_S1, _S1max, _S2));
-}
-
-inline void __cdecl wcscpy_s(     wchar_t *_S1,      size_t _S1max,        const wchar_t *_S2)
-{
-	AtlCrtErrorCheck(::wcscpy_s(_S1, _S1max, _S2));
-}
-
-inline void __cdecl tcscpy_s(     TCHAR * _Dst,      size_t _SizeInChars,        const TCHAR * _Src)
-{
-
-	AtlCrtErrorCheck(::wcscpy_s(_Dst, _SizeInChars, _Src));
-
-
-
-
-
-
-
-}
-
-inline errno_t __cdecl strncpy_s(     char *_Dest,      size_t _SizeInChars,        const char *_Source,      size_t _Count)
-{
-	return AtlCrtErrorCheck(::strncpy_s(_Dest, _SizeInChars, _Source,_Count));	
-}
-
-inline errno_t __cdecl wcsncpy_s(     wchar_t *_Dest,      size_t _SizeInChars,        const wchar_t *_Source,      size_t _Count)
-{
-	return AtlCrtErrorCheck(::wcsncpy_s(_Dest, _SizeInChars, _Source,_Count));	
-}
-
-inline errno_t __cdecl tcsncpy_s(     TCHAR *_Dest,      size_t _SizeInChars,        const TCHAR *_Source,      size_t _Count)
-{
-
-	return AtlCrtErrorCheck(::wcsncpy_s(_Dest, _SizeInChars, _Source,_Count));	
-
-
-
-
-
-
-
-}
-
-inline void __cdecl strcat_s(           char * _Dst,      size_t _SizeInChars,        const char * _Src)
-{
-	AtlCrtErrorCheck(::strcat_s(_Dst, _SizeInChars, _Src));
-}
-
-inline void __cdecl wcscat_s(           wchar_t * _Dst,      size_t _SizeInChars,        const wchar_t * _Src)
-{
-	AtlCrtErrorCheck(::wcscat_s(_Dst, _SizeInChars, _Src));
-}
-
-inline void __cdecl tcscat_s(           TCHAR * _Dst,      size_t _SizeInChars,        const TCHAR * _Src)
-{
-
-	AtlCrtErrorCheck(::wcscat_s(_Dst, _SizeInChars, _Src));
-
-
-
-
-
-
-
-}
-
-inline void __cdecl strlwr_s(           char * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_strlwr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl wcslwr_s(           wchar_t * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_wcslwr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl mbslwr_s(           unsigned char * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_mbslwr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl tcslwr_s(           TCHAR * _Str,      size_t _SizeInChars)
-{
-
-	AtlCrtErrorCheck(::_wcslwr_s(_Str, _SizeInChars));	
-
-
-
-
-
-
-
-}
-
-inline void __cdecl strupr_s(           char * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_strupr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl wcsupr_s(           wchar_t * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_wcsupr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl mbsupr_s(           unsigned char * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_mbsupr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl tcsupr_s(           TCHAR * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_wcsupr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl itoa_s(     int _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_itoa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl itot_s(     int _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_itow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ltoa_s(     long _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ltoa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ltot_s(     long _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ltow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ultoa_s(     unsigned long _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ultoa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ultow_s(     unsigned long _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ultow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ultot_s(     unsigned long _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ultow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl i64toa_s(     __int64 _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_i64toa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl i64tow_s(     __int64 _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_i64tow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ui64toa_s(     unsigned __int64 _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ui64toa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ui64tow_s(     unsigned __int64 _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ui64tow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl gcvt_s(       char *_Buffer,      size_t _SizeInChars,      double _Value,      int _Ndec)
-{
-	AtlCrtErrorCheck(::_gcvt_s(_Buffer, _SizeInChars, _Value, _Ndec));
-}
-
-inline void __cdecl tsplitpath_s(       const TCHAR *_Path,          TCHAR *_Drive,      size_t _Drive_len, 
-	         TCHAR *_Dir,      size_t _Dir_len, 
-	         TCHAR *_Fname,      size_t _Fname_len, 
-	         TCHAR *_Ext,      size_t _Ext_len)
-{
-	AtlCrtErrorCheck(::_wsplitpath_s(_Path, _Drive, _Drive_len, _Dir, _Dir_len, _Fname, _Fname_len, _Ext, _Ext_len));
-}
-
-inline void __cdecl tmakepath_s(       TCHAR *_Path,      size_t _SizeInChars,        const TCHAR *_Drive, 
-	       const TCHAR *_Dir,        const TCHAR *_Fname,        const TCHAR *_Ext)
-{
-	AtlCrtErrorCheck(::_wmakepath_s(_Path, _SizeInChars, _Drive, _Dir, _Fname, _Ext));
-}
-
-inline size_t __cdecl strnlen(       const char *_Str,      size_t _Maxsize)
-{
-	return ::strnlen(_Str, _Maxsize);
-}
-
-inline size_t __cdecl wcsnlen(       const wchar_t *_Wcs,      size_t _Maxsize)
-{
-	return ::wcsnlen(_Wcs, _Maxsize);
-}
-
-inline size_t __cdecl tcsnlen(       const TCHAR *_Str,      size_t _Maxsize)
-{
-	return ::wcsnlen(_Str, _Maxsize);
-}
-
-inline int get_errno() throw()
-{
-	int nErrNo=0;
-	errno_t nErrCall=::_get_errno(&nErrNo);
-	if(nErrCall)
-	{
-		return nErrCall;
-	}
-	return nErrNo;
-}
-
-inline void set_errno(     int _Value)
-{
-	AtlCrtErrorCheck(::_set_errno(_Value));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} 
-
-} 
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable: 4800) 
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-
-
-
-
-
-
-template <class T>
-class CSimpleArrayEqualHelper
-{
-public:
-	static bool IsEqual(const T& t1, const T& t2)
-	{
-		return (t1 == t2);
-	}
-};
-
-template <class T>
-class CSimpleArrayEqualHelperFalse
-{
-public:
-	static bool IsEqual(const T&, const T&)
-	{
-		(void) ((!!((false))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 63, 0, L"false")) || (__debugbreak(), 0));
-		return false;
-	}
-};
-
-template <class TKey, class TVal>
-class CSimpleMapEqualHelper
-{
-public:
-	static bool IsEqualKey(const TKey& k1, const TKey& k2)
-	{
-		return CSimpleArrayEqualHelper<TKey>::IsEqual(k1, k2);
-	}
-
-	static bool IsEqualValue(const TVal& v1, const TVal& v2)
-	{
-		return CSimpleArrayEqualHelper<TVal>::IsEqual(v1, v2);
-	}
-};
-
-template <class TKey, class TVal>
-class CSimpleMapEqualHelperFalse
-{
-public:
-	static bool IsEqualKey(const TKey& k1, const TKey& k2)
-	{
-		return CSimpleArrayEqualHelper<TKey>::IsEqual(k1, k2);
-	}
-
-	static bool IsEqualValue(const TVal&, const TVal&)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 94, 0, L"0")) || (__debugbreak(), 0));
-		return false;
-	}
-};
-
-template <class T, class TEqual = CSimpleArrayEqualHelper< T > >
-class CSimpleArray
-{
-public:
-
-	CSimpleArray() : m_aT(0), m_nSize(0), m_nAllocSize(0)
-	{ }
-
-	~CSimpleArray();
-
-	CSimpleArray(const CSimpleArray< T, TEqual >& src) : m_aT(0), m_nSize(0), m_nAllocSize(0)
-	{
-        if (src.GetSize())
-        {
-			m_aT = (T*)calloc(src.GetSize(), sizeof(T));
-			if (m_aT != 0)
-			{
-				m_nAllocSize = src.GetSize();
-				for (int i=0; i<src.GetSize(); i++)
-					Add(src[i]);
-			}
-		}
-	}
-	CSimpleArray< T, TEqual >& operator=(const CSimpleArray< T, TEqual >& src)
-	{
-		if (GetSize() != src.GetSize())
-		{
-			RemoveAll();
-			m_aT = (T*)calloc(src.GetSize(), sizeof(T));
-			if (m_aT != 0)
-				m_nAllocSize = src.GetSize();
-		}
-		else
-		{
-			for (int i = GetSize(); i > 0; i--)
-				RemoveAt(i - 1);
-		}
-		for (int i=0; i<src.GetSize(); i++)
-			Add(src[i]);
-		return *this;
-	}
-
-
-	int GetSize() const
-	{
-		return m_nSize;
-	}
-	BOOL Add(const T& t)
-	{
-		if(m_nSize == m_nAllocSize)
-		{
-			
-			
-			do { int __atl_condVal=!!((&t < m_aT) || (&t >= (m_aT + m_nAllocSize) )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 153, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-			T* aT;
-			int nNewAllocSize = (m_nAllocSize == 0) ? 1 : (m_nSize * 2);
-	  
-			if (nNewAllocSize<0||nNewAllocSize>2147483647/sizeof(T))
-			{
-				return 0;
-			}
-
-			aT = (T*)_recalloc(m_aT, nNewAllocSize, sizeof(T));
-			if(aT == 0)
-				return 0;
-			m_nAllocSize = nNewAllocSize;
-			m_aT = aT;
-		}
-		InternalSetAtIndex(m_nSize, t);
-		m_nSize++;
-		return 1;
-	}
-	BOOL Remove(const T& t)
-	{
-		int nIndex = Find(t);
-		if(nIndex == -1)
-			return 0;
-		return RemoveAt(nIndex);
-	}
-	BOOL RemoveAt(int nIndex)
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 182, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if (nIndex < 0 || nIndex >= m_nSize)
-			return 0;
-		m_aT[nIndex].~T();
-		if(nIndex != (m_nSize - 1))
-			Checked::memmove_s((void*)(m_aT + nIndex), (m_nSize - nIndex) * sizeof(T), (void*)(m_aT + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(T));
-		m_nSize--;
-		return 1;
-	}
-	void RemoveAll()
-	{
-		if(m_aT != 0)
-		{
-			for(int i = 0; i < m_nSize; i++)
-				m_aT[i].~T();
-			free(m_aT);
-			m_aT = 0;
-		}
-		m_nSize = 0;
-		m_nAllocSize = 0;
-    }   
-	const T& operator[] (int nIndex) const
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 205, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if(nIndex < 0 || nIndex >= m_nSize)
-		{
-			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));					
-		}
-		return m_aT[nIndex];
-	}
-	T& operator[] (int nIndex)
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 214, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if(nIndex < 0 || nIndex >= m_nSize)
-		{
-			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));					
-		}
-		return m_aT[nIndex];
-	}
-	T* GetData() const
-	{
-		return m_aT;
-	}
-
-	int Find(const T& t) const
-	{
-		for(int i = 0; i < m_nSize; i++)
-		{
-			if(TEqual::IsEqual(m_aT[i], t))
-				return i;
-		}
-		return -1;  
-	}
-
-	BOOL SetAtIndex(int nIndex, const T& t)
-	{
-		if (nIndex < 0 || nIndex >= m_nSize)
-			return 0;
-		InternalSetAtIndex(nIndex, t);
-		return 1;
-	}
-
-
-	class Wrapper
-	{
-	public:
-		Wrapper(const T& _t) : t(_t)
-		{
-		}
-		template <class _Ty>
-		void * __cdecl operator new(size_t, _Ty* p)
-		{
-			return p;
-		}
-		template <class _Ty>
-		void __cdecl operator delete(void* , _Ty* )
-		{
-		}
-		T t;
-	};
-
-
-	void InternalSetAtIndex(int nIndex, const T& t)
-	{
-		new(m_aT + nIndex) Wrapper(t);
-	}
-
-	typedef T _ArrayElementType;
-	T* m_aT;
-	int m_nSize;
-	int m_nAllocSize;
-
-};
-
-
-
-	template <class T, class TEqual> inline  CSimpleArray<T, TEqual>::~CSimpleArray()
-	{
-		RemoveAll();
-	}
-
-
-template <class TKey, class TVal, class TEqual = CSimpleMapEqualHelper< TKey, TVal > >
-class CSimpleMap
-{
-public:
-	TKey* m_aKey;
-	TVal* m_aVal;
-	int m_nSize;
-
-	typedef TKey _ArrayKeyType;
-	typedef TVal _ArrayElementType;
-
-
-	CSimpleMap() : m_aKey(0), m_aVal(0), m_nSize(0)
-	{ }
-
-	~CSimpleMap()
-	{
-		RemoveAll();	
-	}
-
-
-	int GetSize() const
-	{
-		return m_nSize;
-	}
-	BOOL Add(const TKey& key, const TVal& val)
-	{
-		TKey* pKey;
-		pKey = (TKey*)_recalloc(m_aKey, (m_nSize + 1), sizeof(TKey));
-		if(pKey == 0)
-			return 0;
-		m_aKey = pKey;
-		TVal* pVal;
-		pVal = (TVal*)_recalloc(m_aVal, (m_nSize + 1), sizeof(TVal));
-		if(pVal == 0)
-			return 0;
-		m_aVal = pVal;
-		InternalSetAtIndex(m_nSize, key, val);
-		m_nSize++;
-		return 1;
-	}
-	BOOL Remove(const TKey& key)
-	{
-		int nIndex = FindKey(key);
-		if(nIndex == -1)
-			return 0;
-		return RemoveAt(nIndex);
-	}
-	BOOL RemoveAt(int nIndex)
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 334, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if (nIndex < 0 || nIndex >= m_nSize)
-			return 0;
-		m_aKey[nIndex].~TKey();
-		m_aVal[nIndex].~TVal();
-		if(nIndex != (m_nSize - 1))
-		{
-			Checked::memmove_s((void*)(m_aKey + nIndex), (m_nSize - nIndex) * sizeof(TKey), (void*)(m_aKey + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(TKey));
-			Checked::memmove_s((void*)(m_aVal + nIndex), (m_nSize - nIndex) * sizeof(TVal), (void*)(m_aVal + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(TVal));
-		}
-		TKey* pKey;
-		pKey = (TKey*)_recalloc(m_aKey, (m_nSize - 1), sizeof(TKey));
-		if(pKey != 0 || m_nSize == 1)
-			m_aKey = pKey;
-		TVal* pVal;
-		pVal = (TVal*)_recalloc(m_aVal, (m_nSize - 1), sizeof(TVal));
-		if(pVal != 0 || m_nSize == 1)
-			m_aVal = pVal;
-		m_nSize--;
-		return 1;
-	}
-	void RemoveAll()
-	{
-		if(m_aKey != 0)
-		{
-			for(int i = 0; i < m_nSize; i++)
-			{
-				m_aKey[i].~TKey();
-				m_aVal[i].~TVal();
-			}
-			free(m_aKey);
-			m_aKey = 0;
-		}
-		if(m_aVal != 0)
-		{
-			free(m_aVal);
-			m_aVal = 0;
-		}
-
-		m_nSize = 0;
-	}
-	BOOL SetAt(const TKey& key, const TVal& val)
-	{
-		int nIndex = FindKey(key);
-		if(nIndex == -1)
-			return 0;
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 380, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		m_aKey[nIndex].~TKey();
-		m_aVal[nIndex].~TVal();
-		InternalSetAtIndex(nIndex, key, val);
-		return 1;
-	}
-	TVal Lookup(const TKey& key) const
-	{
-		int nIndex = FindKey(key);
-		if(nIndex == -1)
-			return 0;    
-		return GetValueAt(nIndex);
-	}
-	TKey ReverseLookup(const TVal& val) const
-	{
-		int nIndex = FindVal(val);
-		if(nIndex == -1)
-			return 0;    
-		return GetKeyAt(nIndex);
-	}
-	TKey& GetKeyAt(int nIndex) const
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 402, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if(nIndex < 0 || nIndex >= m_nSize)
-			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));
-			
-		return m_aKey[nIndex];
-	}
-	TVal& GetValueAt(int nIndex) const
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 410, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if(nIndex < 0 || nIndex >= m_nSize)
-			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));	
-			
-		return m_aVal[nIndex];
-	}
-
-	int FindKey(const TKey& key) const
-	{
-		for(int i = 0; i < m_nSize; i++)
-		{
-			if(TEqual::IsEqualKey(m_aKey[i], key))
-				return i;
-		}
-		return -1;  
-	}
-	int FindVal(const TVal& val) const
-	{
-		for(int i = 0; i < m_nSize; i++)
-		{
-			if(TEqual::IsEqualValue(m_aVal[i], val))
-				return i;
-		}
-		return -1;  
-	}
-
-	BOOL SetAtIndex(int nIndex, const TKey& key, const TVal& val)
-	{
-		if (nIndex < 0 || nIndex >= m_nSize)
-			return 0;
-		InternalSetAtIndex(nIndex, key, val);
-		return 1;
-	}
-
-
-
-
-	template <typename T>
-	class Wrapper
-	{
-	public:
-		Wrapper(const T& _t) : t(_t)
-		{
-		}
-		template <class _Ty>
-		void *operator new(size_t, _Ty* p)
-		{
-			return p;
-		}
-		template <class _Ty>
-		void operator delete(void* , _Ty* )
-		{
-		}
-		T t;
-	};
-	void InternalSetAtIndex(int nIndex, const TKey& key, const TVal& val)
-	{
-		new(m_aKey + nIndex) Wrapper<TKey>(key);
-		new(m_aVal + nIndex) Wrapper<TVal>(val);
-	}
-};
-
-
-
-};  
-#pragma pack(pop)
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-inline BOOL AtlIsValidString(LPCWSTR psz, size_t nMaxLength = 2147483647)
-{
-	(nMaxLength);
-	return (psz != 0);
-}
-
-
-inline BOOL AtlIsValidString(LPCSTR psz, size_t nMaxLength = 0xffffffff)
-{
-	(nMaxLength);
-	return (psz != 0);
-}
-
-
-inline BOOL AtlIsValidAddress(const void* p, size_t nBytes,
-	BOOL bReadWrite = 1)
-{
-	(bReadWrite);
-	(nBytes);
-	return (p != 0);
-}
-
-template<typename T>
-inline void AtlAssertValidObject(const T *pOb)
-{
-	(void) ((!!((pOb))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 63, 0, L"pOb")) || (__debugbreak(), 0));
-	(void) ((!!((AtlIsValidAddress(pOb, sizeof(T))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 64, 0, L"AtlIsValidAddress(pOb, sizeof(T))")) || (__debugbreak(), 0));
-	if(pOb)
-		pOb->AssertValid();
-}
-
-
-
-
-
-
-
-class CComCriticalSection
-{
-public:
-	CComCriticalSection() throw()
-	{
-		memset(&m_sec, 0, sizeof(CRITICAL_SECTION));
-	}
-	~CComCriticalSection()
-	{
-	}
-	HRESULT Lock() throw()
-	{
-		EnterCriticalSection(&m_sec);
-		return ((HRESULT)0x00000000L);
-	}
-	HRESULT Unlock() throw()
-	{
-		LeaveCriticalSection(&m_sec);
-		return ((HRESULT)0x00000000L);
-	}
-	HRESULT Init() throw()
-	{
-		HRESULT hRes = ((HRESULT)0x80004005L);
-		__try
-		{
-			InitializeCriticalSection(&m_sec);
-			hRes = ((HRESULT)0x00000000L);
-		}
-		
-		__except(((DWORD )0xC0000017L) == _exception_code())
-		{			
-			hRes = ((HRESULT)0x8007000EL);		
-		}
-		return hRes;
-	}
-
-	HRESULT Term() throw()
-	{
-		DeleteCriticalSection(&m_sec);
-		return ((HRESULT)0x00000000L);
-	}	
-	CRITICAL_SECTION m_sec;
-};
-
-class CComAutoCriticalSection : public CComCriticalSection
-{
-public:
-	CComAutoCriticalSection()
-	{
-		HRESULT hr = CComCriticalSection::Init();
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-	}
-	~CComAutoCriticalSection() throw()
-	{
-		CComCriticalSection::Term();
-	}
-private :
-	HRESULT Init(); 
-	HRESULT Term(); 
-};
-
-class CComSafeDeleteCriticalSection : public CComCriticalSection
-{
-public:
-	CComSafeDeleteCriticalSection(): m_bInitialized(false) 
-	{
-	}
-
-	~CComSafeDeleteCriticalSection() throw()
-	{
-		if (!m_bInitialized)
-		{
-			return;
-		}
-		m_bInitialized = false;
-		CComCriticalSection::Term();
-	}
-
-	HRESULT Init() throw()
-	{
-		(void) ((!!((!m_bInitialized))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 156, 0, L"!m_bInitialized")) || (__debugbreak(), 0));
-		HRESULT hr = CComCriticalSection::Init();
-		if (((HRESULT)(hr) >= 0))
-		{
-			m_bInitialized = true;
-		}
-		return hr;
-	}
-
-	HRESULT Term() throw()
-	{
-		if (!m_bInitialized)
-		{
-			return ((HRESULT)0x00000000L);
-		}
-		m_bInitialized = false;
-		return CComCriticalSection::Term();
-	}
-
-	HRESULT Lock()
-	{
-		
-		
-		
-		
-		
-		do { (void) ((!!((m_bInitialized))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 182, 0, L"m_bInitialized")) || (__debugbreak(), 0)); ; } while(0);
-		return CComCriticalSection::Lock();
-	}
-
-private:
-	bool m_bInitialized;
-};
-
-class CComAutoDeleteCriticalSection : public CComSafeDeleteCriticalSection
-{
-private:
-	
-	HRESULT Term() throw();
-};
-
-class CComFakeCriticalSection
-{
-public:
-	HRESULT Lock() throw() { return ((HRESULT)0x00000000L); }
-	HRESULT Unlock() throw() { return ((HRESULT)0x00000000L); }
-	HRESULT Init() throw() { return ((HRESULT)0x00000000L); }
-	HRESULT Term() throw() { return ((HRESULT)0x00000000L); }
-};
-
-
-
-
-
-struct _ATL_BASE_MODULE70
-{
-	UINT cbSize;
-	HINSTANCE m_hInst;
-	HINSTANCE m_hInstResource;
-	bool m_bNT5orWin98;
-	DWORD dwAtlBuildVer;
-	const GUID* pguidVer;
-	CComCriticalSection m_csResource;
-	CSimpleArray<HINSTANCE> m_rgResourceInstance;
-};
-typedef _ATL_BASE_MODULE70 _ATL_BASE_MODULE;
-
-class CAtlBaseModule : public _ATL_BASE_MODULE
-{
-public :
-	static bool m_bInitFailed;
-	CAtlBaseModule() throw();
-	~CAtlBaseModule() throw ();
-
-	HINSTANCE GetModuleInstance() throw()
-	{
-		return m_hInst;
-	}
-	HINSTANCE GetResourceInstance() throw()
-	{
-		return m_hInstResource;
-	}
-	HINSTANCE SetResourceInstance(HINSTANCE hInst) throw()
-	{
-		return static_cast< HINSTANCE >(InterlockedExchangePointer((void**)&m_hInstResource, hInst));
-	}
-
-	bool AddResourceInstance(HINSTANCE hInst) throw();
-	bool RemoveResourceInstance(HINSTANCE hInst) throw();
-	HINSTANCE GetHInstanceAt(int i) throw();
-};
-
-__declspec(selectany) bool CAtlBaseModule::m_bInitFailed = false;
-extern CAtlBaseModule _AtlBaseModule;
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable: 4200)
-	struct ATLSTRINGRESOURCEIMAGE
-	{
-		WORD nLength;
-		WCHAR achString[];
-	};
-#pragma warning(pop)	
-
-inline const ATLSTRINGRESOURCEIMAGE* _AtlGetStringResourceImage( HINSTANCE hInstance, HRSRC hResource, UINT id ) throw()
-{
-	const ATLSTRINGRESOURCEIMAGE* pImage;
-	const ATLSTRINGRESOURCEIMAGE* pImageEnd;
-	ULONG nResourceSize;
-	HGLOBAL hGlobal;
-	UINT iIndex;
-
-	hGlobal = ::LoadResource( hInstance, hResource );
-	if( hGlobal == 0 )
-	{
-		return( 0 );
-	}
-
-	pImage = (const ATLSTRINGRESOURCEIMAGE*)::LockResource( hGlobal );
-	if( pImage == 0 )
-	{
-		return( 0 );
-	}
-
-	nResourceSize = ::SizeofResource( hInstance, hResource );
-	pImageEnd = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+nResourceSize);
-	iIndex = id&0x000f;
-
-	while( (iIndex > 0) && (pImage < pImageEnd) )
-	{
-		pImage = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+(sizeof( ATLSTRINGRESOURCEIMAGE )+(pImage->nLength*sizeof( WCHAR ))));
-		iIndex--;
-	}
-	if( pImage >= pImageEnd )
-	{
-		return( 0 );
-	}
-	if( pImage->nLength == 0 )
-	{
-		return( 0 );
-	}
-
-	return( pImage );
-}
-
-inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id ) throw()
-{
-	HRSRC hResource;
-
-	hResource = ::FindResourceW( hInstance, ((LPWSTR)((ULONG_PTR)((WORD)(((id>>4)+1))))), ((LPWSTR)((ULONG_PTR)((WORD)(6)))) );
-	if( hResource == 0 )
-	{
-		return( 0 );
-	}
-
-	return _AtlGetStringResourceImage( hInstance, hResource, id );
-}
-
-inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id, WORD wLanguage ) throw()
-{
-	HRSRC hResource;
-
-	hResource = ::FindResourceExW( hInstance, ((LPWSTR)((ULONG_PTR)((WORD)(6)))), ((LPWSTR)((ULONG_PTR)((WORD)(((id>>4)+1))))), wLanguage );
-	if( hResource == 0 )
-	{
-		return( 0 );
-	}
-
-	return _AtlGetStringResourceImage( hInstance, hResource, id );
-}
-
-inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id ) throw()
-{
-	const ATLSTRINGRESOURCEIMAGE* p = 0;
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-
-	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		p = AtlGetStringResourceImage(hInst, id);
-	}
-	return p;
-}
-
-inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id, WORD wLanguage ) throw()
-{
-	const ATLSTRINGRESOURCEIMAGE* p = 0;
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-
-	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		p = AtlGetStringResourceImage(hInst, id, wLanguage);
-	}
-	return p;
-}
-
-inline int AtlLoadString(     UINT nID,          LPTSTR lpBuffer,      int nBufferMax) throw()
-{
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-	int nRet = 0;
-
-	for (int i = 1; hInst != 0 && nRet == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		nRet = LoadStringW(hInst, nID, lpBuffer, nBufferMax);
-	}
-	return nRet;
-}
-
-inline HINSTANCE AtlFindResourceInstance(LPCTSTR lpName, LPCTSTR lpType, WORD wLanguage = 0) throw()
-{
-	(void) ((!!((lpType != ((LPWSTR)((ULONG_PTR)((WORD)(6))))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 368, 0, L"lpType != ((LPWSTR)((ULONG_PTR)((WORD)(6))))")) || (__debugbreak(), 0));	
-	if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(6)))))
-		return 0;
-
-	if (((((ULONG_PTR)(lpType)) >> 16) == 0))
-	{
-		
-		if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(3)))))
-		{
-			lpType = ((LPWSTR)((ULONG_PTR)((WORD)((ULONG_PTR)((LPWSTR)((ULONG_PTR)((WORD)(3)))) + 11))));
-		}
-		else if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(1)))))
-		{
-			lpType = ((LPWSTR)((ULONG_PTR)((WORD)((ULONG_PTR)((LPWSTR)((ULONG_PTR)((WORD)(1)))) + 11))));
-		}
-	}
-
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-	HRSRC hResource = 0;
-
-	for (int i = 1; hInst != 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		hResource = ::FindResourceExW(hInst, lpType, lpName, wLanguage);
-		if (hResource != 0)
-		{
-			return hInst;
-		}
-	}
-
-	return 0;
-}
-
-inline HINSTANCE AtlFindResourceInstance(UINT nID, LPCTSTR lpType, WORD wLanguage = 0) throw()
-{
-	return AtlFindResourceInstance(((LPWSTR)((ULONG_PTR)((WORD)(nID)))), lpType, wLanguage);
-}
-
-inline HINSTANCE AtlFindStringResourceInstance(UINT nID, WORD wLanguage = 0) throw()
-{
-	const ATLSTRINGRESOURCEIMAGE* p = 0;
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-
-	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		p = AtlGetStringResourceImage(hInst, nID, wLanguage);
-		if (p != 0)
-			return hInst;
-	}
-
-	return 0;
-}
-
-
-
-
-inline HRESULT AtlSafeArrayGetActualVartype
-(
-    SAFEARRAY *psaArray,
-    VARTYPE *pvtType
-)
-{
-    HRESULT hrSystem=::SafeArrayGetVartype(psaArray, pvtType);
-
-    if(((HRESULT)(hrSystem) < 0))
-    {
-        return hrSystem;
-    }
-
-    
-
-
-
-    if(pvtType && *pvtType==VT_UNKNOWN)
-    {
-        if(psaArray && ((psaArray->fFeatures & ( 0x40 ))!=0))
-        {
-            if(psaArray->fFeatures & ( 0x400 ))
-            {
-                *pvtType=VT_DISPATCH;
-            }
-        }
-    }
-
-    return hrSystem;
-}
-template <typename _CharType>
-inline _CharType* AtlCharNext(const _CharType* p) throw()
-{
-	do { (void) ((!!((p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 456, 0, L"p != 0")) || (__debugbreak(), 0)); ; } while(0);	
-	if (*p == '\0')  
-		return const_cast<_CharType*>(p+1);
-	else
-		return ::CharNextA(p);
-}
-
-template <>
-inline wchar_t* AtlCharNext<wchar_t>(const wchar_t* p) throw()
-{
-	return const_cast< wchar_t* >( p+1 );
-}
-template<typename CharType>
-inline const CharType* AtlstrchrT(const CharType* p, CharType ch) throw()
-{
-	(void) ((!!((p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 471, 0, L"p != 0")) || (__debugbreak(), 0));	
-	if(p==0)
-	{
-		return 0;
-	}
-	while( *p != 0 )
-	{
-		if (*p == ch)
-		{
-			return p;
-		}
-		p = AtlCharNext(p);
-	}
-	
-	
-	return (*p == ch) ? p : 0;
-}
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-template<typename CharType>
-inline int AtlprintfT(const CharType* pszFormat,... ) throw()
-{
-	int retval=0;
-	va_list argList;
-	( argList = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	retval=vprintf(pszFormat,argList);
-	( argList = (va_list)0 );
-	return retval;
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-template<>
-inline int AtlprintfT(const wchar_t* pszFormat,... ) throw()
-{
-	int retval=0;
-	va_list argList;
-	( argList = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	retval=vwprintf(pszFormat,	argList);
-	( argList = (va_list)0 );
-	return retval;
-}
-#pragma warning(pop)
-
-inline BOOL AtlConvertSystemTimeToVariantTime(const SYSTEMTIME& systimeSrc,double* pVarDtTm)
-{
-	do { int __atl_condVal=!!(pVarDtTm!=0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 519, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-	
-	
-	BOOL ok = ::SystemTimeToVariantTime(const_cast<SYSTEMTIME*>(&systimeSrc), pVarDtTm);
-	SYSTEMTIME sysTime;
-	::memset((&sysTime),0,(sizeof(SYSTEMTIME)));
-
-	ok = ok && ::VariantTimeToSystemTime(*pVarDtTm, &sysTime);
-	ok = ok && (systimeSrc.wYear == sysTime.wYear &&
-			systimeSrc.wMonth == sysTime.wMonth &&
-			systimeSrc.wDay == sysTime.wDay &&
-			systimeSrc.wHour == sysTime.wHour &&
-			systimeSrc.wMinute == sysTime.wMinute && 
-			systimeSrc.wSecond == sysTime.wSecond);
-
-	return ok;
-}
-
-
-}	
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IEnumConnections IEnumConnections;
-
-
-
-
-
-typedef struct IConnectionPoint IConnectionPoint;
-
-
-
-
-
-typedef struct IEnumConnectionPoints IEnumConnectionPoints;
-
-
-
-
-
-typedef struct IConnectionPointContainer IConnectionPointContainer;
-
-
-
-
-
-typedef struct IClassFactory2 IClassFactory2;
-
-
-
-
-
-typedef struct IProvideClassInfo IProvideClassInfo;
-
-
-
-
-
-typedef struct IProvideClassInfo2 IProvideClassInfo2;
-
-
-
-
-
-typedef struct IProvideMultipleClassInfo IProvideMultipleClassInfo;
-
-
-
-
-
-typedef struct IOleControl IOleControl;
-
-
-
-
-
-typedef struct IOleControlSite IOleControlSite;
-
-
-
-
-
-typedef struct IPropertyPage IPropertyPage;
-
-
-
-
-
-typedef struct IPropertyPage2 IPropertyPage2;
-
-
-
-
-
-typedef struct IPropertyPageSite IPropertyPageSite;
-
-
-
-
-
-typedef struct IPropertyNotifySink IPropertyNotifySink;
-
-
-
-
-
-typedef struct ISpecifyPropertyPages ISpecifyPropertyPages;
-
-
-
-
-
-typedef struct IPersistMemory IPersistMemory;
-
-
-
-
-
-typedef struct IPersistStreamInit IPersistStreamInit;
-
-
-
-
-
-typedef struct IPersistPropertyBag IPersistPropertyBag;
-
-
-
-
-
-typedef struct ISimpleFrameSite ISimpleFrameSite;
-
-
-
-
-
-typedef struct IFont IFont;
-
-
-
-
-
-typedef struct IPicture IPicture;
-
-
-
-
-
-typedef struct IFontEventsDisp IFontEventsDisp;
-
-
-
-
-
-typedef struct IFontDisp IFontDisp;
-
-
-
-
-
-typedef struct IPictureDisp IPictureDisp;
-
-
-
-
-
-typedef struct IOleInPlaceObjectWindowless IOleInPlaceObjectWindowless;
-
-
-
-
-
-typedef struct IOleInPlaceSiteEx IOleInPlaceSiteEx;
-
-
-
-
-
-typedef struct IOleInPlaceSiteWindowless IOleInPlaceSiteWindowless;
-
-
-
-
-
-typedef struct IViewObjectEx IViewObjectEx;
-
-
-
-
-
-typedef struct IOleUndoUnit IOleUndoUnit;
-
-
-
-
-
-typedef struct IOleParentUndoUnit IOleParentUndoUnit;
-
-
-
-
-
-typedef struct IEnumOleUndoUnits IEnumOleUndoUnits;
-
-
-
-
-
-typedef struct IOleUndoManager IOleUndoManager;
-
-
-
-
-
-typedef struct IPointerInactive IPointerInactive;
-
-
-
-
-
-typedef struct IObjectWithSite IObjectWithSite;
-
-
-
-
-
-typedef struct IPerPropertyBrowsing IPerPropertyBrowsing;
-
-
-
-
-
-typedef struct IPropertyBag2 IPropertyBag2;
-
-
-
-
-
-typedef struct IPersistPropertyBag2 IPersistPropertyBag2;
-
-
-
-
-
-typedef struct IAdviseSinkEx IAdviseSinkEx;
-
-
-
-
-
-typedef struct IQuickActivate IQuickActivate;
-
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_ocidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_ocidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  
-enum tagUASFLAGS
-    {	UAS_NORMAL	= 0,
-	UAS_BLOCKED	= 0x1,
-	UAS_NOPARENTENABLE	= 0x2,
-	UAS_MASK	= 0x3
-    } 	UASFLAGS;
-
-
-typedef  
-enum tagREADYSTATE
-    {	READYSTATE_UNINITIALIZED	= 0,
-	READYSTATE_LOADING	= 1,
-	READYSTATE_LOADED	= 2,
-	READYSTATE_INTERACTIVE	= 3,
-	READYSTATE_COMPLETE	= 4
-    } 	READYSTATE;
-
-
-
-extern RPC_IF_HANDLE IOleControlTypes_v1_0_c_ifspec;
-extern RPC_IF_HANDLE IOleControlTypes_v1_0_s_ifspec;
-
-
-
-
-
-
- 
-
-typedef IEnumConnections *PENUMCONNECTIONS;
-
-typedef IEnumConnections *LPENUMCONNECTIONS;
-
-typedef struct tagCONNECTDATA
-    {
-    IUnknown *pUnk;
-    DWORD dwCookie;
-    } 	CONNECTDATA;
-
-typedef struct tagCONNECTDATA *PCONNECTDATA;
-
-typedef struct tagCONNECTDATA *LPCONNECTDATA;
-
-
-extern "C" const IID IID_IEnumConnections;
-
-
-    
-    struct __declspec(uuid("B196B287-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IEnumConnections : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG cConnections,
-             LPCONNECTDATA rgcd,
-             ULONG *pcFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG cConnections) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumConnections **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumConnections_RemoteNext_Proxy( 
-    IEnumConnections * This,
-     ULONG cConnections,
-     LPCONNECTDATA rgcd,
-     ULONG *pcFetched);
-
-
-void __stdcall IEnumConnections_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnections_Skip_Proxy( 
-    IEnumConnections * This,
-     ULONG cConnections);
-
-
-void __stdcall IEnumConnections_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnections_Reset_Proxy( 
-    IEnumConnections * This);
-
-
-void __stdcall IEnumConnections_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnections_Clone_Proxy( 
-    IEnumConnections * This,
-     IEnumConnections **ppEnum);
-
-
-void __stdcall IEnumConnections_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IConnectionPoint *PCONNECTIONPOINT;
-
-typedef IConnectionPoint *LPCONNECTIONPOINT;
-
-
-extern "C" const IID IID_IConnectionPoint;
-
-
-    
-    struct __declspec(uuid("B196B286-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IConnectionPoint : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetConnectionInterface( 
-             IID *pIID) = 0;
-        
-        virtual HRESULT __stdcall GetConnectionPointContainer( 
-             IConnectionPointContainer **ppCPC) = 0;
-        
-        virtual HRESULT __stdcall Advise( 
-             IUnknown *pUnkSink,
-             DWORD *pdwCookie) = 0;
-        
-        virtual HRESULT __stdcall Unadvise( 
-             DWORD dwCookie) = 0;
-        
-        virtual HRESULT __stdcall EnumConnections( 
-             IEnumConnections **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IConnectionPoint_GetConnectionInterface_Proxy( 
-    IConnectionPoint * This,
-     IID *pIID);
-
-
-void __stdcall IConnectionPoint_GetConnectionInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPoint_GetConnectionPointContainer_Proxy( 
-    IConnectionPoint * This,
-     IConnectionPointContainer **ppCPC);
-
-
-void __stdcall IConnectionPoint_GetConnectionPointContainer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPoint_Advise_Proxy( 
-    IConnectionPoint * This,
-     IUnknown *pUnkSink,
-     DWORD *pdwCookie);
-
-
-void __stdcall IConnectionPoint_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPoint_Unadvise_Proxy( 
-    IConnectionPoint * This,
-     DWORD dwCookie);
-
-
-void __stdcall IConnectionPoint_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPoint_EnumConnections_Proxy( 
-    IConnectionPoint * This,
-     IEnumConnections **ppEnum);
-
-
-void __stdcall IConnectionPoint_EnumConnections_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IEnumConnectionPoints *PENUMCONNECTIONPOINTS;
-
-typedef IEnumConnectionPoints *LPENUMCONNECTIONPOINTS;
-
-
-extern "C" const IID IID_IEnumConnectionPoints;
-
-
-    
-    struct __declspec(uuid("B196B285-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IEnumConnectionPoints : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG cConnections,
-             LPCONNECTIONPOINT *ppCP,
-             ULONG *pcFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG cConnections) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumConnectionPoints **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumConnectionPoints_RemoteNext_Proxy( 
-    IEnumConnectionPoints * This,
-     ULONG cConnections,
-     LPCONNECTIONPOINT *ppCP,
-     ULONG *pcFetched);
-
-
-void __stdcall IEnumConnectionPoints_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnectionPoints_Skip_Proxy( 
-    IEnumConnectionPoints * This,
-     ULONG cConnections);
-
-
-void __stdcall IEnumConnectionPoints_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnectionPoints_Reset_Proxy( 
-    IEnumConnectionPoints * This);
-
-
-void __stdcall IEnumConnectionPoints_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnectionPoints_Clone_Proxy( 
-    IEnumConnectionPoints * This,
-     IEnumConnectionPoints **ppEnum);
-
-
-void __stdcall IEnumConnectionPoints_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IConnectionPointContainer *PCONNECTIONPOINTCONTAINER;
-
-typedef IConnectionPointContainer *LPCONNECTIONPOINTCONTAINER;
-
-
-extern "C" const IID IID_IConnectionPointContainer;
-
-
-    
-    struct __declspec(uuid("B196B284-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IConnectionPointContainer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall EnumConnectionPoints( 
-             IEnumConnectionPoints **ppEnum) = 0;
-        
-        virtual HRESULT __stdcall FindConnectionPoint( 
-             const IID & riid,
-             IConnectionPoint **ppCP) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IConnectionPointContainer_EnumConnectionPoints_Proxy( 
-    IConnectionPointContainer * This,
-     IEnumConnectionPoints **ppEnum);
-
-
-void __stdcall IConnectionPointContainer_EnumConnectionPoints_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPointContainer_FindConnectionPoint_Proxy( 
-    IConnectionPointContainer * This,
-     const IID & riid,
-     IConnectionPoint **ppCP);
-
-
-void __stdcall IConnectionPointContainer_FindConnectionPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IClassFactory2 *LPCLASSFACTORY2;
-
-typedef struct tagLICINFO
-    {
-    LONG cbLicInfo;
-    BOOL fRuntimeKeyAvail;
-    BOOL fLicVerified;
-    } 	LICINFO;
-
-typedef struct tagLICINFO *LPLICINFO;
-
-
-extern "C" const IID IID_IClassFactory2;
-
-
-    
-    struct __declspec(uuid("B196B28F-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IClassFactory2 : public IClassFactory
-    {
-    public:
-        virtual HRESULT __stdcall GetLicInfo( 
-             LICINFO *pLicInfo) = 0;
-        
-        virtual HRESULT __stdcall RequestLicKey( 
-             DWORD dwReserved,
-             BSTR *pBstrKey) = 0;
-        
-        virtual  HRESULT __stdcall CreateInstanceLic( 
-             IUnknown *pUnkOuter,
-             IUnknown *pUnkReserved,
-             const IID & riid,
-             BSTR bstrKey,
-             PVOID *ppvObj) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IClassFactory2_GetLicInfo_Proxy( 
-    IClassFactory2 * This,
-     LICINFO *pLicInfo);
-
-
-void __stdcall IClassFactory2_GetLicInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IClassFactory2_RequestLicKey_Proxy( 
-    IClassFactory2 * This,
-     DWORD dwReserved,
-     BSTR *pBstrKey);
-
-
-void __stdcall IClassFactory2_RequestLicKey_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IClassFactory2_RemoteCreateInstanceLic_Proxy( 
-    IClassFactory2 * This,
-     const IID & riid,
-     BSTR bstrKey,
-     IUnknown **ppvObj);
-
-
-void __stdcall IClassFactory2_RemoteCreateInstanceLic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IProvideClassInfo *LPPROVIDECLASSINFO;
-
-
-extern "C" const IID IID_IProvideClassInfo;
-
-
-    
-    struct __declspec(uuid("B196B283-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IProvideClassInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassInfoW( 
-             ITypeInfo **ppTI) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProvideClassInfo_GetClassInfo_Proxy( 
-    IProvideClassInfo * This,
-     ITypeInfo **ppTI);
-
-
-void __stdcall IProvideClassInfo_GetClassInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IProvideClassInfo2 *LPPROVIDECLASSINFO2;
-
-typedef 
-enum tagGUIDKIND
-    {	GUIDKIND_DEFAULT_SOURCE_DISP_IID	= 1
-    } 	GUIDKIND;
-
-
-extern "C" const IID IID_IProvideClassInfo2;
-
-
-    
-    struct __declspec(uuid("A6BC3AC0-DBAA-11CE-9DE3-00AA004BB851")) __declspec(novtable)
-    IProvideClassInfo2 : public IProvideClassInfo
-    {
-    public:
-        virtual HRESULT __stdcall GetGUID( 
-             DWORD dwGuidKind,
-             GUID *pGUID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProvideClassInfo2_GetGUID_Proxy( 
-    IProvideClassInfo2 * This,
-     DWORD dwGuidKind,
-     GUID *pGUID);
-
-
-void __stdcall IProvideClassInfo2_GetGUID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-typedef IProvideMultipleClassInfo *LPPROVIDEMULTIPLECLASSINFO;
-
-
-extern "C" const IID IID_IProvideMultipleClassInfo;
-
-
-    
-    struct __declspec(uuid("A7ABA9C1-8983-11cf-8F20-00805F2CD064")) __declspec(novtable)
-    IProvideMultipleClassInfo : public IProvideClassInfo2
-    {
-    public:
-        virtual HRESULT __stdcall GetMultiTypeInfoCount( 
-             ULONG *pcti) = 0;
-        
-        virtual HRESULT __stdcall GetInfoOfIndex( 
-             ULONG iti,
-             DWORD dwFlags,
-             ITypeInfo **pptiCoClass,
-             DWORD *pdwTIFlags,
-             ULONG *pcdispidReserved,
-             IID *piidPrimary,
-             IID *piidSource) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProvideMultipleClassInfo_GetMultiTypeInfoCount_Proxy( 
-    IProvideMultipleClassInfo * This,
-     ULONG *pcti);
-
-
-void __stdcall IProvideMultipleClassInfo_GetMultiTypeInfoCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IProvideMultipleClassInfo_GetInfoOfIndex_Proxy( 
-    IProvideMultipleClassInfo * This,
-     ULONG iti,
-     DWORD dwFlags,
-     ITypeInfo **pptiCoClass,
-     DWORD *pdwTIFlags,
-     ULONG *pcdispidReserved,
-     IID *piidPrimary,
-     IID *piidSource);
-
-
-void __stdcall IProvideMultipleClassInfo_GetInfoOfIndex_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleControl *LPOLECONTROL;
-
-typedef struct tagCONTROLINFO
-    {
-    ULONG cb;
-    HACCEL hAccel;
-    USHORT cAccel;
-    DWORD dwFlags;
-    } 	CONTROLINFO;
-
-typedef struct tagCONTROLINFO *LPCONTROLINFO;
-
-typedef 
-enum tagCTRLINFO
-    {	CTRLINFO_EATS_RETURN	= 1,
-	CTRLINFO_EATS_ESCAPE	= 2
-    } 	CTRLINFO;
-
-
-extern "C" const IID IID_IOleControl;
-
-
-    
-    struct __declspec(uuid("B196B288-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IOleControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetControlInfo( 
-             CONTROLINFO *pCI) = 0;
-        
-        virtual HRESULT __stdcall OnMnemonic( 
-             MSG *pMsg) = 0;
-        
-        virtual HRESULT __stdcall OnAmbientPropertyChange( 
-             DISPID dispID) = 0;
-        
-        virtual HRESULT __stdcall FreezeEvents( 
-             BOOL bFreeze) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleControl_GetControlInfo_Proxy( 
-    IOleControl * This,
-     CONTROLINFO *pCI);
-
-
-void __stdcall IOleControl_GetControlInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControl_OnMnemonic_Proxy( 
-    IOleControl * This,
-     MSG *pMsg);
-
-
-void __stdcall IOleControl_OnMnemonic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControl_OnAmbientPropertyChange_Proxy( 
-    IOleControl * This,
-     DISPID dispID);
-
-
-void __stdcall IOleControl_OnAmbientPropertyChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControl_FreezeEvents_Proxy( 
-    IOleControl * This,
-     BOOL bFreeze);
-
-
-void __stdcall IOleControl_FreezeEvents_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleControlSite *LPOLECONTROLSITE;
-
-typedef struct tagPOINTF
-    {
-    FLOAT x;
-    FLOAT y;
-    } 	POINTF;
-
-typedef struct tagPOINTF *LPPOINTF;
-
-typedef 
-enum tagXFORMCOORDS
-    {	XFORMCOORDS_POSITION	= 0x1,
-	XFORMCOORDS_SIZE	= 0x2,
-	XFORMCOORDS_HIMETRICTOCONTAINER	= 0x4,
-	XFORMCOORDS_CONTAINERTOHIMETRIC	= 0x8,
-	XFORMCOORDS_EVENTCOMPAT	= 0x10
-    } 	XFORMCOORDS;
-
-
-extern "C" const IID IID_IOleControlSite;
-
-
-    
-    struct __declspec(uuid("B196B289-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IOleControlSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnControlInfoChanged( void) = 0;
-        
-        virtual HRESULT __stdcall LockInPlaceActive( 
-             BOOL fLock) = 0;
-        
-        virtual HRESULT __stdcall GetExtendedControl( 
-             IDispatch **ppDisp) = 0;
-        
-        virtual HRESULT __stdcall TransformCoords( 
-             POINTL *pPtlHimetric,
-             POINTF *pPtfContainer,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall TranslateAcceleratorW( 
-             MSG *pMsg,
-             DWORD grfModifiers) = 0;
-        
-        virtual HRESULT __stdcall OnFocus( 
-             BOOL fGotFocus) = 0;
-        
-        virtual HRESULT __stdcall ShowPropertyFrame( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleControlSite_OnControlInfoChanged_Proxy( 
-    IOleControlSite * This);
-
-
-void __stdcall IOleControlSite_OnControlInfoChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_LockInPlaceActive_Proxy( 
-    IOleControlSite * This,
-     BOOL fLock);
-
-
-void __stdcall IOleControlSite_LockInPlaceActive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_GetExtendedControl_Proxy( 
-    IOleControlSite * This,
-     IDispatch **ppDisp);
-
-
-void __stdcall IOleControlSite_GetExtendedControl_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_TransformCoords_Proxy( 
-    IOleControlSite * This,
-     POINTL *pPtlHimetric,
-     POINTF *pPtfContainer,
-     DWORD dwFlags);
-
-
-void __stdcall IOleControlSite_TransformCoords_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_TranslateAccelerator_Proxy( 
-    IOleControlSite * This,
-     MSG *pMsg,
-     DWORD grfModifiers);
-
-
-void __stdcall IOleControlSite_TranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_OnFocus_Proxy( 
-    IOleControlSite * This,
-     BOOL fGotFocus);
-
-
-void __stdcall IOleControlSite_OnFocus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_ShowPropertyFrame_Proxy( 
-    IOleControlSite * This);
-
-
-void __stdcall IOleControlSite_ShowPropertyFrame_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyPage *LPPROPERTYPAGE;
-
-typedef struct tagPROPPAGEINFO
-    {
-    ULONG cb;
-    LPOLESTR pszTitle;
-    SIZE size;
-    LPOLESTR pszDocString;
-    LPOLESTR pszHelpFile;
-    DWORD dwHelpContext;
-    } 	PROPPAGEINFO;
-
-typedef struct tagPROPPAGEINFO *LPPROPPAGEINFO;
-
-
-extern "C" const IID IID_IPropertyPage;
-
-
-    
-    struct __declspec(uuid("B196B28D-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IPropertyPage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetPageSite( 
-             IPropertyPageSite *pPageSite) = 0;
-        
-        virtual HRESULT __stdcall Activate( 
-             HWND hWndParent,
-             LPCRECT pRect,
-             BOOL bModal) = 0;
-        
-        virtual HRESULT __stdcall Deactivate( void) = 0;
-        
-        virtual HRESULT __stdcall GetPageInfo( 
-             PROPPAGEINFO *pPageInfo) = 0;
-        
-        virtual HRESULT __stdcall SetObjects( 
-             ULONG cObjects,
-             IUnknown **ppUnk) = 0;
-        
-        virtual HRESULT __stdcall Show( 
-             UINT nCmdShow) = 0;
-        
-        virtual HRESULT __stdcall Move( 
-             LPCRECT pRect) = 0;
-        
-        virtual HRESULT __stdcall IsPageDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Apply( void) = 0;
-        
-        virtual HRESULT __stdcall Help( 
-             LPCOLESTR pszHelpDir) = 0;
-        
-        virtual HRESULT __stdcall TranslateAcceleratorW( 
-             MSG *pMsg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyPage_SetPageSite_Proxy( 
-    IPropertyPage * This,
-     IPropertyPageSite *pPageSite);
-
-
-void __stdcall IPropertyPage_SetPageSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Activate_Proxy( 
-    IPropertyPage * This,
-     HWND hWndParent,
-     LPCRECT pRect,
-     BOOL bModal);
-
-
-void __stdcall IPropertyPage_Activate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Deactivate_Proxy( 
-    IPropertyPage * This);
-
-
-void __stdcall IPropertyPage_Deactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_GetPageInfo_Proxy( 
-    IPropertyPage * This,
-     PROPPAGEINFO *pPageInfo);
-
-
-void __stdcall IPropertyPage_GetPageInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_SetObjects_Proxy( 
-    IPropertyPage * This,
-     ULONG cObjects,
-     IUnknown **ppUnk);
-
-
-void __stdcall IPropertyPage_SetObjects_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Show_Proxy( 
-    IPropertyPage * This,
-     UINT nCmdShow);
-
-
-void __stdcall IPropertyPage_Show_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Move_Proxy( 
-    IPropertyPage * This,
-     LPCRECT pRect);
-
-
-void __stdcall IPropertyPage_Move_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_IsPageDirty_Proxy( 
-    IPropertyPage * This);
-
-
-void __stdcall IPropertyPage_IsPageDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Apply_Proxy( 
-    IPropertyPage * This);
-
-
-void __stdcall IPropertyPage_Apply_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Help_Proxy( 
-    IPropertyPage * This,
-     LPCOLESTR pszHelpDir);
-
-
-void __stdcall IPropertyPage_Help_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_TranslateAccelerator_Proxy( 
-    IPropertyPage * This,
-     MSG *pMsg);
-
-
-void __stdcall IPropertyPage_TranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyPage2 *LPPROPERTYPAGE2;
-
-
-extern "C" const IID IID_IPropertyPage2;
-
-
-    
-    struct __declspec(uuid("01E44665-24AC-101B-84ED-08002B2EC713")) __declspec(novtable)
-    IPropertyPage2 : public IPropertyPage
-    {
-    public:
-        virtual HRESULT __stdcall EditProperty( 
-             DISPID dispID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyPage2_EditProperty_Proxy( 
-    IPropertyPage2 * This,
-     DISPID dispID);
-
-
-void __stdcall IPropertyPage2_EditProperty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyPageSite *LPPROPERTYPAGESITE;
-
-typedef 
-enum tagPROPPAGESTATUS
-    {	PROPPAGESTATUS_DIRTY	= 0x1,
-	PROPPAGESTATUS_VALIDATE	= 0x2,
-	PROPPAGESTATUS_CLEAN	= 0x4
-    } 	PROPPAGESTATUS;
-
-
-extern "C" const IID IID_IPropertyPageSite;
-
-
-    
-    struct __declspec(uuid("B196B28C-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IPropertyPageSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnStatusChange( 
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall GetLocaleID( 
-             LCID *pLocaleID) = 0;
-        
-        virtual HRESULT __stdcall GetPageContainer( 
-             IUnknown **ppUnk) = 0;
-        
-        virtual HRESULT __stdcall TranslateAcceleratorW( 
-             MSG *pMsg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyPageSite_OnStatusChange_Proxy( 
-    IPropertyPageSite * This,
-     DWORD dwFlags);
-
-
-void __stdcall IPropertyPageSite_OnStatusChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPageSite_GetLocaleID_Proxy( 
-    IPropertyPageSite * This,
-     LCID *pLocaleID);
-
-
-void __stdcall IPropertyPageSite_GetLocaleID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPageSite_GetPageContainer_Proxy( 
-    IPropertyPageSite * This,
-     IUnknown **ppUnk);
-
-
-void __stdcall IPropertyPageSite_GetPageContainer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPageSite_TranslateAccelerator_Proxy( 
-    IPropertyPageSite * This,
-     MSG *pMsg);
-
-
-void __stdcall IPropertyPageSite_TranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyNotifySink *LPPROPERTYNOTIFYSINK;
-
-
-extern "C" const IID IID_IPropertyNotifySink;
-
-
-    
-    struct __declspec(uuid("9BFBBC02-EFF1-101A-84ED-00AA00341D07")) __declspec(novtable)
-    IPropertyNotifySink : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnChanged( 
-             DISPID dispID) = 0;
-        
-        virtual HRESULT __stdcall OnRequestEdit( 
-             DISPID dispID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyNotifySink_OnChanged_Proxy( 
-    IPropertyNotifySink * This,
-     DISPID dispID);
-
-
-void __stdcall IPropertyNotifySink_OnChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyNotifySink_OnRequestEdit_Proxy( 
-    IPropertyNotifySink * This,
-     DISPID dispID);
-
-
-void __stdcall IPropertyNotifySink_OnRequestEdit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES;
-
-typedef struct tagCAUUID
-    {
-    ULONG cElems;
-     GUID *pElems;
-    } 	CAUUID;
-
-typedef struct tagCAUUID *LPCAUUID;
-
-
-extern "C" const IID IID_ISpecifyPropertyPages;
-
-
-    
-    struct __declspec(uuid("B196B28B-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    ISpecifyPropertyPages : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetPages( 
-             CAUUID *pPages) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISpecifyPropertyPages_GetPages_Proxy( 
-    ISpecifyPropertyPages * This,
-     CAUUID *pPages);
-
-
-void __stdcall ISpecifyPropertyPages_GetPages_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPersistMemory *LPPERSISTMEMORY;
-
-
-extern "C" const IID IID_IPersistMemory;
-
-
-    
-    struct __declspec(uuid("BD1AE5E0-A6AE-11CE-BD37-504200C10000")) __declspec(novtable)
-    IPersistMemory : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual  HRESULT __stdcall Load( 
-             LPVOID pMem,
-             ULONG cbSize) = 0;
-        
-        virtual  HRESULT __stdcall Save( 
-             LPVOID pMem,
-             BOOL fClearDirty,
-             ULONG cbSize) = 0;
-        
-        virtual HRESULT __stdcall GetSizeMax( 
-             ULONG *pCbSize) = 0;
-        
-        virtual HRESULT __stdcall InitNew( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistMemory_IsDirty_Proxy( 
-    IPersistMemory * This);
-
-
-void __stdcall IPersistMemory_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IPersistMemory_RemoteLoad_Proxy( 
-    IPersistMemory * This,
-     BYTE *pMem,
-     ULONG cbSize);
-
-
-void __stdcall IPersistMemory_RemoteLoad_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IPersistMemory_RemoteSave_Proxy( 
-    IPersistMemory * This,
-     BYTE *pMem,
-     BOOL fClearDirty,
-     ULONG cbSize);
-
-
-void __stdcall IPersistMemory_RemoteSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMemory_GetSizeMax_Proxy( 
-    IPersistMemory * This,
-     ULONG *pCbSize);
-
-
-void __stdcall IPersistMemory_GetSizeMax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMemory_InitNew_Proxy( 
-    IPersistMemory * This);
-
-
-void __stdcall IPersistMemory_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPersistStreamInit *LPPERSISTSTREAMINIT;
-
-
-extern "C" const IID IID_IPersistStreamInit;
-
-
-    
-    struct __declspec(uuid("7FD52380-4E07-101B-AE2D-08002B2EC713")) __declspec(novtable)
-    IPersistStreamInit : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             LPSTREAM pStm) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             LPSTREAM pStm,
-             BOOL fClearDirty) = 0;
-        
-        virtual HRESULT __stdcall GetSizeMax( 
-             ULARGE_INTEGER *pCbSize) = 0;
-        
-        virtual HRESULT __stdcall InitNew( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistStreamInit_IsDirty_Proxy( 
-    IPersistStreamInit * This);
-
-
-void __stdcall IPersistStreamInit_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStreamInit_Load_Proxy( 
-    IPersistStreamInit * This,
-     LPSTREAM pStm);
-
-
-void __stdcall IPersistStreamInit_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStreamInit_Save_Proxy( 
-    IPersistStreamInit * This,
-     LPSTREAM pStm,
-     BOOL fClearDirty);
-
-
-void __stdcall IPersistStreamInit_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStreamInit_GetSizeMax_Proxy( 
-    IPersistStreamInit * This,
-     ULARGE_INTEGER *pCbSize);
-
-
-void __stdcall IPersistStreamInit_GetSizeMax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStreamInit_InitNew_Proxy( 
-    IPersistStreamInit * This);
-
-
-void __stdcall IPersistStreamInit_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPersistPropertyBag *LPPERSISTPROPERTYBAG;
-
-
-extern "C" const IID IID_IPersistPropertyBag;
-
-
-    
-    struct __declspec(uuid("37D84F60-42CB-11CE-8135-00AA004BB851")) __declspec(novtable)
-    IPersistPropertyBag : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall InitNew( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             IPropertyBag *pPropBag,
-             IErrorLog *pErrorLog) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IPropertyBag *pPropBag,
-             BOOL fClearDirty,
-             BOOL fSaveAllProperties) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistPropertyBag_InitNew_Proxy( 
-    IPersistPropertyBag * This);
-
-
-void __stdcall IPersistPropertyBag_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag_Load_Proxy( 
-    IPersistPropertyBag * This,
-     IPropertyBag *pPropBag,
-     IErrorLog *pErrorLog);
-
-
-void __stdcall IPersistPropertyBag_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag_Save_Proxy( 
-    IPersistPropertyBag * This,
-     IPropertyBag *pPropBag,
-     BOOL fClearDirty,
-     BOOL fSaveAllProperties);
-
-
-void __stdcall IPersistPropertyBag_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef ISimpleFrameSite *LPSIMPLEFRAMESITE;
-
-
-extern "C" const IID IID_ISimpleFrameSite;
-
-
-    
-    struct __declspec(uuid("742B0E01-14E6-101B-914E-00AA00300CAB")) __declspec(novtable)
-    ISimpleFrameSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall PreMessageFilter( 
-             HWND hWnd,
-             UINT msg,
-             WPARAM wp,
-             LPARAM lp,
-             LRESULT *plResult,
-             DWORD *pdwCookie) = 0;
-        
-        virtual HRESULT __stdcall PostMessageFilter( 
-             HWND hWnd,
-             UINT msg,
-             WPARAM wp,
-             LPARAM lp,
-             LRESULT *plResult,
-             DWORD dwCookie) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISimpleFrameSite_PreMessageFilter_Proxy( 
-    ISimpleFrameSite * This,
-     HWND hWnd,
-     UINT msg,
-     WPARAM wp,
-     LPARAM lp,
-     LRESULT *plResult,
-     DWORD *pdwCookie);
-
-
-void __stdcall ISimpleFrameSite_PreMessageFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISimpleFrameSite_PostMessageFilter_Proxy( 
-    ISimpleFrameSite * This,
-     HWND hWnd,
-     UINT msg,
-     WPARAM wp,
-     LPARAM lp,
-     LRESULT *plResult,
-     DWORD dwCookie);
-
-
-void __stdcall ISimpleFrameSite_PostMessageFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IFont *LPFONT;
-
-
-typedef TEXTMETRICW TEXTMETRICW;
-
-
-
-
-typedef TEXTMETRICW *LPTEXTMETRICW;
-
-
-extern "C" const IID IID_IFont;
-
-
-    
-    struct __declspec(uuid("BEF6E002-A874-101A-8BBA-00AA00300CAB")) __declspec(novtable)
-    IFont : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall get_Name( 
-             BSTR *pName) = 0;
-        
-        virtual HRESULT __stdcall put_Name( 
-             BSTR name) = 0;
-        
-        virtual HRESULT __stdcall get_Size( 
-             CY *pSize) = 0;
-        
-        virtual HRESULT __stdcall put_Size( 
-             CY size) = 0;
-        
-        virtual HRESULT __stdcall get_Bold( 
-             BOOL *pBold) = 0;
-        
-        virtual HRESULT __stdcall put_Bold( 
-             BOOL bold) = 0;
-        
-        virtual HRESULT __stdcall get_Italic( 
-             BOOL *pItalic) = 0;
-        
-        virtual HRESULT __stdcall put_Italic( 
-             BOOL italic) = 0;
-        
-        virtual HRESULT __stdcall get_Underline( 
-             BOOL *pUnderline) = 0;
-        
-        virtual HRESULT __stdcall put_Underline( 
-             BOOL underline) = 0;
-        
-        virtual HRESULT __stdcall get_Strikethrough( 
-             BOOL *pStrikethrough) = 0;
-        
-        virtual HRESULT __stdcall put_Strikethrough( 
-             BOOL strikethrough) = 0;
-        
-        virtual HRESULT __stdcall get_Weight( 
-             SHORT *pWeight) = 0;
-        
-        virtual HRESULT __stdcall put_Weight( 
-             SHORT weight) = 0;
-        
-        virtual HRESULT __stdcall get_Charset( 
-             SHORT *pCharset) = 0;
-        
-        virtual HRESULT __stdcall put_Charset( 
-             SHORT charset) = 0;
-        
-        virtual HRESULT __stdcall get_hFont( 
-             HFONT *phFont) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IFont **ppFont) = 0;
-        
-        virtual HRESULT __stdcall IsEqual( 
-             IFont *pFontOther) = 0;
-        
-        virtual HRESULT __stdcall SetRatio( 
-             LONG cyLogical,
-             LONG cyHimetric) = 0;
-        
-        virtual HRESULT __stdcall QueryTextMetrics( 
-             TEXTMETRICW *pTM) = 0;
-        
-        virtual HRESULT __stdcall AddRefHfont( 
-             HFONT hFont) = 0;
-        
-        virtual HRESULT __stdcall ReleaseHfont( 
-             HFONT hFont) = 0;
-        
-        virtual HRESULT __stdcall SetHdc( 
-             HDC hDC) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IFont_get_Name_Proxy( 
-    IFont * This,
-     BSTR *pName);
-
-
-void __stdcall IFont_get_Name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Name_Proxy( 
-    IFont * This,
-     BSTR name);
-
-
-void __stdcall IFont_put_Name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Size_Proxy( 
-    IFont * This,
-     CY *pSize);
-
-
-void __stdcall IFont_get_Size_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Size_Proxy( 
-    IFont * This,
-     CY size);
-
-
-void __stdcall IFont_put_Size_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Bold_Proxy( 
-    IFont * This,
-     BOOL *pBold);
-
-
-void __stdcall IFont_get_Bold_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Bold_Proxy( 
-    IFont * This,
-     BOOL bold);
-
-
-void __stdcall IFont_put_Bold_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Italic_Proxy( 
-    IFont * This,
-     BOOL *pItalic);
-
-
-void __stdcall IFont_get_Italic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Italic_Proxy( 
-    IFont * This,
-     BOOL italic);
-
-
-void __stdcall IFont_put_Italic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Underline_Proxy( 
-    IFont * This,
-     BOOL *pUnderline);
-
-
-void __stdcall IFont_get_Underline_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Underline_Proxy( 
-    IFont * This,
-     BOOL underline);
-
-
-void __stdcall IFont_put_Underline_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Strikethrough_Proxy( 
-    IFont * This,
-     BOOL *pStrikethrough);
-
-
-void __stdcall IFont_get_Strikethrough_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Strikethrough_Proxy( 
-    IFont * This,
-     BOOL strikethrough);
-
-
-void __stdcall IFont_put_Strikethrough_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Weight_Proxy( 
-    IFont * This,
-     SHORT *pWeight);
-
-
-void __stdcall IFont_get_Weight_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Weight_Proxy( 
-    IFont * This,
-     SHORT weight);
-
-
-void __stdcall IFont_put_Weight_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Charset_Proxy( 
-    IFont * This,
-     SHORT *pCharset);
-
-
-void __stdcall IFont_get_Charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Charset_Proxy( 
-    IFont * This,
-     SHORT charset);
-
-
-void __stdcall IFont_put_Charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_hFont_Proxy( 
-    IFont * This,
-     HFONT *phFont);
-
-
-void __stdcall IFont_get_hFont_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_Clone_Proxy( 
-    IFont * This,
-     IFont **ppFont);
-
-
-void __stdcall IFont_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_IsEqual_Proxy( 
-    IFont * This,
-     IFont *pFontOther);
-
-
-void __stdcall IFont_IsEqual_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_SetRatio_Proxy( 
-    IFont * This,
-     LONG cyLogical,
-     LONG cyHimetric);
-
-
-void __stdcall IFont_SetRatio_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_QueryTextMetrics_Proxy( 
-    IFont * This,
-     TEXTMETRICW *pTM);
-
-
-void __stdcall IFont_QueryTextMetrics_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_AddRefHfont_Proxy( 
-    IFont * This,
-     HFONT hFont);
-
-
-void __stdcall IFont_AddRefHfont_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_ReleaseHfont_Proxy( 
-    IFont * This,
-     HFONT hFont);
-
-
-void __stdcall IFont_ReleaseHfont_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_SetHdc_Proxy( 
-    IFont * This,
-     HDC hDC);
-
-
-void __stdcall IFont_SetHdc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPicture *LPPICTURE;
-
-typedef 
-enum tagPictureAttributes
-    {	PICTURE_SCALABLE	= 0x1,
-	PICTURE_TRANSPARENT	= 0x2
-    } 	PICTUREATTRIBUTES;
-
-typedef   __declspec(uuid("66504313-BE0F-101A-8BBB-00AA00300CAB")) UINT OLE_HANDLE;
-
-typedef   __declspec(uuid("66504306-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_XPOS_HIMETRIC;
-
-typedef   __declspec(uuid("66504307-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_YPOS_HIMETRIC;
-
-typedef   __declspec(uuid("66504308-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_XSIZE_HIMETRIC;
-
-typedef   __declspec(uuid("66504309-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_YSIZE_HIMETRIC;
-
-
-extern "C" const IID IID_IPicture;
-
-
-    
-    struct __declspec(uuid("7BF80980-BF32-101A-8BBB-00AA00300CAB")) __declspec(novtable)
-    IPicture : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall get_Handle( 
-             OLE_HANDLE *pHandle) = 0;
-        
-        virtual HRESULT __stdcall get_hPal( 
-             OLE_HANDLE *phPal) = 0;
-        
-        virtual HRESULT __stdcall get_Type( 
-             SHORT *pType) = 0;
-        
-        virtual HRESULT __stdcall get_Width( 
-             OLE_XSIZE_HIMETRIC *pWidth) = 0;
-        
-        virtual HRESULT __stdcall get_Height( 
-             OLE_YSIZE_HIMETRIC *pHeight) = 0;
-        
-        virtual HRESULT __stdcall Render( 
-             HDC hDC,
-             LONG x,
-             LONG y,
-             LONG cx,
-             LONG cy,
-             OLE_XPOS_HIMETRIC xSrc,
-             OLE_YPOS_HIMETRIC ySrc,
-             OLE_XSIZE_HIMETRIC cxSrc,
-             OLE_YSIZE_HIMETRIC cySrc,
-             LPCRECT pRcWBounds) = 0;
-        
-        virtual HRESULT __stdcall set_hPal( 
-             OLE_HANDLE hPal) = 0;
-        
-        virtual HRESULT __stdcall get_CurDC( 
-             HDC *phDC) = 0;
-        
-        virtual HRESULT __stdcall SelectPicture( 
-             HDC hDCIn,
-             HDC *phDCOut,
-             OLE_HANDLE *phBmpOut) = 0;
-        
-        virtual HRESULT __stdcall get_KeepOriginalFormat( 
-             BOOL *pKeep) = 0;
-        
-        virtual HRESULT __stdcall put_KeepOriginalFormat( 
-             BOOL keep) = 0;
-        
-        virtual HRESULT __stdcall PictureChanged( void) = 0;
-        
-        virtual HRESULT __stdcall SaveAsFile( 
-             LPSTREAM pStream,
-             BOOL fSaveMemCopy,
-             LONG *pCbSize) = 0;
-        
-        virtual HRESULT __stdcall get_Attributes( 
-             DWORD *pDwAttr) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPicture_get_Handle_Proxy( 
-    IPicture * This,
-     OLE_HANDLE *pHandle);
-
-
-void __stdcall IPicture_get_Handle_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_hPal_Proxy( 
-    IPicture * This,
-     OLE_HANDLE *phPal);
-
-
-void __stdcall IPicture_get_hPal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_Type_Proxy( 
-    IPicture * This,
-     SHORT *pType);
-
-
-void __stdcall IPicture_get_Type_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_Width_Proxy( 
-    IPicture * This,
-     OLE_XSIZE_HIMETRIC *pWidth);
-
-
-void __stdcall IPicture_get_Width_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_Height_Proxy( 
-    IPicture * This,
-     OLE_YSIZE_HIMETRIC *pHeight);
-
-
-void __stdcall IPicture_get_Height_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_Render_Proxy( 
-    IPicture * This,
-     HDC hDC,
-     LONG x,
-     LONG y,
-     LONG cx,
-     LONG cy,
-     OLE_XPOS_HIMETRIC xSrc,
-     OLE_YPOS_HIMETRIC ySrc,
-     OLE_XSIZE_HIMETRIC cxSrc,
-     OLE_YSIZE_HIMETRIC cySrc,
-     LPCRECT pRcWBounds);
-
-
-void __stdcall IPicture_Render_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_set_hPal_Proxy( 
-    IPicture * This,
-     OLE_HANDLE hPal);
-
-
-void __stdcall IPicture_set_hPal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_CurDC_Proxy( 
-    IPicture * This,
-     HDC *phDC);
-
-
-void __stdcall IPicture_get_CurDC_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_SelectPicture_Proxy( 
-    IPicture * This,
-     HDC hDCIn,
-     HDC *phDCOut,
-     OLE_HANDLE *phBmpOut);
-
-
-void __stdcall IPicture_SelectPicture_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_KeepOriginalFormat_Proxy( 
-    IPicture * This,
-     BOOL *pKeep);
-
-
-void __stdcall IPicture_get_KeepOriginalFormat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_put_KeepOriginalFormat_Proxy( 
-    IPicture * This,
-     BOOL keep);
-
-
-void __stdcall IPicture_put_KeepOriginalFormat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_PictureChanged_Proxy( 
-    IPicture * This);
-
-
-void __stdcall IPicture_PictureChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_SaveAsFile_Proxy( 
-    IPicture * This,
-     LPSTREAM pStream,
-     BOOL fSaveMemCopy,
-     LONG *pCbSize);
-
-
-void __stdcall IPicture_SaveAsFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_Attributes_Proxy( 
-    IPicture * This,
-     DWORD *pDwAttr);
-
-
-void __stdcall IPicture_get_Attributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IFontEventsDisp *LPFONTEVENTS;
-
-
-extern "C" const IID IID_IFontEventsDisp;
-
-
-    
-    struct __declspec(uuid("4EF6100A-AF88-11D0-9846-00C04FC29993")) __declspec(novtable)
-    IFontEventsDisp : public IDispatch
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IFontDisp *LPFONTDISP;
-
-
-extern "C" const IID IID_IFontDisp;
-
-
-    
-    struct __declspec(uuid("BEF6E003-A874-101A-8BBA-00AA00300CAB")) __declspec(novtable)
-    IFontDisp : public IDispatch
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPictureDisp *LPPICTUREDISP;
-
-
-extern "C" const IID IID_IPictureDisp;
-
-
-    
-    struct __declspec(uuid("7BF80981-BF32-101A-8BBB-00AA00300CAB")) __declspec(novtable)
-    IPictureDisp : public IDispatch
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleInPlaceObjectWindowless *LPOLEINPLACEOBJECTWINDOWLESS;
-
-
-extern "C" const IID IID_IOleInPlaceObjectWindowless;
-
-
-    
-    struct __declspec(uuid("1C2056CC-5EF4-101B-8BC8-00AA003E3B29")) __declspec(novtable)
-    IOleInPlaceObjectWindowless : public IOleInPlaceObject
-    {
-    public:
-        virtual HRESULT __stdcall OnWindowMessage( 
-             UINT msg,
-             WPARAM wParam,
-             LPARAM lParam,
-             LRESULT *plResult) = 0;
-        
-        virtual HRESULT __stdcall GetDropTarget( 
-             IDropTarget **ppDropTarget) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceObjectWindowless_OnWindowMessage_Proxy( 
-    IOleInPlaceObjectWindowless * This,
-     UINT msg,
-     WPARAM wParam,
-     LPARAM lParam,
-     LRESULT *plResult);
-
-
-void __stdcall IOleInPlaceObjectWindowless_OnWindowMessage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceObjectWindowless_GetDropTarget_Proxy( 
-    IOleInPlaceObjectWindowless * This,
-     IDropTarget **ppDropTarget);
-
-
-void __stdcall IOleInPlaceObjectWindowless_GetDropTarget_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleInPlaceSiteEx *LPOLEINPLACESITEEX;
-
-typedef  
-enum tagACTIVATEFLAGS
-    {	ACTIVATE_WINDOWLESS	= 1
-    } 	ACTIVATEFLAGS;
-
-
-extern "C" const IID IID_IOleInPlaceSiteEx;
-
-
-    
-    struct __declspec(uuid("9C2CAD80-3424-11CF-B670-00AA004CD6D8")) __declspec(novtable)
-    IOleInPlaceSiteEx : public IOleInPlaceSite
-    {
-    public:
-        virtual HRESULT __stdcall OnInPlaceActivateEx( 
-             BOOL *pfNoRedraw,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall OnInPlaceDeactivateEx( 
-             BOOL fNoRedraw) = 0;
-        
-        virtual HRESULT __stdcall RequestUIActivate( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceSiteEx_OnInPlaceActivateEx_Proxy( 
-    IOleInPlaceSiteEx * This,
-     BOOL *pfNoRedraw,
-     DWORD dwFlags);
-
-
-void __stdcall IOleInPlaceSiteEx_OnInPlaceActivateEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteEx_OnInPlaceDeactivateEx_Proxy( 
-    IOleInPlaceSiteEx * This,
-     BOOL fNoRedraw);
-
-
-void __stdcall IOleInPlaceSiteEx_OnInPlaceDeactivateEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteEx_RequestUIActivate_Proxy( 
-    IOleInPlaceSiteEx * This);
-
-
-void __stdcall IOleInPlaceSiteEx_RequestUIActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleInPlaceSiteWindowless *LPOLEINPLACESITEWINDOWLESS;
-
-typedef  
-enum tagOLEDCFLAGS
-    {	OLEDC_NODRAW	= 0x1,
-	OLEDC_PAINTBKGND	= 0x2,
-	OLEDC_OFFSCREEN	= 0x4
-    } 	OLEDCFLAGS;
-
-
-extern "C" const IID IID_IOleInPlaceSiteWindowless;
-
-
-    
-    struct __declspec(uuid("922EADA0-3424-11CF-B670-00AA004CD6D8")) __declspec(novtable)
-    IOleInPlaceSiteWindowless : public IOleInPlaceSiteEx
-    {
-    public:
-        virtual HRESULT __stdcall CanWindowlessActivate( void) = 0;
-        
-        virtual HRESULT __stdcall GetCapture( void) = 0;
-        
-        virtual HRESULT __stdcall SetCapture( 
-             BOOL fCapture) = 0;
-        
-        virtual HRESULT __stdcall GetFocus( void) = 0;
-        
-        virtual HRESULT __stdcall SetFocus( 
-             BOOL fFocus) = 0;
-        
-        virtual HRESULT __stdcall GetDC( 
-             LPCRECT pRect,
-             DWORD grfFlags,
-             HDC *phDC) = 0;
-        
-        virtual HRESULT __stdcall ReleaseDC( 
-             HDC hDC) = 0;
-        
-        virtual HRESULT __stdcall InvalidateRect( 
-             LPCRECT pRect,
-             BOOL fErase) = 0;
-        
-        virtual HRESULT __stdcall InvalidateRgn( 
-             HRGN hRGN,
-             BOOL fErase) = 0;
-        
-        virtual HRESULT __stdcall ScrollRect( 
-             INT dx,
-             INT dy,
-             LPCRECT pRectScroll,
-             LPCRECT pRectClip) = 0;
-        
-        virtual HRESULT __stdcall AdjustRect( 
-             LPRECT prc) = 0;
-        
-        virtual HRESULT __stdcall OnDefWindowMessage( 
-             UINT msg,
-             WPARAM wParam,
-             LPARAM lParam,
-             LRESULT *plResult) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_CanWindowlessActivate_Proxy( 
-    IOleInPlaceSiteWindowless * This);
-
-
-void __stdcall IOleInPlaceSiteWindowless_CanWindowlessActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_GetCapture_Proxy( 
-    IOleInPlaceSiteWindowless * This);
-
-
-void __stdcall IOleInPlaceSiteWindowless_GetCapture_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_SetCapture_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     BOOL fCapture);
-
-
-void __stdcall IOleInPlaceSiteWindowless_SetCapture_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_GetFocus_Proxy( 
-    IOleInPlaceSiteWindowless * This);
-
-
-void __stdcall IOleInPlaceSiteWindowless_GetFocus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_SetFocus_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     BOOL fFocus);
-
-
-void __stdcall IOleInPlaceSiteWindowless_SetFocus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_GetDC_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     LPCRECT pRect,
-     DWORD grfFlags,
-     HDC *phDC);
-
-
-void __stdcall IOleInPlaceSiteWindowless_GetDC_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_ReleaseDC_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     HDC hDC);
-
-
-void __stdcall IOleInPlaceSiteWindowless_ReleaseDC_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_InvalidateRect_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     LPCRECT pRect,
-     BOOL fErase);
-
-
-void __stdcall IOleInPlaceSiteWindowless_InvalidateRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_InvalidateRgn_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     HRGN hRGN,
-     BOOL fErase);
-
-
-void __stdcall IOleInPlaceSiteWindowless_InvalidateRgn_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_ScrollRect_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     INT dx,
-     INT dy,
-     LPCRECT pRectScroll,
-     LPCRECT pRectClip);
-
-
-void __stdcall IOleInPlaceSiteWindowless_ScrollRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_AdjustRect_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     LPRECT prc);
-
-
-void __stdcall IOleInPlaceSiteWindowless_AdjustRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_OnDefWindowMessage_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     UINT msg,
-     WPARAM wParam,
-     LPARAM lParam,
-     LRESULT *plResult);
-
-
-void __stdcall IOleInPlaceSiteWindowless_OnDefWindowMessage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IViewObjectEx *LPVIEWOBJECTEX;
-
-typedef  
-enum tagVIEWSTATUS
-    {	VIEWSTATUS_OPAQUE	= 1,
-	VIEWSTATUS_SOLIDBKGND	= 2,
-	VIEWSTATUS_DVASPECTOPAQUE	= 4,
-	VIEWSTATUS_DVASPECTTRANSPARENT	= 8,
-	VIEWSTATUS_SURFACE	= 16,
-	VIEWSTATUS_3DSURFACE	= 32
-    } 	VIEWSTATUS;
-
-typedef  
-enum tagHITRESULT
-    {	HITRESULT_OUTSIDE	= 0,
-	HITRESULT_TRANSPARENT	= 1,
-	HITRESULT_CLOSE	= 2,
-	HITRESULT_HIT	= 3
-    } 	HITRESULT;
-
-typedef  
-enum tagDVASPECT2
-    {	DVASPECT_OPAQUE	= 16,
-	DVASPECT_TRANSPARENT	= 32
-    } 	DVASPECT2;
-
-typedef struct tagExtentInfo
-    {
-    ULONG cb;
-    DWORD dwExtentMode;
-    SIZEL sizelProposed;
-    } 	DVEXTENTINFO;
-
-typedef  
-enum tagExtentMode
-    {	DVEXTENT_CONTENT	= 0,
-	DVEXTENT_INTEGRAL	= DVEXTENT_CONTENT + 1
-    } 	DVEXTENTMODE;
-
-typedef  
-enum tagAspectInfoFlag
-    {	DVASPECTINFOFLAG_CANOPTIMIZE	= 1
-    } 	DVASPECTINFOFLAG;
-
-typedef struct tagAspectInfo
-    {
-    ULONG cb;
-    DWORD dwFlags;
-    } 	DVASPECTINFO;
-
-
-extern "C" const IID IID_IViewObjectEx;
-
-
-    
-    struct __declspec(uuid("3AF24292-0C96-11CE-A0CF-00AA00600AB8")) __declspec(novtable)
-    IViewObjectEx : public IViewObject2
-    {
-    public:
-        virtual HRESULT __stdcall GetRect( 
-             DWORD dwAspect,
-             LPRECTL pRect) = 0;
-        
-        virtual HRESULT __stdcall GetViewStatus( 
-             DWORD *pdwStatus) = 0;
-        
-        virtual HRESULT __stdcall QueryHitPoint( 
-             DWORD dwAspect,
-             LPCRECT pRectBounds,
-             POINT ptlLoc,
-             LONG lCloseHint,
-             DWORD *pHitResult) = 0;
-        
-        virtual HRESULT __stdcall QueryHitRect( 
-             DWORD dwAspect,
-             LPCRECT pRectBounds,
-             LPCRECT pRectLoc,
-             LONG lCloseHint,
-             DWORD *pHitResult) = 0;
-        
-        virtual HRESULT __stdcall GetNaturalExtent( 
-             DWORD dwAspect,
-             LONG lindex,
-             DVTARGETDEVICE *ptd,
-             HDC hicTargetDev,
-             DVEXTENTINFO *pExtentInfo,
-             LPSIZEL pSizel) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IViewObjectEx_GetRect_Proxy( 
-    IViewObjectEx * This,
-     DWORD dwAspect,
-     LPRECTL pRect);
-
-
-void __stdcall IViewObjectEx_GetRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObjectEx_GetViewStatus_Proxy( 
-    IViewObjectEx * This,
-     DWORD *pdwStatus);
-
-
-void __stdcall IViewObjectEx_GetViewStatus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObjectEx_QueryHitPoint_Proxy( 
-    IViewObjectEx * This,
-     DWORD dwAspect,
-     LPCRECT pRectBounds,
-     POINT ptlLoc,
-     LONG lCloseHint,
-     DWORD *pHitResult);
-
-
-void __stdcall IViewObjectEx_QueryHitPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObjectEx_QueryHitRect_Proxy( 
-    IViewObjectEx * This,
-     DWORD dwAspect,
-     LPCRECT pRectBounds,
-     LPCRECT pRectLoc,
-     LONG lCloseHint,
-     DWORD *pHitResult);
-
-
-void __stdcall IViewObjectEx_QueryHitRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObjectEx_GetNaturalExtent_Proxy( 
-    IViewObjectEx * This,
-     DWORD dwAspect,
-     LONG lindex,
-     DVTARGETDEVICE *ptd,
-     HDC hicTargetDev,
-     DVEXTENTINFO *pExtentInfo,
-     LPSIZEL pSizel);
-
-
-void __stdcall IViewObjectEx_GetNaturalExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleUndoUnit *LPOLEUNDOUNIT;
-
-
-extern "C" const IID IID_IOleUndoUnit;
-
-
-    
-    struct __declspec(uuid("894AD3B0-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
-    IOleUndoUnit : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Do( 
-             IOleUndoManager *pUndoManager) = 0;
-        
-        virtual HRESULT __stdcall GetDescription( 
-             BSTR *pBstr) = 0;
-        
-        virtual HRESULT __stdcall GetUnitType( 
-             CLSID *pClsid,
-             LONG *plID) = 0;
-        
-        virtual HRESULT __stdcall OnNextAdd( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleUndoUnit_Do_Proxy( 
-    IOleUndoUnit * This,
-     IOleUndoManager *pUndoManager);
-
-
-void __stdcall IOleUndoUnit_Do_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoUnit_GetDescription_Proxy( 
-    IOleUndoUnit * This,
-     BSTR *pBstr);
-
-
-void __stdcall IOleUndoUnit_GetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoUnit_GetUnitType_Proxy( 
-    IOleUndoUnit * This,
-     CLSID *pClsid,
-     LONG *plID);
-
-
-void __stdcall IOleUndoUnit_GetUnitType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoUnit_OnNextAdd_Proxy( 
-    IOleUndoUnit * This);
-
-
-void __stdcall IOleUndoUnit_OnNextAdd_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleParentUndoUnit *LPOLEPARENTUNDOUNIT;
-
-
-extern "C" const IID IID_IOleParentUndoUnit;
-
-
-    
-    struct __declspec(uuid("A1FAF330-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
-    IOleParentUndoUnit : public IOleUndoUnit
-    {
-    public:
-        virtual HRESULT __stdcall Open( 
-             IOleParentUndoUnit *pPUU) = 0;
-        
-        virtual HRESULT __stdcall Close( 
-             IOleParentUndoUnit *pPUU,
-             BOOL fCommit) = 0;
-        
-        virtual HRESULT __stdcall Add( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall FindUnit( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall GetParentState( 
-             DWORD *pdwState) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleParentUndoUnit_Open_Proxy( 
-    IOleParentUndoUnit * This,
-     IOleParentUndoUnit *pPUU);
-
-
-void __stdcall IOleParentUndoUnit_Open_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleParentUndoUnit_Close_Proxy( 
-    IOleParentUndoUnit * This,
-     IOleParentUndoUnit *pPUU,
-     BOOL fCommit);
-
-
-void __stdcall IOleParentUndoUnit_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleParentUndoUnit_Add_Proxy( 
-    IOleParentUndoUnit * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleParentUndoUnit_Add_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleParentUndoUnit_FindUnit_Proxy( 
-    IOleParentUndoUnit * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleParentUndoUnit_FindUnit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleParentUndoUnit_GetParentState_Proxy( 
-    IOleParentUndoUnit * This,
-     DWORD *pdwState);
-
-
-void __stdcall IOleParentUndoUnit_GetParentState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IEnumOleUndoUnits *LPENUMOLEUNDOUNITS;
-
-
-extern "C" const IID IID_IEnumOleUndoUnits;
-
-
-    
-    struct __declspec(uuid("B3E7C340-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
-    IEnumOleUndoUnits : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG cElt,
-             IOleUndoUnit **rgElt,
-             ULONG *pcEltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG cElt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumOleUndoUnits **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumOleUndoUnits_RemoteNext_Proxy( 
-    IEnumOleUndoUnits * This,
-     ULONG cElt,
-     IOleUndoUnit **rgElt,
-     ULONG *pcEltFetched);
-
-
-void __stdcall IEnumOleUndoUnits_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOleUndoUnits_Skip_Proxy( 
-    IEnumOleUndoUnits * This,
-     ULONG cElt);
-
-
-void __stdcall IEnumOleUndoUnits_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOleUndoUnits_Reset_Proxy( 
-    IEnumOleUndoUnits * This);
-
-
-void __stdcall IEnumOleUndoUnits_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOleUndoUnits_Clone_Proxy( 
-    IEnumOleUndoUnits * This,
-     IEnumOleUndoUnits **ppEnum);
-
-
-void __stdcall IEnumOleUndoUnits_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-typedef IOleUndoManager *LPOLEUNDOMANAGER;
-
-
-extern "C" const IID IID_IOleUndoManager;
-
-
-    
-    struct __declspec(uuid("D001F200-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
-    IOleUndoManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Open( 
-             IOleParentUndoUnit *pPUU) = 0;
-        
-        virtual HRESULT __stdcall Close( 
-             IOleParentUndoUnit *pPUU,
-             BOOL fCommit) = 0;
-        
-        virtual HRESULT __stdcall Add( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall GetOpenParentState( 
-             DWORD *pdwState) = 0;
-        
-        virtual HRESULT __stdcall DiscardFrom( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall UndoTo( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall RedoTo( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall EnumUndoable( 
-             IEnumOleUndoUnits **ppEnum) = 0;
-        
-        virtual HRESULT __stdcall EnumRedoable( 
-             IEnumOleUndoUnits **ppEnum) = 0;
-        
-        virtual HRESULT __stdcall GetLastUndoDescription( 
-             BSTR *pBstr) = 0;
-        
-        virtual HRESULT __stdcall GetLastRedoDescription( 
-             BSTR *pBstr) = 0;
-        
-        virtual HRESULT __stdcall Enable( 
-             BOOL fEnable) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleUndoManager_Open_Proxy( 
-    IOleUndoManager * This,
-     IOleParentUndoUnit *pPUU);
-
-
-void __stdcall IOleUndoManager_Open_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_Close_Proxy( 
-    IOleUndoManager * This,
-     IOleParentUndoUnit *pPUU,
-     BOOL fCommit);
-
-
-void __stdcall IOleUndoManager_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_Add_Proxy( 
-    IOleUndoManager * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleUndoManager_Add_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_GetOpenParentState_Proxy( 
-    IOleUndoManager * This,
-     DWORD *pdwState);
-
-
-void __stdcall IOleUndoManager_GetOpenParentState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_DiscardFrom_Proxy( 
-    IOleUndoManager * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleUndoManager_DiscardFrom_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_UndoTo_Proxy( 
-    IOleUndoManager * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleUndoManager_UndoTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_RedoTo_Proxy( 
-    IOleUndoManager * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleUndoManager_RedoTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_EnumUndoable_Proxy( 
-    IOleUndoManager * This,
-     IEnumOleUndoUnits **ppEnum);
-
-
-void __stdcall IOleUndoManager_EnumUndoable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_EnumRedoable_Proxy( 
-    IOleUndoManager * This,
-     IEnumOleUndoUnits **ppEnum);
-
-
-void __stdcall IOleUndoManager_EnumRedoable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_GetLastUndoDescription_Proxy( 
-    IOleUndoManager * This,
-     BSTR *pBstr);
-
-
-void __stdcall IOleUndoManager_GetLastUndoDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_GetLastRedoDescription_Proxy( 
-    IOleUndoManager * This,
-     BSTR *pBstr);
-
-
-void __stdcall IOleUndoManager_GetLastRedoDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_Enable_Proxy( 
-    IOleUndoManager * This,
-     BOOL fEnable);
-
-
-void __stdcall IOleUndoManager_Enable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPointerInactive *LPPOINTERINACTIVE;
-
-typedef  
-enum tagPOINTERINACTIVE
-    {	POINTERINACTIVE_ACTIVATEONENTRY	= 1,
-	POINTERINACTIVE_DEACTIVATEONLEAVE	= 2,
-	POINTERINACTIVE_ACTIVATEONDRAG	= 4
-    } 	POINTERINACTIVE;
-
-
-extern "C" const IID IID_IPointerInactive;
-
-
-    
-    struct __declspec(uuid("55980BA0-35AA-11CF-B671-00AA004CD6D8")) __declspec(novtable)
-    IPointerInactive : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetActivationPolicy( 
-             DWORD *pdwPolicy) = 0;
-        
-        virtual HRESULT __stdcall OnInactiveMouseMove( 
-             LPCRECT pRectBounds,
-             LONG x,
-             LONG y,
-             DWORD grfKeyState) = 0;
-        
-        virtual HRESULT __stdcall OnInactiveSetCursor( 
-             LPCRECT pRectBounds,
-             LONG x,
-             LONG y,
-             DWORD dwMouseMsg,
-             BOOL fSetAlways) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPointerInactive_GetActivationPolicy_Proxy( 
-    IPointerInactive * This,
-     DWORD *pdwPolicy);
-
-
-void __stdcall IPointerInactive_GetActivationPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPointerInactive_OnInactiveMouseMove_Proxy( 
-    IPointerInactive * This,
-     LPCRECT pRectBounds,
-     LONG x,
-     LONG y,
-     DWORD grfKeyState);
-
-
-void __stdcall IPointerInactive_OnInactiveMouseMove_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPointerInactive_OnInactiveSetCursor_Proxy( 
-    IPointerInactive * This,
-     LPCRECT pRectBounds,
-     LONG x,
-     LONG y,
-     DWORD dwMouseMsg,
-     BOOL fSetAlways);
-
-
-void __stdcall IPointerInactive_OnInactiveSetCursor_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IObjectWithSite *LPOBJECTWITHSITE;
-
-
-extern "C" const IID IID_IObjectWithSite;
-
-
-    
-    struct __declspec(uuid("FC4801A3-2BA9-11CF-A229-00AA003D7352")) __declspec(novtable)
-    IObjectWithSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetSite( 
-             IUnknown *pUnkSite) = 0;
-        
-        virtual HRESULT __stdcall GetSite( 
-             const IID & riid,
-             void **ppvSite) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IObjectWithSite_SetSite_Proxy( 
-    IObjectWithSite * This,
-     IUnknown *pUnkSite);
-
-
-void __stdcall IObjectWithSite_SetSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IObjectWithSite_GetSite_Proxy( 
-    IObjectWithSite * This,
-     const IID & riid,
-     void **ppvSite);
-
-
-void __stdcall IObjectWithSite_GetSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPerPropertyBrowsing *LPPERPROPERTYBROWSING;
-
-typedef struct tagCALPOLESTR
-    {
-    ULONG cElems;
-     LPOLESTR *pElems;
-    } 	CALPOLESTR;
-
-typedef struct tagCALPOLESTR *LPCALPOLESTR;
-
-typedef struct tagCADWORD
-    {
-    ULONG cElems;
-     DWORD *pElems;
-    } 	CADWORD;
-
-typedef struct tagCADWORD *LPCADWORD;
-
-
-extern "C" const IID IID_IPerPropertyBrowsing;
-
-
-    
-    struct __declspec(uuid("376BD3AA-3845-101B-84ED-08002B2EC713")) __declspec(novtable)
-    IPerPropertyBrowsing : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetDisplayString( 
-             DISPID dispID,
-             BSTR *pBstr) = 0;
-        
-        virtual HRESULT __stdcall MapPropertyToPage( 
-             DISPID dispID,
-             CLSID *pClsid) = 0;
-        
-        virtual HRESULT __stdcall GetPredefinedStrings( 
-             DISPID dispID,
-             CALPOLESTR *pCaStringsOut,
-             CADWORD *pCaCookiesOut) = 0;
-        
-        virtual HRESULT __stdcall GetPredefinedValue( 
-             DISPID dispID,
-             DWORD dwCookie,
-             VARIANT *pVarOut) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPerPropertyBrowsing_GetDisplayString_Proxy( 
-    IPerPropertyBrowsing * This,
-     DISPID dispID,
-     BSTR *pBstr);
-
-
-void __stdcall IPerPropertyBrowsing_GetDisplayString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPerPropertyBrowsing_MapPropertyToPage_Proxy( 
-    IPerPropertyBrowsing * This,
-     DISPID dispID,
-     CLSID *pClsid);
-
-
-void __stdcall IPerPropertyBrowsing_MapPropertyToPage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPerPropertyBrowsing_GetPredefinedStrings_Proxy( 
-    IPerPropertyBrowsing * This,
-     DISPID dispID,
-     CALPOLESTR *pCaStringsOut,
-     CADWORD *pCaCookiesOut);
-
-
-void __stdcall IPerPropertyBrowsing_GetPredefinedStrings_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPerPropertyBrowsing_GetPredefinedValue_Proxy( 
-    IPerPropertyBrowsing * This,
-     DISPID dispID,
-     DWORD dwCookie,
-     VARIANT *pVarOut);
-
-
-void __stdcall IPerPropertyBrowsing_GetPredefinedValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyBag2 *LPPROPERTYBAG2;
-
-typedef  
-enum tagPROPBAG2_TYPE
-    {	PROPBAG2_TYPE_UNDEFINED	= 0,
-	PROPBAG2_TYPE_DATA	= 1,
-	PROPBAG2_TYPE_URL	= 2,
-	PROPBAG2_TYPE_OBJECT	= 3,
-	PROPBAG2_TYPE_STREAM	= 4,
-	PROPBAG2_TYPE_STORAGE	= 5,
-	PROPBAG2_TYPE_MONIKER	= 6
-    } 	PROPBAG2_TYPE;
-
-typedef struct tagPROPBAG2
-    {
-    DWORD dwType;
-    VARTYPE vt;
-    CLIPFORMAT cfType;
-    DWORD dwHint;
-    LPOLESTR pstrName;
-    CLSID clsid;
-    } 	PROPBAG2;
-
-
-extern "C" const IID IID_IPropertyBag2;
-
-
-    
-    struct __declspec(uuid("22F55882-280B-11d0-A8A9-00A0C90C2004")) __declspec(novtable)
-    IPropertyBag2 : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Read( 
-             ULONG cProperties,
-             PROPBAG2 *pPropBag,
-             IErrorLog *pErrLog,
-             VARIANT *pvarValue,
-             HRESULT *phrError) = 0;
-        
-        virtual HRESULT __stdcall Write( 
-             ULONG cProperties,
-             PROPBAG2 *pPropBag,
-             VARIANT *pvarValue) = 0;
-        
-        virtual HRESULT __stdcall CountProperties( 
-             ULONG *pcProperties) = 0;
-        
-        virtual HRESULT __stdcall GetPropertyInfo( 
-             ULONG iProperty,
-             ULONG cProperties,
-             PROPBAG2 *pPropBag,
-             ULONG *pcProperties) = 0;
-        
-        virtual HRESULT __stdcall LoadObject( 
-             LPCOLESTR pstrName,
-             DWORD dwHint,
-             IUnknown *pUnkObject,
-             IErrorLog *pErrLog) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyBag2_Read_Proxy( 
-    IPropertyBag2 * This,
-     ULONG cProperties,
-     PROPBAG2 *pPropBag,
-     IErrorLog *pErrLog,
-     VARIANT *pvarValue,
-     HRESULT *phrError);
-
-
-void __stdcall IPropertyBag2_Read_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag2_Write_Proxy( 
-    IPropertyBag2 * This,
-     ULONG cProperties,
-     PROPBAG2 *pPropBag,
-     VARIANT *pvarValue);
-
-
-void __stdcall IPropertyBag2_Write_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag2_CountProperties_Proxy( 
-    IPropertyBag2 * This,
-     ULONG *pcProperties);
-
-
-void __stdcall IPropertyBag2_CountProperties_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag2_GetPropertyInfo_Proxy( 
-    IPropertyBag2 * This,
-     ULONG iProperty,
-     ULONG cProperties,
-     PROPBAG2 *pPropBag,
-     ULONG *pcProperties);
-
-
-void __stdcall IPropertyBag2_GetPropertyInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag2_LoadObject_Proxy( 
-    IPropertyBag2 * This,
-     LPCOLESTR pstrName,
-     DWORD dwHint,
-     IUnknown *pUnkObject,
-     IErrorLog *pErrLog);
-
-
-void __stdcall IPropertyBag2_LoadObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPersistPropertyBag2 *LPPERSISTPROPERTYBAG2;
-
-
-extern "C" const IID IID_IPersistPropertyBag2;
-
-
-    
-    struct __declspec(uuid("22F55881-280B-11d0-A8A9-00A0C90C2004")) __declspec(novtable)
-    IPersistPropertyBag2 : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall InitNew( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             IPropertyBag2 *pPropBag,
-             IErrorLog *pErrLog) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IPropertyBag2 *pPropBag,
-             BOOL fClearDirty,
-             BOOL fSaveAllProperties) = 0;
-        
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistPropertyBag2_InitNew_Proxy( 
-    IPersistPropertyBag2 * This);
-
-
-void __stdcall IPersistPropertyBag2_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag2_Load_Proxy( 
-    IPersistPropertyBag2 * This,
-     IPropertyBag2 *pPropBag,
-     IErrorLog *pErrLog);
-
-
-void __stdcall IPersistPropertyBag2_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag2_Save_Proxy( 
-    IPersistPropertyBag2 * This,
-     IPropertyBag2 *pPropBag,
-     BOOL fClearDirty,
-     BOOL fSaveAllProperties);
-
-
-void __stdcall IPersistPropertyBag2_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag2_IsDirty_Proxy( 
-    IPersistPropertyBag2 * This);
-
-
-void __stdcall IPersistPropertyBag2_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IAdviseSinkEx *LPADVISESINKEX;
-
-
-extern "C" const IID IID_IAdviseSinkEx;
-
-
-    
-    struct __declspec(uuid("3AF24290-0C96-11CE-A0CF-00AA00600AB8")) __declspec(novtable)
-    IAdviseSinkEx : public IAdviseSink
-    {
-    public:
-        virtual  void __stdcall OnViewStatusChange( 
-             DWORD dwViewStatus) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAdviseSinkEx_RemoteOnViewStatusChange_Proxy( 
-    IAdviseSinkEx * This,
-     DWORD dwViewStatus);
-
-
-void __stdcall IAdviseSinkEx_RemoteOnViewStatusChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IQuickActivate *LPQUICKACTIVATE;
-
-typedef  
-enum tagQACONTAINERFLAGS
-    {	QACONTAINER_SHOWHATCHING	= 0x1,
-	QACONTAINER_SHOWGRABHANDLES	= 0x2,
-	QACONTAINER_USERMODE	= 0x4,
-	QACONTAINER_DISPLAYASDEFAULT	= 0x8,
-	QACONTAINER_UIDEAD	= 0x10,
-	QACONTAINER_AUTOCLIP	= 0x20,
-	QACONTAINER_MESSAGEREFLECT	= 0x40,
-	QACONTAINER_SUPPORTSMNEMONICS	= 0x80
-    } 	QACONTAINERFLAGS;
-
-typedef   __declspec(uuid("66504301-BE0F-101A-8BBB-00AA00300CAB")) DWORD OLE_COLOR;
-
-typedef struct tagQACONTAINER
-    {
-    ULONG cbSize;
-    IOleClientSite *pClientSite;
-    IAdviseSinkEx *pAdviseSink;
-    IPropertyNotifySink *pPropertyNotifySink;
-    IUnknown *pUnkEventSink;
-    DWORD dwAmbientFlags;
-    OLE_COLOR colorFore;
-    OLE_COLOR colorBack;
-    IFont *pFont;
-    IOleUndoManager *pUndoMgr;
-    DWORD dwAppearance;
-    LONG lcid;
-    HPALETTE hpal;
-    IBindHost *pBindHost;
-    IOleControlSite *pOleControlSite;
-    IServiceProvider *pServiceProvider;
-    } 	QACONTAINER;
-
-typedef struct tagQACONTROL
-    {
-    ULONG cbSize;
-    DWORD dwMiscStatus;
-    DWORD dwViewStatus;
-    DWORD dwEventCookie;
-    DWORD dwPropNotifyCookie;
-    DWORD dwPointerActivationPolicy;
-    } 	QACONTROL;
-
-
-extern "C" const IID IID_IQuickActivate;
-
-
-    
-    struct __declspec(uuid("CF51ED10-62FE-11CF-BF86-00A0C9034836")) __declspec(novtable)
-    IQuickActivate : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall QuickActivate( 
-             QACONTAINER *pQaContainer,
-             QACONTROL *pQaControl) = 0;
-        
-        virtual HRESULT __stdcall SetContentExtent( 
-             LPSIZEL pSizel) = 0;
-        
-        virtual HRESULT __stdcall GetContentExtent( 
-             LPSIZEL pSizel) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IQuickActivate_RemoteQuickActivate_Proxy( 
-    IQuickActivate * This,
-     QACONTAINER *pQaContainer,
-     QACONTROL *pQaControl);
-
-
-void __stdcall IQuickActivate_RemoteQuickActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IQuickActivate_SetContentExtent_Proxy( 
-    IQuickActivate * This,
-     LPSIZEL pSizel);
-
-
-void __stdcall IQuickActivate_SetContentExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IQuickActivate_GetContentExtent_Proxy( 
-    IQuickActivate * This,
-     LPSIZEL pSizel);
-
-
-void __stdcall IQuickActivate_GetContentExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
-void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 
-
-unsigned long             __stdcall  HACCEL_UserSize(     unsigned long *, unsigned long            , HACCEL * ); 
-unsigned char * __stdcall  HACCEL_UserMarshal(  unsigned long *, unsigned char *, HACCEL * ); 
-unsigned char * __stdcall  HACCEL_UserUnmarshal(unsigned long *, unsigned char *, HACCEL * ); 
-void                      __stdcall  HACCEL_UserFree(     unsigned long *, HACCEL * ); 
-
-unsigned long             __stdcall  HDC_UserSize(     unsigned long *, unsigned long            , HDC * ); 
-unsigned char * __stdcall  HDC_UserMarshal(  unsigned long *, unsigned char *, HDC * ); 
-unsigned char * __stdcall  HDC_UserUnmarshal(unsigned long *, unsigned char *, HDC * ); 
-void                      __stdcall  HDC_UserFree(     unsigned long *, HDC * ); 
-
-unsigned long             __stdcall  HFONT_UserSize(     unsigned long *, unsigned long            , HFONT * ); 
-unsigned char * __stdcall  HFONT_UserMarshal(  unsigned long *, unsigned char *, HFONT * ); 
-unsigned char * __stdcall  HFONT_UserUnmarshal(unsigned long *, unsigned char *, HFONT * ); 
-void                      __stdcall  HFONT_UserFree(     unsigned long *, HFONT * ); 
-
-unsigned long             __stdcall  HPALETTE_UserSize(     unsigned long *, unsigned long            , HPALETTE * ); 
-unsigned char * __stdcall  HPALETTE_UserMarshal(  unsigned long *, unsigned char *, HPALETTE * ); 
-unsigned char * __stdcall  HPALETTE_UserUnmarshal(unsigned long *, unsigned char *, HPALETTE * ); 
-void                      __stdcall  HPALETTE_UserFree(     unsigned long *, HPALETTE * ); 
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
-unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
-void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 
-
- HRESULT __stdcall IEnumConnections_Next_Proxy( 
-    IEnumConnections * This,
-     ULONG cConnections,
-     LPCONNECTDATA rgcd,
-     ULONG *pcFetched);
-
-
- HRESULT __stdcall IEnumConnections_Next_Stub( 
-    IEnumConnections * This,
-     ULONG cConnections,
-     LPCONNECTDATA rgcd,
-     ULONG *pcFetched);
-
- HRESULT __stdcall IEnumConnectionPoints_Next_Proxy( 
-    IEnumConnectionPoints * This,
-     ULONG cConnections,
-     LPCONNECTIONPOINT *ppCP,
-     ULONG *pcFetched);
-
-
- HRESULT __stdcall IEnumConnectionPoints_Next_Stub( 
-    IEnumConnectionPoints * This,
-     ULONG cConnections,
-     LPCONNECTIONPOINT *ppCP,
-     ULONG *pcFetched);
-
- HRESULT __stdcall IClassFactory2_CreateInstanceLic_Proxy( 
-    IClassFactory2 * This,
-     IUnknown *pUnkOuter,
-     IUnknown *pUnkReserved,
-     const IID & riid,
-     BSTR bstrKey,
-     PVOID *ppvObj);
-
-
- HRESULT __stdcall IClassFactory2_CreateInstanceLic_Stub( 
-    IClassFactory2 * This,
-     const IID & riid,
-     BSTR bstrKey,
-     IUnknown **ppvObj);
-
- HRESULT __stdcall IPersistMemory_Load_Proxy( 
-    IPersistMemory * This,
-     LPVOID pMem,
-     ULONG cbSize);
-
-
- HRESULT __stdcall IPersistMemory_Load_Stub( 
-    IPersistMemory * This,
-     BYTE *pMem,
-     ULONG cbSize);
-
- HRESULT __stdcall IPersistMemory_Save_Proxy( 
-    IPersistMemory * This,
-     LPVOID pMem,
-     BOOL fClearDirty,
-     ULONG cbSize);
-
-
- HRESULT __stdcall IPersistMemory_Save_Stub( 
-    IPersistMemory * This,
-     BYTE *pMem,
-     BOOL fClearDirty,
-     ULONG cbSize);
-
- HRESULT __stdcall IEnumOleUndoUnits_Next_Proxy( 
-    IEnumOleUndoUnits * This,
-     ULONG cElt,
-     IOleUndoUnit **rgElt,
-     ULONG *pcEltFetched);
-
-
- HRESULT __stdcall IEnumOleUndoUnits_Next_Stub( 
-    IEnumOleUndoUnits * This,
-     ULONG cElt,
-     IOleUndoUnit **rgElt,
-     ULONG *pcEltFetched);
-
- void __stdcall IAdviseSinkEx_OnViewStatusChange_Proxy( 
-    IAdviseSinkEx * This,
-     DWORD dwViewStatus);
-
-
- HRESULT __stdcall IAdviseSinkEx_OnViewStatusChange_Stub( 
-    IAdviseSinkEx * This,
-     DWORD dwViewStatus);
-
- HRESULT __stdcall IQuickActivate_QuickActivate_Proxy( 
-    IQuickActivate * This,
-     QACONTAINER *pQaContainer,
-     QACONTROL *pQaControl);
-
-
- HRESULT __stdcall IQuickActivate_QuickActivate_Stub( 
-    IQuickActivate * This,
-     QACONTAINER *pQaContainer,
-     QACONTROL *pQaControl);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const GUID  IID_IPropertyFrame;
-
-
-
-
-
-extern "C" const GUID  CLSID_CFontPropPage;
-extern "C" const GUID  CLSID_CColorPropPage;
-extern "C" const GUID  CLSID_CPicturePropPage;
-
-
-
-
-
-extern "C" const GUID  CLSID_PersistPropset;
-extern "C" const GUID  CLSID_ConvertVBX;
-
-
-
-
-extern "C" const GUID  CLSID_StdFont;
-extern "C" const GUID  CLSID_StdPicture;
-
-
-
-
-
-extern "C" const GUID  GUID_HIMETRIC;
-extern "C" const GUID  GUID_COLOR;
-extern "C" const GUID  GUID_XPOSPIXEL;
-extern "C" const GUID  GUID_YPOSPIXEL;
-extern "C" const GUID  GUID_XSIZEPIXEL;
-extern "C" const GUID  GUID_YSIZEPIXEL;
-extern "C" const GUID  GUID_XPOS;
-extern "C" const GUID  GUID_YPOS;
-extern "C" const GUID  GUID_XSIZE;
-extern "C" const GUID  GUID_YSIZE;
-
-
-
-
-
-
-extern "C" const GUID  GUID_OPTIONVALUEEXCLUSIVE;
-extern "C" const GUID  GUID_CHECKVALUEEXCLUSIVE;
-extern "C" const GUID  GUID_FONTNAME;
-extern "C" const GUID  GUID_FONTSIZE;
-extern "C" const GUID  GUID_FONTBOLD;
-extern "C" const GUID  GUID_FONTITALIC;
-extern "C" const GUID  GUID_FONTUNDERSCORE;
-extern "C" const GUID  GUID_FONTSTRIKETHROUGH;
-extern "C" const GUID  GUID_HANDLE;
-
-
-
-
-
-
-
-typedef struct tagOCPFIPARAMS
-{
-    ULONG cbStructSize;
-    HWND hWndOwner;
-    int x;
-    int y;
-    LPCOLESTR lpszCaption;
-    ULONG cObjects;
-    LPUNKNOWN * lplpUnk;
-    ULONG cPages;
-    CLSID * lpPages;
-    LCID lcid;
-    DISPID dispidInitialProperty;
-
-} OCPFIPARAMS, * LPOCPFIPARAMS;
-
-
-
-
-
-
-
-typedef struct tagFONTDESC
-{
-    UINT cbSizeofstruct;
-    LPOLESTR lpstrName;
-    CY cySize;
-    SHORT sWeight;
-    SHORT sCharset;
-    BOOL fItalic;
-    BOOL fUnderline;
-    BOOL fStrikethrough;
-
-} FONTDESC, * LPFONTDESC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPICTDESC
-{
-    UINT cbSizeofstruct;
-    UINT picType;
-    union
-    {
-        struct
-        {
-            HBITMAP   hbitmap;        
-            HPALETTE  hpal;           
-        } bmp;
-
-        struct
-        {
-            HMETAFILE hmeta;          
-            int       xExt;
-            int       yExt;           
-        } wmf;
-
-        struct
-        {
-            HICON hicon;              
-        } icon;
-
-
-        struct
-        {
-            HENHMETAFILE hemf;        
-        } emf;
-
-    };
-
-} PICTDESC, * LPPICTDESC;
-
-
-
-
-
-typedef long OLE_XPOS_PIXELS;
-typedef long OLE_YPOS_PIXELS;
-typedef long OLE_XSIZE_PIXELS;
-typedef long OLE_YSIZE_PIXELS;
-typedef float OLE_XPOS_CONTAINER;
-typedef float OLE_YPOS_CONTAINER;
-typedef float OLE_XSIZE_CONTAINER;
-typedef float OLE_YSIZE_CONTAINER;
-typedef enum { triUnchecked = 0, triChecked = 1, triGray = 2 } OLE_TRISTATE;
-typedef VARIANT_BOOL OLE_OPTEXCLUSIVE;
-typedef VARIANT_BOOL OLE_CANCELBOOL;
-typedef VARIANT_BOOL OLE_ENABLEDEFAULTBOOL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall DllRegisterServer(void);
-extern "C" HRESULT __stdcall DllUnregisterServer(void);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePropertyFrame(HWND hwndOwner, UINT x, UINT y,
-    LPCOLESTR lpszCaption, ULONG cObjects, LPUNKNOWN * ppUnk, ULONG cPages,
-    LPCLSID pPageClsID, LCID lcid, DWORD dwReserved, LPVOID pvReserved);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleTranslateColor(OLE_COLOR clr, HPALETTE hpal,
-    COLORREF* lpcolorref);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleCreateFontIndirect(LPFONTDESC lpFontDesc, const IID & riid,
-    LPVOID * lplpvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePictureIndirect(LPPICTDESC lpPictDesc, const IID & riid,
-    BOOL fOwn, LPVOID * lplpvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPicture(LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
-    const IID & riid, LPVOID * lplpvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureEx(LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
-    const IID & riid, DWORD xSizeDesired, DWORD ySizeDesired, DWORD dwFlags,
-    LPVOID * lplpvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPicturePath(  LPOLESTR  szURLorPath,
-				  LPUNKNOWN punkCaller,
-				  DWORD     dwReserved,
-				  OLE_COLOR clrReserved,
-				  const IID &    riid,
-				  LPVOID *  ppvRet );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureFile(VARIANT varFileName,
-    LPDISPATCH* lplpdispPicture);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureFileEx(VARIANT varFileName,
-    DWORD xSizeDesired, DWORD ySizeDesired, DWORD dwFlags, LPDISPATCH* lplpdispPicture);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleSavePictureFile(LPDISPATCH lpdispPicture,
-    BSTR bstrFileName);
-
-extern "C" __declspec(dllimport) HCURSOR __stdcall OleIconToCursor(HINSTANCE hinstExe, HICON hIcon);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning (push)
-#pragma warning (disable: 4127)  
-#pragma warning (disable: 4571)  
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-__declspec( noinline ) inline HRESULT AtlHresultFromLastError() throw()
-{
-	DWORD dwErr = ::GetLastError();
-	return ((HRESULT)(dwErr) <= 0 ? ((HRESULT)(dwErr)) : ((HRESULT) (((dwErr) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-}
-
-__declspec( noinline ) inline HRESULT AtlHresultFromWin32(     DWORD nError) throw()
-{
-	return( ((HRESULT)(nError) <= 0 ? ((HRESULT)(nError)) : ((HRESULT) (((nError) & 0x0000FFFF) | (7 << 16) | 0x80000000))) );
-}
-
-
-
-
-extern "C" __declspec(dllimport) IUnknown* __stdcall AtlComPtrAssign(IUnknown** pp, IUnknown* lp);
-extern "C" __declspec(dllimport) IUnknown* __stdcall AtlComQIPtrAssign(IUnknown** pp, IUnknown* lp, const IID & riid);
-
-
-
-
-union ClassesAllowedInStream 
-{
-	const CLSID *rgclsidAllowed;
-	HRESULT (*pfnClsidAllowed)(     const CLSID& clsid,      const IID & iidInterface,                  void** ppvObj);
-};
-
-
-inline HRESULT AtlInternalOleLoadFromStream(
-	     IStream* pStm, 
-	     const IID & iidInterface, 
-	                  void** ppvObj, 
-	     ClassesAllowedInStream rgclsidAllowed, 
-	     DWORD cclsidAllowed);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template <class T>
-class _NoAddRefReleaseOnCComPtr : public T
-{
-	private:
-		virtual ULONG __stdcall AddRef()=0;
-		virtual ULONG __stdcall Release()=0;
-};
-
-inline  HRESULT AtlSetChildSite(     IUnknown* punkChild,        IUnknown* punkParent)
-{
-	if (punkChild == 0)
-		return ((HRESULT)0x80004003L);
-
-	HRESULT hr;
-	IObjectWithSite* pChildSite = 0;
-	hr = punkChild->QueryInterface(__uuidof(IObjectWithSite), (void**)&pChildSite);
-	if (((HRESULT)(hr) >= 0) && pChildSite != 0)
-	{
-		hr = pChildSite->SetSite(punkParent);
-		pChildSite->Release();
-	}
-	return hr;
-}
-
-
-
-
-template <class T>
-class CComPtrBase
-{
-protected:
-	CComPtrBase() throw()
-	{
-		p = 0;
-	}
-	CComPtrBase(     int nNull) throw()
-	{
-		(void) ((!!((nNull == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 138, 0, L"nNull == 0")) || (__debugbreak(), 0));
-		(void)nNull;
-		p = 0;
-	}
-	CComPtrBase(       T* lp) throw()
-	{
-		p = lp;
-		if (p != 0)
-			p->AddRef();
-	}
-public:
-	typedef T _PtrClass;
-	~CComPtrBase() throw()
-	{
-		if (p)
-			p->Release();
-	}
-	operator T*() const throw()
-	{
-		return p;
-	}
-	T& operator*() const
-	{
-		do { int __atl_condVal=!!(p!=0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 161, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		return *p;
-	}
-	
-	
-	T** operator&() throw()
-	{
-		(void) ((!!((p==0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 168, 0, L"p==0")) || (__debugbreak(), 0));
-		return &p;
-	}
-	_NoAddRefReleaseOnCComPtr<T>* operator->() const throw()
-	{
-		(void) ((!!((p!=0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 173, 0, L"p!=0")) || (__debugbreak(), 0));
-		return (_NoAddRefReleaseOnCComPtr<T>*)p;
-	}
-	bool operator!() const throw()
-	{
-		return (p == 0);
-	}
-	bool operator<(       T* pT) const throw()
-	{
-		return p < pT;
-	}
-	bool operator!=(       T* pT) const
-	{
-		return !operator==(pT);
-	}
-	bool operator==(       T* pT) const throw()
-	{
-		return p == pT;
-	}
-
-	
-	void Release() throw()
-	{
-		T* pTemp = p;
-		if (pTemp)
-		{
-			p = 0;
-			pTemp->Release();
-		}
-	}
-	
-	bool IsEqualObject(       IUnknown* pOther) throw()
-	{
-		if (p == 0 && pOther == 0)
-			return true;	
-
-		if (p == 0 || pOther == 0)
-			return false;	
-
-		CComPtr<IUnknown> punk1;
-		CComPtr<IUnknown> punk2;
-		p->QueryInterface(__uuidof(IUnknown), (void**)&punk1);
-		pOther->QueryInterface(__uuidof(IUnknown), (void**)&punk2);
-		return punk1 == punk2;
-	}
-	
-	void Attach(       T* p2) throw()
-	{
-		if (p)
-			p->Release();
-		p = p2;
-	}
-	
-	T* Detach() throw()
-	{
-		T* pt = p;
-		p = 0;
-		return pt;
-	}
-	 HRESULT CopyTo(                  T** ppT) throw()
-	{
-		(void) ((!!((ppT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 234, 0, L"ppT != 0")) || (__debugbreak(), 0));
-		if (ppT == 0)
-			return ((HRESULT)0x80004003L);
-		*ppT = p;
-		if (p)
-			p->AddRef();
-		return ((HRESULT)0x00000000L);
-	}
-	 HRESULT SetSite(       IUnknown* punkParent) throw()
-	{
-		return AtlSetChildSite(p, punkParent);
-	}
-	 HRESULT Advise(     IUnknown* pUnk,      const IID& iid,      LPDWORD pdw) throw()
-	{
-		return AtlAdvise(p, pUnk, iid, pdw);
-	}
-	 HRESULT CoCreateInstance(     const IID & rclsid,        LPUNKNOWN pUnkOuter = 0,      DWORD dwClsContext = (CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER| CLSCTX_REMOTE_SERVER)) throw()
-	{
-		(void) ((!!((p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 252, 0, L"p == 0")) || (__debugbreak(), 0));
-		return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);
-	}
-	 HRESULT CoCreateInstance(     LPCOLESTR szProgID,        LPUNKNOWN pUnkOuter = 0,      DWORD dwClsContext = (CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER| CLSCTX_REMOTE_SERVER)) throw()
-	{
-		CLSID clsid;
-		HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
-		(void) ((!!((p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 259, 0, L"p == 0")) || (__debugbreak(), 0));
-		if (((HRESULT)(hr) >= 0))
-			hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);
-		return hr;
-	}
-	template <class Q>
-	 HRESULT QueryInterface(                  Q** pp) const throw()
-	{
-		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 267, 0, L"pp != 0")) || (__debugbreak(), 0));
-		return p->QueryInterface(__uuidof(Q), (void**)pp);
-	}
-	T* p;
-};
-
-template <class T>
-class CComPtr : public CComPtrBase<T>
-{
-public:
-	CComPtr() throw()
-	{
-	}
-	CComPtr(int nNull) throw() :
-		CComPtrBase<T>(nNull)
-	{
-	}
-	CComPtr(T* lp) throw() :
-		CComPtrBase<T>(lp)
-
-	{
-	}
-	CComPtr(     const CComPtr<T>& lp) throw() :
-		CComPtrBase<T>(lp.p)
-	{
-	}
-	T* operator=(       T* lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
-        }
-        return *this;
-	}
-	template <typename Q>
-	T* operator=(     const CComPtr<Q>& lp) throw()
-	{
-        if( !IsEqualObject(lp) )
-        {
-    		return static_cast<T*>(AtlComQIPtrAssign((IUnknown**)&p, lp, __uuidof(T)));
-        }
-        return *this;
-	}
-	T* operator=(     const CComPtr<T>& lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
-        }
-        return *this;
-	}
-};
-
-
-template <>
-class CComPtr<IDispatch> : public CComPtrBase<IDispatch>
-{
-public:
-	CComPtr() throw()
-	{
-	}
-	CComPtr(IDispatch* lp) throw() :
-		CComPtrBase<IDispatch>(lp)
-	{
-	}
-	CComPtr(const CComPtr<IDispatch>& lp) throw() :
-		CComPtrBase<IDispatch>(lp.p)
-	{
-	}
-	IDispatch* operator=(IDispatch* lp) throw()
-	{
-        if(*this!=lp)
-        {
-            return static_cast<IDispatch*>(AtlComPtrAssign((IUnknown**)&p, lp));
-        }
-        return *this;
-	}
-	IDispatch* operator=(const CComPtr<IDispatch>& lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<IDispatch*>(AtlComPtrAssign((IUnknown**)&p, lp.p));
-        }
-        return *this;
-	}
-
-
-	 HRESULT GetPropertyByName(     LPCOLESTR lpsz,      VARIANT* pVar) throw()
-	{
-		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 356, 0, L"p")) || (__debugbreak(), 0));
-		(void) ((!!((pVar))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 357, 0, L"pVar")) || (__debugbreak(), 0));
-		DISPID dwDispID;
-		HRESULT hr = GetIDOfName(lpsz, &dwDispID);
-		if (((HRESULT)(hr) >= 0))
-			hr = GetProperty(dwDispID, pVar);
-		return hr;
-	}
-	 HRESULT GetProperty(     DISPID dwDispID,      VARIANT* pVar) throw()
-	{
-		return GetProperty(p, dwDispID, pVar);
-	}
-	 HRESULT PutPropertyByName(     LPCOLESTR lpsz,      VARIANT* pVar) throw()
-	{
-		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 370, 0, L"p")) || (__debugbreak(), 0));
-		(void) ((!!((pVar))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 371, 0, L"pVar")) || (__debugbreak(), 0));
-		DISPID dwDispID;
-		HRESULT hr = GetIDOfName(lpsz, &dwDispID);
-		if (((HRESULT)(hr) >= 0))
-			hr = PutProperty(dwDispID, pVar);
-		return hr;
-	}
-	 HRESULT PutProperty(     DISPID dwDispID,      VARIANT* pVar) throw()
-	{
-		return PutProperty(p, dwDispID, pVar);
-	}
-	 HRESULT GetIDOfName(     LPCOLESTR lpsz,      DISPID* pdispid) throw()
-	{
-		return p->GetIDsOfNames(GUID_NULL, const_cast<LPOLESTR*>(&lpsz), 1, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), pdispid);
-	}
-	
-	 HRESULT Invoke0(     DISPID dispid,        VARIANT* pvarRet = 0) throw()
-	{
-		DISPPARAMS dispparams = { 0, 0, 0, 0};
-		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
-	}
-	
-	 HRESULT Invoke0(     LPCOLESTR lpszName,        VARIANT* pvarRet = 0) throw()
-	{
-		HRESULT hr;
-		DISPID dispid;
-		hr = GetIDOfName(lpszName, &dispid);
-		if (((HRESULT)(hr) >= 0))
-			hr = Invoke0(dispid, pvarRet);
-		return hr;
-	}
-	
-	 HRESULT Invoke1(     DISPID dispid, VARIANT* pvarParam1,        VARIANT* pvarRet = 0) throw()
-	{
-		DISPPARAMS dispparams = { pvarParam1, 0, 1, 0};
-		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
-	}
-	
-	 HRESULT Invoke1(     LPCOLESTR lpszName, VARIANT* pvarParam1,        VARIANT* pvarRet = 0) throw()
-	{
-		HRESULT hr;
-		DISPID dispid;
-		hr = GetIDOfName(lpszName, &dispid);
-		if (((HRESULT)(hr) >= 0))
-			hr = Invoke1(dispid, pvarParam1, pvarRet);
-		return hr;
-	}
-	
-	 HRESULT Invoke2(     DISPID dispid,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet = 0) throw();
-	
-	 HRESULT Invoke2(     LPCOLESTR lpszName,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet = 0) throw()
-	{
-		HRESULT hr;
-		DISPID dispid;
-		hr = GetIDOfName(lpszName, &dispid);
-		if (((HRESULT)(hr) >= 0))
-			hr = Invoke2(dispid, pvarParam1, pvarParam2, pvarRet);
-		return hr;
-	}
-	
-	 HRESULT InvokeN(DISPID dispid, VARIANT* pvarParams, int nParams, VARIANT* pvarRet = 0) throw()
-	{
-		DISPPARAMS dispparams = { pvarParams, 0, nParams, 0};
-		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
-	}
-	
-	 HRESULT InvokeN(LPCOLESTR lpszName, VARIANT* pvarParams, int nParams, VARIANT* pvarRet = 0) throw()
-	{
-		HRESULT hr;
-		DISPID dispid;
-		hr = GetIDOfName(lpszName, &dispid);
-		if (((HRESULT)(hr) >= 0))
-			hr = InvokeN(dispid, pvarParams, nParams, pvarRet);
-		return hr;
-	}
-	static  HRESULT PutProperty(     IDispatch* p,      DISPID dwDispID,      VARIANT* pVar) throw()
-	{
-		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 448, 0, L"p")) || (__debugbreak(), 0));
-		(void) ((!!((pVar != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 449, 0, L"pVar != 0")) || (__debugbreak(), 0));
-		if (pVar == 0)
-			return ((HRESULT)0x80004003L);
-		
-		if(p == 0)
-			return ((HRESULT)0x80070057L);
-		
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 456)(atlTraceCOM, 2, L"CPropertyHelper::PutProperty\n");
-		DISPPARAMS dispparams = {0, 0, 1, 1};
-		dispparams.rgvarg = pVar;
-		DISPID dispidPut = ( -3 );
-		dispparams.rgdispidNamedArgs = &dispidPut;
-
-		if (pVar->vt == VT_UNKNOWN || pVar->vt == VT_DISPATCH || 
-			(pVar->vt & VT_ARRAY) || (pVar->vt & VT_BYREF))
-		{
-			HRESULT hr = p->Invoke(dwDispID, GUID_NULL,
-				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x8,
-				&dispparams, 0, 0, 0);
-			if (((HRESULT)(hr) >= 0))
-				return hr;
-		}
-		return p->Invoke(dwDispID, GUID_NULL,
-				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x4,
-				&dispparams, 0, 0, 0);
-	}
-	static  HRESULT GetProperty(     IDispatch* p,      DISPID dwDispID,      VARIANT* pVar) throw()
-	{
-		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 477, 0, L"p")) || (__debugbreak(), 0));
-		(void) ((!!((pVar != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 478, 0, L"pVar != 0")) || (__debugbreak(), 0));
-		if (pVar == 0)
-			return ((HRESULT)0x80004003L);
-		
-		if(p == 0)
-			return ((HRESULT)0x80070057L);
-			
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 485)(atlTraceCOM, 2, L"CPropertyHelper::GetProperty\n");
-		DISPPARAMS dispparamsNoArgs = {0, 0, 0, 0};
-		return p->Invoke(dwDispID, GUID_NULL,
-				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x2,
-				&dispparamsNoArgs, pVar, 0, 0);
-	}
-};
-
-template <class T, const IID* piid = &__uuidof(T)>
-class CComQIPtr : public CComPtr<T>
-{
-public:
-	CComQIPtr() throw()
-	{
-	}
-	CComQIPtr(       T* lp) throw() :
-		CComPtr<T>(lp)
-	{
-	}
-	CComQIPtr(     const CComQIPtr<T,piid>& lp) throw() :
-		CComPtr<T>(lp.p)
-	{
-	}
-	CComQIPtr(       IUnknown* lp) throw()
-	{
-		if (lp != 0)
-			lp->QueryInterface(*piid, (void **)&p);
-	}
-	T* operator=(       T* lp) throw()
-	{
-        if(*this!=lp)
-        {
-		    return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
-        }
-        return *this;
-	}
-	T* operator=(     const CComQIPtr<T,piid>& lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp.p));
-        }
-        return *this;
-	}
-	T* operator=(       IUnknown* lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<T*>(AtlComQIPtrAssign((IUnknown**)&p, lp, *piid));
-        }
-        return *this;
-	}
-};
-
-
-template<>
-class CComQIPtr<IUnknown, &IID_IUnknown> : public CComPtr<IUnknown>
-{
-public:
-	CComQIPtr() throw()
-	{
-	}
-	CComQIPtr(       IUnknown* lp) throw()
-	{
-		
-		if (lp != 0)
-			lp->QueryInterface(__uuidof(IUnknown), (void **)&p);
-	}
-	CComQIPtr(     const CComQIPtr<IUnknown,&IID_IUnknown>& lp) throw() :
-		CComPtr<IUnknown>(lp.p)
-	{
-	}
-	IUnknown* operator=(       IUnknown* lp) throw()
-	{
-        if(*this!=lp)
-        {
-		    
-		    return AtlComQIPtrAssign((IUnknown**)&p, lp, __uuidof(IUnknown));
-        }
-        return *this;
-	}
-
-	IUnknown* operator=(     const CComQIPtr<IUnknown,&IID_IUnknown>& lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return AtlComPtrAssign((IUnknown**)&p, lp.p);
-        }
-        return *this;
-	}
-};
-
-typedef CComQIPtr<IDispatch, &__uuidof(IDispatch)> CComDispatchDriver;
-
-
-
-
-
-
-
-
-
-class CComBSTR
-{
-public:
-	BSTR m_str;
-
-	CComBSTR() throw()
-	{
-		m_str = 0;
-	}
-
-	CComBSTR(     int nSize)
-	{
-		if (nSize == 0)
-			m_str = 0;
-		else
-		{
-			m_str = ::SysAllocStringLen(0, nSize);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-	}
-
-	CComBSTR(     int nSize,          LPCOLESTR sz)
-	{
-		if (nSize == 0)
-        {
-			m_str = 0;
-        }
-		else
-		{
-			m_str = ::SysAllocStringLen(sz, nSize);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-	}
-
-	CComBSTR(       LPCOLESTR pSrc)
-	{
-		if (pSrc == 0)
-        {
-			m_str = 0;
-        }
-		else
-		{
-			m_str = ::SysAllocString(pSrc);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-	}
-
-	CComBSTR(     const CComBSTR& src)
-	{
-		m_str = src.Copy();
-		if (!!src && !*this)
-        {
-			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-        }
-	}
-
-	CComBSTR(     const GUID & guid)
-	{
-		OLECHAR szGUID[64];
-		::StringFromGUID2(guid, szGUID, 64);
-		m_str = ::SysAllocString(szGUID);
-		if (!*this)
-        {
-			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-        }
-	}
-
-	CComBSTR& operator=(     const CComBSTR& src)
-	{
-		if (m_str != src.m_str)
-		{
-			::SysFreeString(m_str);
-			m_str = src.Copy();
-			if (!!src && !*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-		return *this;
-	}
-
-	CComBSTR& operator=(       LPCOLESTR pSrc)
-	{
-		if (pSrc != m_str)
-		{
-			::SysFreeString(m_str);
-			if (pSrc != 0)
-			{
-				m_str = ::SysAllocString(pSrc);
-				if (!*this)
-                {
-					ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-                }
-			}
-			else
-            {
-				m_str = 0;
-            }
-		}
-		return *this;
-	}
-
-	~CComBSTR() throw();
-
-	unsigned int Length() const throw()
-	{
-        return ::SysStringLen(m_str);
-	}
-
-	unsigned int ByteLength() const throw()
-	{
-        return ::SysStringByteLen(m_str);
-	}
-
-	operator BSTR() const throw()
-	{
-		return m_str;
-	}
-
-
-
-
-
-
-
-
-	BSTR* operator&() throw()
-	{
-
-
-
-
-
-
-
-
-
-		return &m_str;
-	}
-
-	BSTR Copy() const throw()
-	{
-		if (!*this)
-        {
-			return 0;
-        }
-		return ::SysAllocStringByteLen((char*)m_str, ::SysStringByteLen(m_str));
-	}
-
-	 HRESULT CopyTo(       BSTR* pbstr) const throw()
-	{
-		(void) ((!!((pbstr != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 747, 0, L"pbstr != 0")) || (__debugbreak(), 0));
-		if (pbstr == 0)
-        {
-			return ((HRESULT)0x80004003L);
-        }
-		*pbstr = Copy();
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "We are checking allocation semantics here")
-		if ((*pbstr == 0) && (m_str != 0))
-        {
-			return ((HRESULT)0x8007000EL);
-        }
-#pragma prefast(pop)
-#pragma warning(pop)
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	 HRESULT CopyTo(       VARIANT *pvarDest) const throw()
-	{
-		(void) ((!!((pvarDest != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 769, 0, L"pvarDest != 0")) || (__debugbreak(), 0));
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (pvarDest != 0)
-		{
-			pvarDest->vt = VT_BSTR;
-			pvarDest->bstrVal = Copy();
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "We are checking allocation semantics here")
-			if (pvarDest->bstrVal == 0 && m_str != 0)
-            {
-				hRes = ((HRESULT)0x8007000EL);
-            }
-#pragma prefast(pop)
-#pragma warning(pop)
-			else
-            {
-				hRes = ((HRESULT)0x00000000L);
-            }
-		}
-		return hRes;
-	}
-
-	void Attach(       BSTR src) throw()
-	{
-		if (m_str != src)
-		{
-			::SysFreeString(m_str);
-			m_str = src;
-		}
-	}
-
-	BSTR Detach() throw()
-	{
-		BSTR s = m_str;
-		m_str = 0;
-		return s;
-	}
-
-	void Empty() throw()
-	{
-		::SysFreeString(m_str);
-		m_str = 0;
-	}
-
-	bool operator!() const throw()
-	{
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		return (m_str == 0);
-#pragma prefast(pop)
-#pragma warning(pop)
-	}
-
-	 HRESULT Append(     const CComBSTR& bstrSrc) throw()
-	{
-		return AppendBSTR(bstrSrc.m_str);
-	}
-
-	 HRESULT Append(       LPCOLESTR lpsz) throw()
-	{
-		return Append(lpsz, UINT(ocslen(lpsz)));
-	}
-
-	
-	
-	 HRESULT AppendBSTR(       BSTR p) throw()
-	{
-        if (::SysStringLen(p) == 0)
-        {
-			return ((HRESULT)0x00000000L);
-        }
-		BSTR bstrNew = 0;
-		HRESULT hr;
-		hr = VarBstrCat(m_str, p, &bstrNew);
-		if (((HRESULT)(hr) >= 0))
-		{
-			::SysFreeString(m_str);
-			m_str = bstrNew;
-		}
-		return hr;
-	}
-
-	 HRESULT Append(         LPCOLESTR lpsz,      int nLen) throw()
-	{
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		if (lpsz == 0 || (m_str != 0 && nLen == 0))
-#pragma prefast(pop)
-#pragma warning(pop)
-			return ((HRESULT)0x00000000L);
-		int n1 = Length();
-		if (n1+nLen < n1)
-			return ((HRESULT)0x8007000EL);
-		BSTR b;
-		b = ::SysAllocStringLen(0, n1+nLen);
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		if (b == 0)
-#pragma prefast(pop)
-#pragma warning(pop)
-			return ((HRESULT)0x8007000EL);
-		if(::SysStringLen(m_str) > 0)
-		{
-			Checked::memcpy_s(b, (n1+nLen)*sizeof(OLECHAR), m_str, n1*sizeof(OLECHAR));
-		}
-		Checked::memcpy_s(b+n1, nLen*sizeof(OLECHAR), lpsz, nLen*sizeof(OLECHAR));
-		b[n1+nLen] = 0;
-		SysFreeString(m_str);
-		m_str = b;
-		return ((HRESULT)0x00000000L);
-	}
-
-	 HRESULT Append(     char ch) throw()
-	{
-		OLECHAR chO = ch;
-
-		return( Append( &chO, 1 ) );
-	}
-
-	 HRESULT Append(     wchar_t ch) throw()
-	{
-		return( Append( &ch, 1 ) );
-	}
-
-	 HRESULT AppendBytes(         const char* lpsz,      int nLen) throw()
-	{
-		if (lpsz == 0 || nLen == 0)
-			return ((HRESULT)0x00000000L);
-		int n1 = ByteLength();
-		if (n1+nLen < n1)
-			return ((HRESULT)0x8007000EL);
-		BSTR b;
-		b = ::SysAllocStringByteLen(0, n1+nLen);
-		if (b == 0)
-        {
-			return ((HRESULT)0x8007000EL);
-        }
-		Checked::memcpy_s(b, n1+nLen, m_str, n1);
-		Checked::memcpy_s(((char*)b)+n1, nLen, lpsz, nLen);
-		*((OLECHAR*)(((char*)b)+n1+nLen)) = 0;
-		SysFreeString(m_str);
-		m_str = b;
-		return ((HRESULT)0x00000000L);
-	}
-
-	 HRESULT AssignBSTR(const BSTR bstrSrc) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_str != bstrSrc)
-		{
-			::SysFreeString(m_str);
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-			if (bstrSrc != 0)
-#pragma prefast(pop)
-#pragma warning(pop)
-			{
-				m_str = ::SysAllocStringByteLen((char*)bstrSrc, ::SysStringByteLen(bstrSrc));
-				if (!*this)
-                {
-					hr = ((HRESULT)0x8007000EL);
-                }
-			}
-			else
-            {
-				m_str = 0;
-            }
-		}
-
-		return hr;
-	}
-
-	 HRESULT ToLower() throw()
-	{
-		if (::SysStringLen(m_str) > 0)
-		{
-
-			
-			CharLowerBuffW(m_str, Length());
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		}
-		return ((HRESULT)0x00000000L);
-	}
-	 HRESULT ToUpper() throw()
-	{
-		if (::SysStringLen(m_str) > 0)
-		{
-
-			
-			CharUpperBuffW(m_str, Length());
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		}
-		return ((HRESULT)0x00000000L);
-	}
-
-	bool LoadStringW(     HINSTANCE hInst,      UINT nID) throw()
-	{
-		::SysFreeString(m_str);
-		m_str = 0;
-		return LoadStringResource(hInst, nID, m_str);
-	}
-
-	bool LoadStringW(     UINT nID) throw()
-	{
-		::SysFreeString(m_str);
-		m_str = 0;
-		return LoadStringResource(nID, m_str);
-	}
-
-	CComBSTR& operator+=(     const CComBSTR& bstrSrc)
-	{
-		HRESULT hr;
-		hr = AppendBSTR(bstrSrc.m_str);
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-		return *this;
-	}
-
-	CComBSTR& operator+=(       LPCOLESTR pszSrc)
-	{
-		HRESULT hr;
-		hr = Append(pszSrc);
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-		return *this;
-	}
-
-	bool operator<(const CComBSTR& bstrSrc) const throw()
-	{
-		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(0);
-	}
-	bool operator<(LPCOLESTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator<(bstr2);
-	}
-	bool operator<(LPOLESTR pszSrc) const
-	{
-		return operator<((LPCOLESTR)pszSrc);
-	}
-
-	bool operator>(const CComBSTR& bstrSrc) const throw()
-	{
-		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(2);
-	}
-	bool operator>(LPCOLESTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator>(bstr2);
-	}
-	bool operator>(LPOLESTR pszSrc) const
-	{
-		return operator>((LPCOLESTR)pszSrc);
-	}
-	
-	bool operator!=(const CComBSTR& bstrSrc) const throw()
-	{
-		return !operator==(bstrSrc);
-	}
-	bool operator!=(LPCOLESTR pszSrc) const
-	{
-		return !operator==(pszSrc);
-	}
-	bool operator!=(int nNull) const throw()
-	{
-		return !operator==(nNull);
-	}
-	bool operator!=(LPOLESTR pszSrc) const
-	{
-		return operator!=((LPCOLESTR)pszSrc);
-	}
-
-	bool operator==(const CComBSTR& bstrSrc) const throw()
-	{
-		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(1);
-	}
-	bool operator==(LPCOLESTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator==(bstr2);
-	}
-	bool operator==(LPOLESTR pszSrc) const
-	{
-		return operator==((LPCOLESTR)pszSrc);
-	}
-	
-	bool operator==(int nNull) const throw()
-	{
-		(void) ((!!((nNull == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1153, 0, L"nNull == 0")) || (__debugbreak(), 0));
-		(void)nNull;
-		return (!*this);
-	}
-
-	CComBSTR(       LPCSTR pSrc)
-	{
-		if (pSrc != 0)
-		{
-			m_str = A2WBSTR(pSrc);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-		else
-        {
-			m_str = 0;
-        }
-	}
-
-	CComBSTR(     int nSize,          LPCSTR sz)
-	{
-		if (nSize != 0 && sz == 0)
-		{
-			m_str = ::SysAllocStringLen(0, nSize);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-			return;
-		}
-
-		m_str = A2WBSTR(sz, nSize);
-		if (!*this && nSize != 0)
-        {
-			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-        }
-	}
-
-	 HRESULT Append(       LPCSTR lpsz) throw()
-	{
-		if (lpsz == 0)
-			return ((HRESULT)0x00000000L);
-
-		CComBSTR bstrTemp;
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{bstrTemp = lpsz;} catch(...) {} __pragma(warning(pop));
-		if (!bstrTemp)
-        {
-			return ((HRESULT)0x8007000EL);
-        }
-		return Append(bstrTemp);
-	}
-
-	CComBSTR& operator=(       LPCSTR pSrc)
-	{
-		::SysFreeString(m_str);
-		m_str = A2WBSTR(pSrc);
-		if (!*this && pSrc != 0)
-        {
-			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-        }
-		return *this;
-	}
-
-	bool operator<(       LPCSTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator<(bstr2);
-	}
-	bool operator>(       LPCSTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator>(bstr2);
-	}
-	bool operator!=(       LPCSTR pszSrc) const
-	{
-		return !operator==(pszSrc);
-	}
-	bool operator==(       LPCSTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator==(bstr2);
-	}
-
-	 HRESULT WriteToStream(     IStream* pStream) throw()
-	{
-		(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1240, 0, L"pStream != 0")) || (__debugbreak(), 0));
-		if(pStream == 0)
-			return ((HRESULT)0x80070057L);
-			
-		ULONG cb;
-		ULONG cbStrLen = CComBSTR::GetStreamSize(m_str) - sizeof(ULONG);
-		HRESULT hr = pStream->Write((void*) &cbStrLen, sizeof(cbStrLen), &cb);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		return cbStrLen ? pStream->Write((void*) m_str, cbStrLen, &cb) : ((HRESULT)0x00000000L);
-	}
-
-	 HRESULT ReadFromStream(     IStream* pStream) throw()
-	{
-		(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1254, 0, L"pStream != 0")) || (__debugbreak(), 0));
-		if(pStream == 0)
-		{
-			return ((HRESULT)0x80070057L);
-		}
-			
-		(void) ((!!((!*this))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1260, 0, L"!*this")) || (__debugbreak(), 0)); 
-		Empty();
-		
-		HRESULT hrSeek;
-		ULARGE_INTEGER nBegOffset;
-		{
-			LARGE_INTEGER nZeroOffset;
-			nZeroOffset.QuadPart = 0L;
-			hrSeek = pStream->Seek(nZeroOffset, STREAM_SEEK_CUR, &nBegOffset);
-		}
-		ULONG cbRead = 0;
-		ULONG cbStrLen = 0;
-		HRESULT hr = pStream->Read(reinterpret_cast<void*>(&cbStrLen), sizeof(cbStrLen), &cbRead);
-		if (((HRESULT)(hr) >= 0))
-		{
-			
-			if (sizeof(cbStrLen) != cbRead)
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1278)(atlTraceCOM, 0, L"Input stream is corrupted.");
-				hr = ((HRESULT)0x80004005L);
-			}
-			
-			else if (cbStrLen == 0)
-			{				
-			}
-			
-			else if (cbStrLen < sizeof(OLECHAR))
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1288)(atlTraceCOM, 0, L"Input stream is corrupted.");
-				hr = ((HRESULT)0x80004005L);
-			}
-			
-			else if (cbStrLen > 0x100000)
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1294)(atlTraceCOM, 0, L"String exceeded the maximum allowed size see _ATL_STREAM_MAX_SIZE.");
-				hr = ((HRESULT)0x80070005L);
-			}
-			else 
-			{
-				
-				cbStrLen -= sizeof(OLECHAR);
-				m_str = ::SysAllocStringByteLen(0, cbStrLen);
-				if (!*this)
-				{
-					hr = ((HRESULT)0x8007000EL);
-				}
-				else
-				{
-					hr = pStream->Read(reinterpret_cast<void*>(m_str), cbStrLen, &cbRead);
-
-					if (((HRESULT)(hr) >= 0))
-					{
-						if (cbRead != cbStrLen)
-						{
-							ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1314)(atlTraceCOM, 0, L"Length of string data is different than expected.");
-							hr = ((HRESULT)0x80004005L);
-						}
-						else
-						{
-							OLECHAR ch;
-							hr = pStream->Read(reinterpret_cast<void*>(&ch), sizeof(OLECHAR), &cbRead);	
-
-							if (((HRESULT)(hr) >= 0))
-							{								
-								if (cbRead != sizeof(OLECHAR)) 
-								{
-									ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1326)(atlTraceCOM, 0, L"Cannot read NULL terminator from stream.");
-									hr = ((HRESULT)0x80004005L); 									
-								}
-								else
-								{
-									
-									(void) ((!!((ch == L'\0'))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1332, 0, L"ch == L'\\0'")) || (__debugbreak(), 0));
-								}
-							}
-						}
-					}			
-						
-					if (((HRESULT)(hr) < 0))
-					{
-						::SysFreeString(m_str);
-						m_str = 0;
-					}
-				}
-			}
-		}
-		
-		
-		if (((HRESULT)(hr) < 0) && ((HRESULT)(hrSeek) >= 0))
-		{
-			LARGE_INTEGER nOffset;
-			nOffset.QuadPart = static_cast<LONGLONG>(nBegOffset.QuadPart);
-			pStream->Seek(nOffset, STREAM_SEEK_SET, 0);				
-		}
-
-		return hr;
-	}
-
-	static bool LoadStringResource(     HINSTANCE hInstance,      UINT uID,                   BSTR& bstrText) throw()
-	{
-		const ATLSTRINGRESOURCEIMAGE* pImage;
-
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		(void) ((!!((bstrText == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1366, 0, L"bstrText == 0")) || (__debugbreak(), 0));
-#pragma prefast(pop)
-#pragma warning(pop)
-
-		pImage = AtlGetStringResourceImage(hInstance, uID);
-		if (pImage != 0)
-		{
-			bstrText = ::SysAllocStringLen(pImage->achString, pImage->nLength);
-		}
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		return (bstrText != 0) ? true : false;
-#pragma prefast(pop)
-#pragma warning(pop)
-	}
-
-	static bool LoadStringResource(     UINT uID,                   BSTR& bstrText) throw()
-	{
-		const ATLSTRINGRESOURCEIMAGE* pImage;
-
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		(void) ((!!((bstrText == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1392, 0, L"bstrText == 0")) || (__debugbreak(), 0));
-#pragma prefast(pop)
-#pragma warning(pop)
-
-		pImage = AtlGetStringResourceImage(uID);
-		if (pImage != 0)
-		{
-			bstrText = ::SysAllocStringLen(pImage->achString, pImage->nLength);
-		}
-
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		return (bstrText != 0) ? true : false;
-#pragma prefast(pop)
-#pragma warning(pop)
-	}
-
-	
-	 HRESULT BSTRToArray(              LPSAFEARRAY *ppArray) throw()
-	{
-		return VectorFromBstr(m_str, ppArray);
-	}
-
-	
-	 HRESULT ArrayToBSTR(     const SAFEARRAY *pSrc) throw()
-	{
-		::SysFreeString(m_str);
-		return BstrFromVector((LPSAFEARRAY)pSrc, &m_str);
-	}
-	static ULONG GetStreamSize(BSTR bstr)
-	{
-		ULONG ulSize=sizeof(ULONG);
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		if (bstr != 0)
-#pragma prefast(pop)
-#pragma warning(pop)
-		{
-			ulSize += SysStringByteLen(bstr) + sizeof(OLECHAR);
-		}
-		return ulSize;
-	}
-};
-
-inline CComBSTR::~CComBSTR() throw()
-	{
-		::SysFreeString(m_str);
-	}
-
-inline void SysFreeStringHelper(     CComBSTR& bstr)
-{
-	bstr.Empty();
-}
-
-inline void SysFreeStringHelper(BSTR bstr)
-{
-	::SysFreeString(bstr);	
-}
-
-inline  HRESULT SysAllocStringHelper(       CComBSTR& bstrDest,BSTR bstrSrc)
-{
-	bstrDest=bstrSrc;
-	return !bstrDest ? ((HRESULT)0x8007000EL) : ((HRESULT)0x00000000L);
-}
-
-inline  HRESULT SysAllocStringHelper(       BSTR& bstrDest,BSTR bstrSrc)
-{
-	bstrDest=::SysAllocString(bstrSrc);
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-	return bstrDest==0 ? ((HRESULT)0x8007000EL) : ((HRESULT)0x00000000L);
-#pragma prefast(pop)
-#pragma warning(pop)
-}
-
-
-
-
-
-
-template <class T>
-class CAdapt
-{
-public:
-	CAdapt()
-	{
-	}
-	CAdapt(     const T& rSrc) :
-		m_T( rSrc )
-	{
-	}
-
-	CAdapt(     const CAdapt& rSrCA) :
-		m_T( rSrCA.m_T )
-	{
-	}
-
-	CAdapt& operator=(     const T& rSrc)
-	{
-		m_T = rSrc;
-		return *this;
-	}
-	bool operator<(     const T& rSrc) const
-	{
-		return m_T < rSrc;
-	}
-	bool operator==(     const T& rSrc) const
-	{
-		return m_T == rSrc;
-	}
-	operator T&()
-	{
-		return m_T;
-	}
-
-	operator const T&() const
-	{
-		return m_T;
-	}
-
-	T m_T;
-};
-
-
-
-
-
-
-
-
-template< typename T > 
-class CVarTypeInfo
-{
-
-
-};
-
-template<>
-class CVarTypeInfo< char >
-{
-public:
-	static const VARTYPE VT = VT_I1;
-	static char VARIANT::* const pmField;
-};
-
-__declspec( selectany ) char VARIANT::* const CVarTypeInfo< char >::pmField = &VARIANT::cVal;
-
-template<>
-class CVarTypeInfo< unsigned char >
-{
-public:
-	static const VARTYPE VT = VT_UI1;
-	static unsigned char VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned char VARIANT::* const CVarTypeInfo< unsigned char >::pmField = &VARIANT::bVal;
-
-template<>
-class CVarTypeInfo< char* >
-{
-public:
-	static const VARTYPE VT = VT_I1|VT_BYREF;
-	static char* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) char* VARIANT::* const CVarTypeInfo< char* >::pmField = &VARIANT::pcVal;
-
-template<>
-class CVarTypeInfo< unsigned char* >
-{
-public:
-	static const VARTYPE VT = VT_UI1|VT_BYREF;
-	static unsigned char* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned char* VARIANT::* const CVarTypeInfo< unsigned char* >::pmField = &VARIANT::pbVal;
-
-template<>
-class CVarTypeInfo< short >
-{
-public:
-	static const VARTYPE VT = VT_I2;
-	static short VARIANT::* const pmField;
-};
-
-__declspec( selectany ) short VARIANT::* const CVarTypeInfo< short >::pmField = &VARIANT::iVal;
-
-template<>
-class CVarTypeInfo< short* >
-{
-public:
-	static const VARTYPE VT = VT_I2|VT_BYREF;
-	static short* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) short* VARIANT::* const CVarTypeInfo< short* >::pmField = &VARIANT::piVal;
-
-template<>
-class CVarTypeInfo< unsigned short >
-{
-public:
-	static const VARTYPE VT = VT_UI2;
-	static unsigned short VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned short VARIANT::* const CVarTypeInfo< unsigned short >::pmField = &VARIANT::uiVal;
-
-
-template<>
-class CVarTypeInfo< unsigned short* >
-{
-public:
-	static const VARTYPE VT = VT_UI2|VT_BYREF;
-	static unsigned short* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned short* VARIANT::* const CVarTypeInfo< unsigned short* >::pmField = &VARIANT::puiVal;
-
-
-template<>
-class CVarTypeInfo< int >
-{
-public:
-	static const VARTYPE VT = VT_I4;
-	static int VARIANT::* const pmField;
-};
-
-__declspec( selectany ) int VARIANT::* const CVarTypeInfo< int >::pmField = &VARIANT::intVal;
-
-template<>
-class CVarTypeInfo< int* >
-{
-public:
-	static const VARTYPE VT = VT_I4|VT_BYREF;
-	static int* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) int* VARIANT::* const CVarTypeInfo< int* >::pmField = &VARIANT::pintVal;
-
-template<>
-class CVarTypeInfo< unsigned int >
-{
-public:
-	static const VARTYPE VT = VT_UI4;
-	static unsigned int VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned int VARIANT::* const CVarTypeInfo< unsigned int >::pmField = &VARIANT::uintVal;
-
-template<>
-class CVarTypeInfo< unsigned int* >
-{
-public:
-	static const VARTYPE VT = VT_UI4|VT_BYREF;
-	static unsigned int* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned int* VARIANT::* const CVarTypeInfo< unsigned int* >::pmField = &VARIANT::puintVal;
-
-template<>
-class CVarTypeInfo< long >
-{
-public:
-	static const VARTYPE VT = VT_I4;
-	static long VARIANT::* const pmField;
-};
-
-__declspec( selectany ) long VARIANT::* const CVarTypeInfo< long >::pmField = &VARIANT::lVal;
-
-template<>
-class CVarTypeInfo< long* >
-{
-public:
-	static const VARTYPE VT = VT_I4|VT_BYREF;
-	static long* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) long* VARIANT::* const CVarTypeInfo< long* >::pmField = &VARIANT::plVal;
-
-template<>
-class CVarTypeInfo< unsigned long >
-{
-public:
-	static const VARTYPE VT = VT_UI4;
-	static unsigned long VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned long VARIANT::* const CVarTypeInfo< unsigned long >::pmField = &VARIANT::ulVal;
-
-template<>
-class CVarTypeInfo< unsigned long* >
-{
-public:
-	static const VARTYPE VT = VT_UI4|VT_BYREF;
-	static unsigned long* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned long* VARIANT::* const CVarTypeInfo< unsigned long* >::pmField = &VARIANT::pulVal;
-
-template<>
-class CVarTypeInfo< __int64 >
-{
-public:
-	static const VARTYPE VT = VT_I8;
-	static __int64 VARIANT::* const pmField;
-};
-
-__declspec( selectany ) __int64 VARIANT::* const CVarTypeInfo< __int64 >::pmField = &VARIANT::llVal;
-
-template<>
-class CVarTypeInfo< __int64* >
-{
-public:
-	static const VARTYPE VT = VT_I8|VT_BYREF;
-	static __int64* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) __int64* VARIANT::* const CVarTypeInfo< __int64* >::pmField = &VARIANT::pllVal;
-
-template<>
-class CVarTypeInfo< unsigned __int64 >
-{
-public:
-	static const VARTYPE VT = VT_UI8;
-	static unsigned __int64 VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned __int64 VARIANT::* const CVarTypeInfo< unsigned __int64 >::pmField = &VARIANT::ullVal;
-
-template<>
-class CVarTypeInfo< unsigned __int64* >
-{
-public:
-	static const VARTYPE VT = VT_UI8|VT_BYREF;
-	static unsigned __int64* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned __int64* VARIANT::* const CVarTypeInfo< unsigned __int64* >::pmField = &VARIANT::pullVal;
-
-template<>
-class CVarTypeInfo< float >
-{
-public:
-	static const VARTYPE VT = VT_R4;
-	static float VARIANT::* const pmField;
-};
-
-__declspec( selectany ) float VARIANT::* const CVarTypeInfo< float >::pmField = &VARIANT::fltVal;
-
-template<>
-class CVarTypeInfo< float* >
-{
-public:
-	static const VARTYPE VT = VT_R4|VT_BYREF;
-	static float* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) float* VARIANT::* const CVarTypeInfo< float* >::pmField = &VARIANT::pfltVal;
-
-template<>
-class CVarTypeInfo< double >
-{
-public:
-	static const VARTYPE VT = VT_R8;
-	static double VARIANT::* const pmField;
-};
-
-__declspec( selectany ) double VARIANT::* const CVarTypeInfo< double >::pmField = &VARIANT::dblVal;
-
-template<>
-class CVarTypeInfo< double* >
-{
-public:
-	static const VARTYPE VT = VT_R8|VT_BYREF;
-	static double* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) double* VARIANT::* const CVarTypeInfo< double* >::pmField = &VARIANT::pdblVal;
-
-template<>
-class CVarTypeInfo< VARIANT >
-{
-public:
-	static const VARTYPE VT = VT_VARIANT;
-};
-
-template<>
-class CVarTypeInfo< BSTR >
-{
-public:
-	static const VARTYPE VT = VT_BSTR;
-	static BSTR VARIANT::* const pmField;
-};
-
-__declspec( selectany ) BSTR VARIANT::* const CVarTypeInfo< BSTR >::pmField = &VARIANT::bstrVal;
-
-template<>
-class CVarTypeInfo< BSTR* >
-{
-public:
-	static const VARTYPE VT = VT_BSTR|VT_BYREF;
-	static BSTR* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) BSTR* VARIANT::* const CVarTypeInfo< BSTR* >::pmField = &VARIANT::pbstrVal;
-
-template<>
-class CVarTypeInfo< IUnknown* >
-{
-public:
-	static const VARTYPE VT = VT_UNKNOWN;
-	static IUnknown* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) IUnknown* VARIANT::* const CVarTypeInfo< IUnknown* >::pmField = &VARIANT::punkVal;
-
-template<>
-class CVarTypeInfo< IUnknown** >
-{
-public:
-	static const VARTYPE VT = VT_UNKNOWN|VT_BYREF;
-	static IUnknown** VARIANT::* const pmField;
-};
-
-__declspec( selectany ) IUnknown** VARIANT::* const CVarTypeInfo< IUnknown** >::pmField = &VARIANT::ppunkVal;
-
-template<>
-class CVarTypeInfo< IDispatch* >
-{
-public:
-	static const VARTYPE VT = VT_DISPATCH;
-	static IDispatch* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) IDispatch* VARIANT::* const CVarTypeInfo< IDispatch* >::pmField = &VARIANT::pdispVal;
-
-template<>
-class CVarTypeInfo< IDispatch** >
-{
-public:
-	static const VARTYPE VT = VT_DISPATCH|VT_BYREF;
-	static IDispatch** VARIANT::* const pmField;
-};
-
-__declspec( selectany ) IDispatch** VARIANT::* const CVarTypeInfo< IDispatch** >::pmField = &VARIANT::ppdispVal;
-
-template<>
-class CVarTypeInfo< CY >
-{
-public:
-	static const VARTYPE VT = VT_CY;
-	static CY VARIANT::* const pmField;
-};
-
-__declspec( selectany ) CY VARIANT::* const CVarTypeInfo< CY >::pmField = &VARIANT::cyVal;
-
-template<>
-class CVarTypeInfo< CY* >
-{
-public:
-	static const VARTYPE VT = VT_CY|VT_BYREF;
-	static CY* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) CY* VARIANT::* const CVarTypeInfo< CY* >::pmField = &VARIANT::pcyVal;
-
-class CComVariant : public tagVARIANT
-{
-
-public:
-	CComVariant() throw()
-	{
-		::VariantInit(this);
-	}
-	~CComVariant() throw()
-	{
-		Clear();
-	}
-
-	CComVariant(     const VARIANT& varSrc)
-	{
-		vt = VT_EMPTY;
-		InternalCopy(&varSrc);
-	}
-
-	CComVariant(     const CComVariant& varSrc)
-	{
-		vt = VT_EMPTY;
-		InternalCopy(&varSrc);
-	}
-	CComVariant(     LPCOLESTR lpszSrc)
-	{
-		vt = VT_EMPTY;
-		*this = lpszSrc;
-	}
-
-	CComVariant(     LPCSTR lpszSrc)
-	{
-		vt = VT_EMPTY;
-		*this = lpszSrc;
-	}
-
-	CComVariant(     bool bSrc)
-	{
-		vt = VT_BOOL;
-		boolVal = bSrc ? VARIANT_BOOL( -1 ) : VARIANT_BOOL( 0 );
-	}
-
-	CComVariant(     int nSrc,      VARTYPE vtSrc = VT_I4) throw()
-	{
-		(void) ((!!((vtSrc == VT_I4 || vtSrc == VT_INT))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1908, 0, L"vtSrc == VT_I4 || vtSrc == VT_INT")) || (__debugbreak(), 0));
-		vt = vtSrc;
-		intVal = nSrc;
-	}
-	CComVariant(     BYTE nSrc) throw()
-	{
-		vt = VT_UI1;
-		bVal = nSrc;
-	}
-	CComVariant(     short nSrc) throw()
-	{
-		vt = VT_I2;
-		iVal = nSrc;
-	}
-	CComVariant(     long nSrc,      VARTYPE vtSrc = VT_I4) throw()
-	{
-		(void) ((!!((vtSrc == VT_I4 || vtSrc == VT_ERROR))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1924, 0, L"vtSrc == VT_I4 || vtSrc == VT_ERROR")) || (__debugbreak(), 0));
-		vt = vtSrc;
-		lVal = nSrc;
-	}
-	CComVariant(     float fltSrc) throw()
-	{
-		vt = VT_R4;
-		fltVal = fltSrc;
-	}
-	CComVariant(     double dblSrc,      VARTYPE vtSrc = VT_R8) throw()
-	{
-		(void) ((!!((vtSrc == VT_R8 || vtSrc == VT_DATE))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1935, 0, L"vtSrc == VT_R8 || vtSrc == VT_DATE")) || (__debugbreak(), 0));
-		vt = vtSrc;
-		dblVal = dblSrc;
-	}
-
-	CComVariant(     LONGLONG nSrc) throw()
-	{
-		vt = VT_I8;
-		llVal = nSrc;
-	}
-	CComVariant(     ULONGLONG nSrc) throw()
-	{
-		vt = VT_UI8;
-		ullVal = nSrc;
-	}
-
-	CComVariant(CY      cySrc) throw()
-	{
-		vt = VT_CY;
-		cyVal.Hi = cySrc.Hi;
-		cyVal.Lo = cySrc.Lo;
-	}
-	CComVariant(       IDispatch* pSrc) throw()
-	{
-		vt = VT_DISPATCH;
-		pdispVal = pSrc;
-		
-		if (pdispVal != 0)
-			pdispVal->AddRef();
-	}
-	CComVariant(       IUnknown* pSrc) throw()
-	{
-		vt = VT_UNKNOWN;
-		punkVal = pSrc;
-		
-		if (punkVal != 0)
-			punkVal->AddRef();
-	}
-	CComVariant(     char cSrc) throw()
-	{
-		vt = VT_I1;
-		cVal = cSrc;
-	}
-	CComVariant(     unsigned short nSrc) throw()
-	{
-		vt = VT_UI2;
-		uiVal = nSrc;
-	}
-	CComVariant(     unsigned long nSrc) throw()
-	{
-		vt = VT_UI4;
-		ulVal = nSrc;
-	}
-	CComVariant(     unsigned int nSrc,      VARTYPE vtSrc = VT_UI4) throw()
-	{
-		(void) ((!!((vtSrc == VT_UI4 || vtSrc == VT_UINT))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1990, 0, L"vtSrc == VT_UI4 || vtSrc == VT_UINT")) || (__debugbreak(), 0));
-		vt = vtSrc;
-		uintVal= nSrc;
-	}
-	CComVariant(     const CComBSTR& bstrSrc)
-	{
-		vt = VT_EMPTY;
-		*this = bstrSrc;
-	}
-	CComVariant(       const SAFEARRAY *pSrc)
-	{
-		LPSAFEARRAY pCopy;
-		if (pSrc != 0)
-		{
-			HRESULT hRes = ::SafeArrayCopy((LPSAFEARRAY)pSrc, &pCopy);
-			if (((HRESULT)(hRes) >= 0) && pCopy != 0)
-			{
-                ::ATL::AtlSafeArrayGetActualVartype((LPSAFEARRAY)pSrc, &vt);
-				vt |= VT_ARRAY;
-				parray = pCopy;
-			}
-			else
-			{
-				vt = VT_ERROR;
-				scode = hRes;
-
-				do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2016, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-			}
-		}
-		else
-		{
-			vt = VT_EMPTY;
-		}
-	}
-
-public:
-	CComVariant& operator=(     const CComVariant& varSrc)
-	{
-        if(this!=&varSrc)
-        {
-		    InternalCopy(&varSrc);
-        }
-		return *this;
-	}
-	CComVariant& operator=(     const VARIANT& varSrc)
-	{
-        if(static_cast<VARIANT *>(this)!=&varSrc)
-        {
-		    InternalCopy(&varSrc);
-        }
-		return *this;
-	}
-
-	CComVariant& operator=(     const CComBSTR& bstrSrc)
-	{
-		Clear();
-		vt = VT_BSTR;
-		bstrVal = bstrSrc.Copy();
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "We are checking allocation semantics here")
-		if (bstrVal == 0 && bstrSrc.m_str != 0)
-		{
-			vt = VT_ERROR;
-			scode = ((HRESULT)0x8007000EL);
-
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2058, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-		}
-#pragma prefast(pop)
-#pragma warning(pop)
-		return *this;
-	}
-
-	CComVariant& operator=(     LPCOLESTR lpszSrc)
-	{
-		Clear();
-		vt = VT_BSTR;
-		bstrVal = ::SysAllocString(lpszSrc);
-
-		if (bstrVal == 0 && lpszSrc != 0)
-		{
-			vt = VT_ERROR;
-			scode = ((HRESULT)0x8007000EL);
-
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2077, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-
-		}
-		return *this;
-	}
-
-	CComVariant& operator=(     LPCSTR lpszSrc)
-	{
-		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		Clear();
-		vt = VT_BSTR;
-		bstrVal = ::SysAllocString(((LPCWSTR)( ((_lpa_ex = lpszSrc) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex)))));
-
-		if (bstrVal == 0 && lpszSrc != 0)
-		{
-			vt = VT_ERROR;
-			scode = ((HRESULT)0x8007000EL);
-
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2096, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-		}
-		return *this;
-	}
-
-	CComVariant& operator=(     bool bSrc)
-	{
-		if (vt != VT_BOOL)
-		{
-			Clear();
-			vt = VT_BOOL;
-		}
-		boolVal = bSrc ? VARIANT_BOOL( -1 ) : VARIANT_BOOL( 0 );
-		return *this;
-	}
-
-	CComVariant& operator=(     int nSrc) throw()
-	{
-		if (vt != VT_I4)
-		{
-			Clear();
-			vt = VT_I4;
-		}
-		intVal = nSrc;
-
-		return *this;
-	}
-
-	CComVariant& operator=(     BYTE nSrc) throw()
-	{
-		if (vt != VT_UI1)
-		{
-			Clear();
-			vt = VT_UI1;
-		}
-		bVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     short nSrc) throw()
-	{
-		if (vt != VT_I2)
-		{
-			Clear();
-			vt = VT_I2;
-		}
-		iVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     long nSrc) throw()
-	{
-		if (vt != VT_I4)
-		{
-			Clear();
-			vt = VT_I4;
-		}
-		lVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     float fltSrc) throw()
-	{
-		if (vt != VT_R4)
-		{
-			Clear();
-			vt = VT_R4;
-		}
-		fltVal = fltSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     double dblSrc) throw()
-	{
-		if (vt != VT_R8)
-		{
-			Clear();
-			vt = VT_R8;
-		}
-		dblVal = dblSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     CY cySrc) throw()
-	{
-		if (vt != VT_CY)
-		{
-			Clear();
-			vt = VT_CY;
-		}
-		cyVal.Hi = cySrc.Hi;
-		cyVal.Lo = cySrc.Lo;
-		return *this;
-	}
-
-	CComVariant& operator=(       IDispatch* pSrc) throw()
-	{
-		Clear();
-		vt = VT_DISPATCH;
-		pdispVal = pSrc;
-		
-		if (pdispVal != 0)
-			pdispVal->AddRef();
-		return *this;
-	}
-
-	CComVariant& operator=(       IUnknown* pSrc) throw()
-	{
-		Clear();
-		vt = VT_UNKNOWN;
-		punkVal = pSrc;
-
-		
-		if (punkVal != 0)
-			punkVal->AddRef();
-		return *this;
-	}
-
-	CComVariant& operator=(     char cSrc) throw()
-	{
-		if (vt != VT_I1)
-		{
-			Clear();
-			vt = VT_I1;
-		}
-		cVal = cSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     unsigned short nSrc) throw()
-	{
-		if (vt != VT_UI2)
-		{
-			Clear();
-			vt = VT_UI2;
-		}
-		uiVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     unsigned long nSrc) throw()
-	{
-		if (vt != VT_UI4)
-		{
-			Clear();
-			vt = VT_UI4;
-		}
-		ulVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     unsigned int nSrc) throw()
-	{
-		if (vt != VT_UI4)
-		{
-			Clear();
-			vt = VT_UI4;
-		}
-		uintVal= nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       BYTE* pbSrc) throw()
-	{
-		if (vt != (VT_UI1|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI1|VT_BYREF;
-		}
-		pbVal = pbSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       short* pnSrc) throw()
-	{
-		if (vt != (VT_I2|VT_BYREF))
-		{
-			Clear();
-			vt = VT_I2|VT_BYREF;
-		}
-		piVal = pnSrc;
-		return *this;
-	}
-
-
-	CComVariant& operator=(       USHORT* pnSrc) throw()
-	{
-		if (vt != (VT_UI2|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI2|VT_BYREF;
-		}
-		puiVal = pnSrc;
-		return *this;
-	}
-
-
-	CComVariant& operator=(       int* pnSrc) throw()
-	{
-		if (vt != (VT_I4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_I4|VT_BYREF;
-		}
-		pintVal = pnSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       UINT* pnSrc) throw()
-	{
-		if (vt != (VT_UI4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI4|VT_BYREF;
-		}
-		puintVal = pnSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       long* pnSrc) throw()
-	{
-		if (vt != (VT_I4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_I4|VT_BYREF;
-		}
-		plVal = pnSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       ULONG* pnSrc) throw()
-	{
-		if (vt != (VT_UI4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI4|VT_BYREF;
-		}
-		pulVal = pnSrc;
-		return *this;
-	}
-
-
-	CComVariant& operator=(     LONGLONG nSrc) throw()
-	{
-		if (vt != VT_I8)
-		{
-			Clear();
-			vt = VT_I8;
-		}
-		llVal = nSrc;
-
-		return *this;
-	}
-
-	CComVariant& operator=(       LONGLONG* pnSrc) throw()
-	{
-		if (vt != (VT_I8|VT_BYREF))
-		{
-			Clear();
-			vt = VT_I8|VT_BYREF;
-		}
-		pllVal = pnSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     ULONGLONG nSrc) throw()
-	{
-		if (vt != VT_UI8)
-		{
-			Clear();
-			vt = VT_UI8;
-		}
-		ullVal = nSrc;
-
-		return *this;
-	}
-
-	CComVariant& operator=(       ULONGLONG* pnSrc) throw()
-	{
-		if (vt != (VT_UI8|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI8|VT_BYREF;
-		}
-		pullVal = pnSrc;
-		return *this;
-	}
-
-
-	CComVariant& operator=(       float* pfSrc) throw()
-	{
-		if (vt != (VT_R4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_R4|VT_BYREF;
-		}
-		pfltVal = pfSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       double* pfSrc) throw()
-	{
-		if (vt != (VT_R8|VT_BYREF))
-		{
-			Clear();
-			vt = VT_R8|VT_BYREF;
-		}
-		pdblVal = pfSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       const SAFEARRAY *pSrc)
-	{
-		Clear();
-		LPSAFEARRAY pCopy;
-		if (pSrc != 0)
-		{
-			HRESULT hRes = ::SafeArrayCopy((LPSAFEARRAY)pSrc, &pCopy);
-			if (((HRESULT)(hRes) >= 0) && pCopy != 0)
-			{
-				::ATL::AtlSafeArrayGetActualVartype((LPSAFEARRAY)pSrc, &vt);
-				vt |= VT_ARRAY;
-				parray = pCopy;
-			}
-			else
-			{
-				vt = VT_ERROR;
-				scode = hRes;
-
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2426, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-			}
-		}
-		return *this;
-	}
-
-
-public:
-	bool operator==(     const VARIANT& varSrc) const throw()
-	{
-		
-		if (vt == VT_NULL && varSrc.vt == VT_NULL)
-		{
-			return true;
-		}
-		
-		if (vt != varSrc.vt)
-		{
-			return false;
-		}
-		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(1);
-	}
-
-	bool operator!=(     const VARIANT& varSrc) const throw()
-	{
-		return !operator==(varSrc);
-	}
-
-	bool operator<(     const VARIANT& varSrc) const throw()
-	{
-		if (vt == VT_NULL && varSrc.vt == VT_NULL)
-			return false;
-		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0)== static_cast<HRESULT>(0);
-	}
-
-	bool operator>(     const VARIANT& varSrc) const throw()
-	{
-		if (vt == VT_NULL && varSrc.vt == VT_NULL)
-			return false;
-		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0)== static_cast<HRESULT>(2);
-	}
-
-
-public:
-	HRESULT Clear() { return ::VariantClear(this); }
-	HRESULT ClearToZero() 
-	{
-		HRESULT hr = ::VariantClear(this); 
-		if( ((HRESULT)(hr) < 0) )
-		{
-			return hr;
-		}
-		memset(this ,0 ,sizeof(tagVARIANT));
-		vt = VT_EMPTY;
-		return hr;
-	}
-	HRESULT Copy(     const VARIANT* pSrc) { return ::VariantCopy(this, const_cast<VARIANT*>(pSrc)); }
-	
-	HRESULT CopyTo(     BSTR *pstrDest) const
-	{
-		(void) ((!!((pstrDest != 0 && vt == VT_BSTR))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2487, 0, L"pstrDest != 0 && vt == VT_BSTR")) || (__debugbreak(), 0));
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (pstrDest != 0 && vt == VT_BSTR)
-		{
-			*pstrDest = ::SysAllocStringByteLen((char*)bstrVal, ::SysStringByteLen(bstrVal));
-			if (*pstrDest == 0)
-				hRes = ((HRESULT)0x8007000EL);
-			else
-				hRes = ((HRESULT)0x00000000L);
-		}
-		else if (vt != VT_BSTR)
-			hRes = ((HRESULT)0x80020005L);
-		return hRes;
-	}
-	HRESULT Attach(     VARIANT* pSrc)
-	{
-		if(pSrc == 0)
-			return ((HRESULT)0x80070057L);
-			
-		
-		HRESULT hr = Clear();
-		if (!((HRESULT)(hr) < 0))
-		{
-			
-			Checked::memcpy_s(this, sizeof(CComVariant), pSrc, sizeof(VARIANT));
-			pSrc->vt = VT_EMPTY;
-			hr = ((HRESULT)0x00000000L);
-		}
-		return hr;
-	}
-
-	HRESULT Detach(     VARIANT* pDest)
-	{
-		(void) ((!!((pDest != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2520, 0, L"pDest != 0")) || (__debugbreak(), 0));
-		if(pDest == 0)
-			return ((HRESULT)0x80004003L);
-			
-		
-		HRESULT hr = ::VariantClear(pDest);
-		if (!((HRESULT)(hr) < 0))
-		{
-			
-			Checked::memcpy_s(pDest, sizeof(VARIANT), this, sizeof(VARIANT));
-			vt = VT_EMPTY;
-			hr = ((HRESULT)0x00000000L);
-		}
-		return hr;
-	}
-
-	HRESULT ChangeType(     VARTYPE vtNew,        const VARIANT* pSrc = 0)
-	{
-		VARIANT* pVar = const_cast<VARIANT*>(pSrc);
-		
-		if (pVar == 0)
-			pVar = this;
-		
-		return ::VariantChangeType(this, pVar, 0, vtNew);
-	}
-
-	template< typename T >
-	void SetByRef(      T* pT ) throw()
-	{
-		Clear();
-		vt = CVarTypeInfo< T >::VT|VT_BYREF;
-		byref = pT;
-	}
-
-	HRESULT WriteToStream(     IStream* pStream);
-	HRESULT WriteToStream(     IStream* pStream, VARTYPE vtWrite)
-	{
-		if (vtWrite != VT_EMPTY && vtWrite != vt)
-		{
-			CComVariant varConv;
-			HRESULT hr = varConv.ChangeType(vtWrite, this);
-			if (((HRESULT)(hr) < 0))
-			{
-				return hr;
-			}
-			return varConv.WriteToStream(pStream);
-		}
-		return WriteToStream(pStream);
-	}
-
-	HRESULT ReadFromStream(     IStream* pStream, VARTYPE vtExpected = VT_EMPTY);
-
-	HRESULT ReadFromStream(     IStream* pStream,      VARTYPE vtExpected,
-		     ClassesAllowedInStream rgclsidAllowed,      DWORD cclsidAllowed);
-
-	
-	ULONG GetSize() const;
-
-
-public:
-	HRESULT InternalClear()
-	{
-		HRESULT hr = Clear();
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2583, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		if (((HRESULT)(hr) < 0))
-		{
-			vt = VT_ERROR;
-			scode = hr;
-
-			ATL::AtlThrowImpl(hr);
-
-		}
-		return hr;
-	}
-
-	void InternalCopy(     const VARIANT* pSrc)
-	{
-		HRESULT hr = Copy(pSrc);
-		if (((HRESULT)(hr) < 0))
-		{
-			vt = VT_ERROR;
-			scode = hr;
-
-			ATL::AtlThrowImpl(hr);
-
-		}
-	}
-};
-
-#pragma warning(push)
-#pragma warning(disable: 4702)
-inline HRESULT CComVariant::WriteToStream(     IStream* pStream)
-{
-	if(pStream == 0)
-		return ((HRESULT)0x80070057L);
-		
-	HRESULT hr = pStream->Write(&vt, sizeof(VARTYPE), 0);
-	if (((HRESULT)(hr) < 0))
-		return hr;
-
-	int cbWrite = 0;
-	switch (vt)
-	{
-	case VT_UNKNOWN:
-	case VT_DISPATCH:
-		{
-			CComPtr<IPersistStream> spStream;
-			if (punkVal != 0)
-			{
-				hr = punkVal->QueryInterface(__uuidof(IPersistStream), (void**)&spStream);
-				if (((HRESULT)(hr) < 0))
-				{
-					hr = punkVal->QueryInterface(__uuidof(IPersistStreamInit), (void**)&spStream);
-					if (((HRESULT)(hr) < 0))
-						return hr;
-				}
-			}
-			if (spStream != 0)
-				return OleSaveToStream(spStream, pStream);
-			return WriteClassStm(pStream, GUID_NULL);
-		}
-	case VT_UI1:
-	case VT_I1:
-		cbWrite = sizeof(BYTE);
-		break;
-	case VT_I2:
-	case VT_UI2:
-	case VT_BOOL:
-		cbWrite = sizeof(short);
-		break;
-	case VT_I4:
-	case VT_UI4:
-	case VT_R4:
-	case VT_INT:
-	case VT_UINT:
-	case VT_ERROR:
-		cbWrite = sizeof(long);
-		break;
-	case VT_I8:
-	case VT_UI8:
-		cbWrite = sizeof(LONGLONG);
-		break;
-	case VT_R8:
-	case VT_CY:
-	case VT_DATE:
-		cbWrite = sizeof(double);
-		break;
-	default:
-		break;
-	}
-	if (cbWrite != 0)
-		return pStream->Write((void*) &bVal, cbWrite, 0);
-
-	CComBSTR bstrWrite;
-	CComVariant varBSTR;
-	if (vt != VT_BSTR)
-	{
-		hr = VariantChangeType(&varBSTR, this, 0x01, VT_BSTR);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		bstrWrite.Attach(varBSTR.bstrVal);
-	}
-	else
-		bstrWrite.Attach(bstrVal);
-
-	hr = bstrWrite.WriteToStream(pStream);
-	bstrWrite.Detach();
-	return hr;
-}
-#pragma warning(pop)	
-
-inline HRESULT CComVariant::ReadFromStream(     IStream* pStream,      VARTYPE vtExpected  )
-{
-	ClassesAllowedInStream allowed;
-	allowed.rgclsidAllowed = 0;
-
-	return ReadFromStream(pStream, vtExpected, allowed, 0);
-}
-
-inline HRESULT CComVariant::ReadFromStream(     IStream* pStream,      VARTYPE vtExpected, 
-				     ClassesAllowedInStream rgclsidAllowed,      DWORD cclsidAllowed)
-{
-	(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2702, 0, L"pStream != 0")) || (__debugbreak(), 0));
-	if(pStream == 0)
-		return ((HRESULT)0x80070057L);
-		
-	HRESULT hr;
-	hr = VariantClear(this);
-	if (((HRESULT)(hr) < 0))
-		return hr;
-	VARTYPE vtRead = VT_EMPTY;
-	ULONG cbRead = 0;
-	hr = pStream->Read(&vtRead, sizeof(VARTYPE), &cbRead);
-	if (hr == ((HRESULT)0x00000001L) || (cbRead != sizeof(VARTYPE) && hr == ((HRESULT)0x00000000L)))
-		hr = ((HRESULT)0x80004005L);
-	if (((HRESULT)(hr) < 0))
-		return hr;
-	if (vtExpected != VT_EMPTY && vtRead != vtExpected)
-		return ((HRESULT)0x80004005L);
-
-	vt = vtRead;
-	cbRead = 0;
-	switch (vtRead)
-	{
-	case VT_UNKNOWN:
-	case VT_DISPATCH:
-		{
-			punkVal = 0;
-
-
-
-
-
-
-
-			hr = AtlInternalOleLoadFromStream(pStream,
-				(vtRead == VT_UNKNOWN) ? __uuidof(IUnknown) : __uuidof(IDispatch),
-				(void**)&punkVal, rgclsidAllowed, cclsidAllowed);
-
-			
-			
-			if (hr == ((HRESULT)0x80040154L))
-				hr = ((HRESULT)0x00000000L);
-			return hr;
-		}
-	case VT_UI1:
-	case VT_I1:
-		cbRead = sizeof(BYTE);
-		break;
-	case VT_I2:
-	case VT_UI2:
-	case VT_BOOL:
-		cbRead = sizeof(short);
-		break;
-	case VT_I4:
-	case VT_UI4:
-	case VT_R4:
-	case VT_INT:
-	case VT_UINT:
-	case VT_ERROR:
-		cbRead = sizeof(long);
-		break;
-	case VT_I8:
-	case VT_UI8:
-		cbRead = sizeof(LONGLONG);
-		break;
-	case VT_R8:
-	case VT_CY:
-	case VT_DATE:
-		cbRead = sizeof(double);
-		break;
-	default:
-		break;
-	}
-	if (cbRead != 0)
-	{
-		hr = pStream->Read((void*) &bVal, cbRead, 0);
-		if (hr == ((HRESULT)0x00000001L))
-			hr = ((HRESULT)0x80004005L);
-		return hr;
-	}
-	CComBSTR bstrRead;
-
-	hr = bstrRead.ReadFromStream(pStream);
-	if (((HRESULT)(hr) < 0))
-	{
-		
-		
-		LARGE_INTEGER nOffset;
-		nOffset.QuadPart = -(static_cast<LONGLONG>(sizeof(VARTYPE)));
-		pStream->Seek(nOffset, STREAM_SEEK_CUR, 0);
-		vt = VT_EMPTY;
-		return hr;
-	}
-	vt = VT_BSTR;
-	bstrVal = bstrRead.Detach();
-	if (vtRead != VT_BSTR)
-		hr = ChangeType(vtRead);
-	return hr;
-}
-
-inline ULONG CComVariant::GetSize() const
-{
-	ULONG nSize = sizeof(VARTYPE);
-	HRESULT hr;
-
-	switch (vt)
-	{
-	case VT_UNKNOWN:
-	case VT_DISPATCH:
-		{
-			CComPtr<IPersistStream> spStream;
-			if (punkVal != 0)
-			{
-				hr = punkVal->QueryInterface(__uuidof(IPersistStream), (void**)&spStream);
-				if (((HRESULT)(hr) < 0))
-				{
-					hr = punkVal->QueryInterface(__uuidof(IPersistStreamInit), (void**)&spStream);
-					if (((HRESULT)(hr) < 0))
-						break;
-				}
-			}
-			if (spStream != 0)
-			{
-				ULARGE_INTEGER nPersistSize;
-				nPersistSize.QuadPart = 0;
-				spStream->GetSizeMax(&nPersistSize);
-				nSize += nPersistSize.LowPart + sizeof(CLSID);
-			}
-			else
-				nSize += sizeof(CLSID);
-		}
-		break;
-	case VT_UI1:
-	case VT_I1:
-		nSize += sizeof(BYTE);
-		break;
-	case VT_I2:
-	case VT_UI2:
-	case VT_BOOL:
-		nSize += sizeof(short);
-		break;
-	case VT_I4:
-	case VT_UI4:
-	case VT_R4:
-	case VT_INT:
-	case VT_UINT:
-	case VT_ERROR:
-		nSize += sizeof(long);
-		break;
-	case VT_I8:
-	case VT_UI8:
-		nSize += sizeof(LONGLONG);
-		break;
-	case VT_R8:
-	case VT_CY:
-	case VT_DATE:
-		nSize += sizeof(double);
-		break;
-	default:
-		break;
-	}
-	if (nSize == sizeof(VARTYPE))
-	{
-		VARTYPE vtTmp = vt;
-		BSTR        bstr = 0;
-		CComVariant varBSTR;
-		if (vtTmp != VT_BSTR)
-		{
-			hr = VariantChangeType(&varBSTR, const_cast<VARIANT*>((const VARIANT*)this), 0x01, VT_BSTR);
-			if (((HRESULT)(hr) >= 0))
-			{
-				bstr = varBSTR.bstrVal;
-				vtTmp = VT_BSTR;
-			}
-		} else
-		{
-			bstr = bstrVal;
-		}
-
-		if (vtTmp == VT_BSTR)
-		{
-			
-			nSize += CComBSTR::GetStreamSize(bstr);			
-		}
-	}
-	return nSize;
-}
-
-inline HRESULT CComPtr<IDispatch>::Invoke2(     DISPID dispid,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet) throw()
-{
-	if(pvarParam1 == 0 || pvarParam2 == 0)
-		return ((HRESULT)0x80070057L);
-			
-	CComVariant varArgs[2] = { *pvarParam2, *pvarParam1 };
-	DISPPARAMS dispparams = { &varArgs[0], 0, 2, 0};
-	return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
-}
-
-
-inline HRESULT AtlInternalOleLoadFromStream(
-	     IStream* pStm, 
-	     const IID & iidInterface, 
-	                  void** ppvObj, 
-	     ClassesAllowedInStream rgclsidAllowed, 
-	     DWORD cclsidAllowed)
-{
-	do { (void) ((!!((pStm != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2907, 0, L"pStm != 0")) || (__debugbreak(), 0)); ; } while(0);
-	*ppvObj = 0;
-	CLSID clsid;
-
-	HRESULT hr = ReadClassStm(pStm, &clsid);
-
-	if (((HRESULT)(hr) < 0))
-	{
-		return hr;
-	}
-	
-	CComPtr<IUnknown> punkVal;
-
-	if (cclsidAllowed != 0)
-	{
-		do { (void) ((!!((rgclsidAllowed.rgclsidAllowed != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2922, 0, L"rgclsidAllowed.rgclsidAllowed != 0")) || (__debugbreak(), 0)); ; } while(0);
-		hr = ((HRESULT)0x80070005L);
-		
-		for(DWORD i = 0; i < cclsidAllowed; i++)
-		{
-			if (IsEqualGUID(clsid, rgclsidAllowed.rgclsidAllowed[i]))
-			{
-				hr = ((HRESULT)0x00000000L);
-				break;
-			}
-		}		
-	}
-	else if (rgclsidAllowed.pfnClsidAllowed != 0) 
-	{
-		hr = rgclsidAllowed.pfnClsidAllowed(clsid, iidInterface, reinterpret_cast<void**>(&punkVal));
-	}
-	
-	if (((HRESULT)(hr) < 0))
-	{
-		return hr;
-	}
-
-	if (punkVal == 0)
-	{
-		hr = CoCreateInstance(clsid, 0, (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER) | CLSCTX_NO_CODE_DOWNLOAD, iidInterface, reinterpret_cast<void**>(&punkVal));
-		if (((HRESULT)(hr) < 0))
-		{
-			return hr;
-		}
-	}
-
-	CComPtr<IPersistStream> pPersistStm;
-	hr = punkVal->QueryInterface(&pPersistStm);
-	
-	if (((HRESULT)(hr) >= 0))
-	{
-		hr = pPersistStm->Load(pStm);
-		
-		if (((HRESULT)(hr) >= 0))
-		{
-			*ppvObj = punkVal.Detach();			
-		}
-	}
-
-	return hr;
-}
-
-
-}	
-#pragma pack(pop)
-
-#pragma warning (pop)	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IEnumGUID IEnumGUID;
-
-
-
-
-
-typedef struct IEnumCATEGORYINFO IEnumCATEGORYINFO;
-
-
-
-
-
-typedef struct ICatRegister ICatRegister;
-
-
-
-
-
-typedef struct ICatInformation ICatInformation;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(lib,"uuid.lib")
-
-
-
-
-
-
-
-
-
-extern "C" const CLSID CLSID_StdComponentCategoriesMgr;
-
-
-
-typedef GUID CATID;
-
-typedef const GUID & REFCATID;
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const CATID CATID_Insertable;
-extern "C" const CATID CATID_Control;
-extern "C" const CATID CATID_Programmable;
-extern "C" const CATID CATID_IsShortcut;
-extern "C" const CATID CATID_NeverShowExt;
-extern "C" const CATID CATID_DocObject;
-extern "C" const CATID CATID_Printable;
-extern "C" const CATID CATID_RequiresDataPathHost;
-extern "C" const CATID CATID_PersistsToMoniker;
-extern "C" const CATID CATID_PersistsToStorage;
-extern "C" const CATID CATID_PersistsToStreamInit;
-extern "C" const CATID CATID_PersistsToStream;
-extern "C" const CATID CATID_PersistsToMemory;
-extern "C" const CATID CATID_PersistsToFile;
-extern "C" const CATID CATID_PersistsToPropertyBag;
-extern "C" const CATID CATID_InternetAware;
-extern "C" const CATID CATID_DesignTimeUIActivatableControl;
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IEnumGUID *LPENUMGUID;
-
-
-extern "C" const IID IID_IEnumGUID;
-
-
-    
-    struct __declspec(uuid("0002E000-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumGUID : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Next( 
-             ULONG celt,
-             GUID *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumGUID **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IEnumGUID_Next_Proxy( 
-    IEnumGUID * This,
-     ULONG celt,
-     GUID *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumGUID_Next_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumGUID_Skip_Proxy( 
-    IEnumGUID * This,
-     ULONG celt);
-
-
-void __stdcall IEnumGUID_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumGUID_Reset_Proxy( 
-    IEnumGUID * This);
-
-
-void __stdcall IEnumGUID_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumGUID_Clone_Proxy( 
-    IEnumGUID * This,
-     IEnumGUID **ppenum);
-
-
-void __stdcall IEnumGUID_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0009_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0009_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IEnumCATEGORYINFO *LPENUMCATEGORYINFO;
-
-typedef struct tagCATEGORYINFO
-    {
-    CATID catid;
-    LCID lcid;
-    OLECHAR szDescription[ 128 ];
-    } 	CATEGORYINFO;
-
-typedef struct tagCATEGORYINFO *LPCATEGORYINFO;
-
-
-extern "C" const IID IID_IEnumCATEGORYINFO;
-
-
-    
-    struct __declspec(uuid("0002E011-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumCATEGORYINFO : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Next( 
-             ULONG celt,
-             CATEGORYINFO *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumCATEGORYINFO **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IEnumCATEGORYINFO_Next_Proxy( 
-    IEnumCATEGORYINFO * This,
-     ULONG celt,
-     CATEGORYINFO *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumCATEGORYINFO_Next_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumCATEGORYINFO_Skip_Proxy( 
-    IEnumCATEGORYINFO * This,
-     ULONG celt);
-
-
-void __stdcall IEnumCATEGORYINFO_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumCATEGORYINFO_Reset_Proxy( 
-    IEnumCATEGORYINFO * This);
-
-
-void __stdcall IEnumCATEGORYINFO_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumCATEGORYINFO_Clone_Proxy( 
-    IEnumCATEGORYINFO * This,
-     IEnumCATEGORYINFO **ppenum);
-
-
-void __stdcall IEnumCATEGORYINFO_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0010_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0010_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  ICatRegister *LPCATREGISTER;
-
-
-extern "C" const IID IID_ICatRegister;
-
-
-    
-    struct __declspec(uuid("0002E012-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICatRegister : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RegisterCategories( 
-             ULONG cCategories,
-             CATEGORYINFO rgCategoryInfo[  ]) = 0;
-        
-        virtual HRESULT __stdcall UnRegisterCategories( 
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-        virtual HRESULT __stdcall RegisterClassImplCategories( 
-             const IID & rclsid,
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-        virtual HRESULT __stdcall UnRegisterClassImplCategories( 
-             const IID & rclsid,
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-        virtual HRESULT __stdcall RegisterClassReqCategories( 
-             const IID & rclsid,
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-        virtual HRESULT __stdcall UnRegisterClassReqCategories( 
-             const IID & rclsid,
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICatRegister_RegisterCategories_Proxy( 
-    ICatRegister * This,
-     ULONG cCategories,
-     CATEGORYINFO rgCategoryInfo[  ]);
-
-
-void __stdcall ICatRegister_RegisterCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_UnRegisterCategories_Proxy( 
-    ICatRegister * This,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_UnRegisterCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_RegisterClassImplCategories_Proxy( 
-    ICatRegister * This,
-     const IID & rclsid,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_RegisterClassImplCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_UnRegisterClassImplCategories_Proxy( 
-    ICatRegister * This,
-     const IID & rclsid,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_UnRegisterClassImplCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_RegisterClassReqCategories_Proxy( 
-    ICatRegister * This,
-     const IID & rclsid,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_RegisterClassReqCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_UnRegisterClassReqCategories_Proxy( 
-    ICatRegister * This,
-     const IID & rclsid,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_UnRegisterClassReqCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0011_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0011_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  ICatInformation *LPCATINFORMATION;
-
-
-extern "C" const IID IID_ICatInformation;
-
-
-    
-    struct __declspec(uuid("0002E013-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICatInformation : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall EnumCategories( 
-             LCID lcid,
-             IEnumCATEGORYINFO **ppenumCategoryInfo) = 0;
-        
-        virtual HRESULT __stdcall GetCategoryDesc( 
-             REFCATID rcatid,
-             LCID lcid,
-             LPWSTR *pszDesc) = 0;
-        
-        virtual  HRESULT __stdcall EnumClassesOfCategories( 
-             ULONG cImplemented,
-             CATID rgcatidImpl[  ],
-             ULONG cRequired,
-             CATID rgcatidReq[  ],
-             IEnumGUID **ppenumClsid) = 0;
-        
-        virtual  HRESULT __stdcall IsClassOfCategories( 
-             const IID & rclsid,
-             ULONG cImplemented,
-             CATID rgcatidImpl[  ],
-             ULONG cRequired,
-             CATID rgcatidReq[  ]) = 0;
-        
-        virtual HRESULT __stdcall EnumImplCategoriesOfClass( 
-             const IID & rclsid,
-             IEnumGUID **ppenumCatid) = 0;
-        
-        virtual HRESULT __stdcall EnumReqCategoriesOfClass( 
-             const IID & rclsid,
-             IEnumGUID **ppenumCatid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICatInformation_EnumCategories_Proxy( 
-    ICatInformation * This,
-     LCID lcid,
-     IEnumCATEGORYINFO **ppenumCategoryInfo);
-
-
-void __stdcall ICatInformation_EnumCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatInformation_GetCategoryDesc_Proxy( 
-    ICatInformation * This,
-     REFCATID rcatid,
-     LCID lcid,
-     LPWSTR *pszDesc);
-
-
-void __stdcall ICatInformation_GetCategoryDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ICatInformation_RemoteEnumClassesOfCategories_Proxy( 
-    ICatInformation * This,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ],
-     IEnumGUID **ppenumClsid);
-
-
-void __stdcall ICatInformation_RemoteEnumClassesOfCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ICatInformation_RemoteIsClassOfCategories_Proxy( 
-    ICatInformation * This,
-     const IID & rclsid,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ]);
-
-
-void __stdcall ICatInformation_RemoteIsClassOfCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatInformation_EnumImplCategoriesOfClass_Proxy( 
-    ICatInformation * This,
-     const IID & rclsid,
-     IEnumGUID **ppenumCatid);
-
-
-void __stdcall ICatInformation_EnumImplCategoriesOfClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatInformation_EnumReqCategoriesOfClass_Proxy( 
-    ICatInformation * This,
-     const IID & rclsid,
-     IEnumGUID **ppenumCatid);
-
-
-void __stdcall ICatInformation_EnumReqCategoriesOfClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0012_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0012_v0_0_s_ifspec;
-
-
-
- HRESULT __stdcall ICatInformation_EnumClassesOfCategories_Proxy( 
-    ICatInformation * This,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ],
-     IEnumGUID **ppenumClsid);
-
-
- HRESULT __stdcall ICatInformation_EnumClassesOfCategories_Stub( 
-    ICatInformation * This,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ],
-     IEnumGUID **ppenumClsid);
-
- HRESULT __stdcall ICatInformation_IsClassOfCategories_Proxy( 
-    ICatInformation * This,
-     const IID & rclsid,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ]);
-
-
- HRESULT __stdcall ICatInformation_IsClassOfCategories_Stub( 
-    ICatInformation * This,
-     const IID & rclsid,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ]);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IRegistrarBase IRegistrarBase;
-
-
-
-
-
-typedef struct IRegistrar IRegistrar;
-
-
-
-
-
-typedef struct IDocHostUIHandlerDispatch IDocHostUIHandlerDispatch;
-
-
-
-
-
-typedef struct IAxWinHostWindow IAxWinHostWindow;
-
-
-
-
-
-typedef struct IAxWinHostWindowLic IAxWinHostWindowLic;
-
-
-
-
-
-typedef struct IAxWinAmbientDispatch IAxWinAmbientDispatch;
-
-
-
-
-
-typedef struct IAxWinAmbientDispatchEx IAxWinAmbientDispatchEx;
-
-
-
-
-
-typedef struct IInternalConnection IInternalConnection;
-
-
-
-
-
-typedef struct IAccessibleProxy IAccessibleProxy;
-
-
-
-
-
-typedef struct IAccessibleServer IAccessibleServer;
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IAccessible IAccessible;
-
-
-
-
-
-typedef struct IAccessibleHandler IAccessibleHandler;
-
-
-
-
-
-typedef struct IAccIdentity IAccIdentity;
-
-
-
-
-
-typedef struct IAccPropServer IAccPropServer;
-
-
-
-
-
-typedef struct IAccPropServices IAccPropServices;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef class CAccPropServices CAccPropServices;
-
-
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LRESULT (__stdcall *LPFNLRESULTFROMOBJECT)(const IID & riid, WPARAM wParam, LPUNKNOWN punk);
-typedef HRESULT (__stdcall *LPFNOBJECTFROMLRESULT)(LRESULT lResult, const IID & riid, WPARAM wParam, void** ppvObject);
-typedef HRESULT (__stdcall *LPFNACCESSIBLEOBJECTFROMWINDOW)(HWND hwnd, DWORD dwId, const IID & riid, void** ppvObject);
-typedef HRESULT (__stdcall *LPFNACCESSIBLEOBJECTFROMPOINT)(POINT ptScreen, IAccessible** ppacc, VARIANT* pvarChild);
-typedef HRESULT (__stdcall *LPFNCREATESTDACCESSIBLEOBJECT)(HWND hwnd, LONG idObject, const IID & riid, void** ppvObject);
-typedef HRESULT (__stdcall *LPFNACCESSIBLECHILDREN)(IAccessible* paccContainer, LONG iChildStart,LONG cChildren,VARIANT* rgvarChildren,LONG* pcObtained);
-
-
-
-
-
-extern "C" const GUID  LIBID_Accessibility;
-extern "C" const GUID  IID_IAccessible;
-extern "C" const GUID  IID_IAccessibleHandler;
-extern "C" const GUID  IID_IAccIdentity;
-extern "C" const GUID  IID_IAccPropServer;
-extern "C" const GUID  IID_IAccPropServices;
-extern "C" const GUID  IID_IAccPropMgrInternal;
-extern "C" const GUID  CLSID_AccPropServices;
-extern "C" const GUID  IIS_IsOleaccProxy;
-
-
-
-
-
-extern "C" LRESULT __stdcall LresultFromObject(const IID & riid, WPARAM wParam, LPUNKNOWN punk);
-extern "C" HRESULT __stdcall          ObjectFromLresult(LRESULT lResult, const IID & riid, WPARAM wParam, void** ppvObject);
-extern "C" HRESULT __stdcall          WindowFromAccessibleObject(IAccessible*, HWND* phwnd);
-extern "C" HRESULT __stdcall          AccessibleObjectFromWindow(HWND hwnd, DWORD dwId, const IID & riid, void **ppvObject);
-extern "C" HRESULT __stdcall          AccessibleObjectFromEvent(HWND hwnd, DWORD dwId, DWORD dwChildId, IAccessible** ppacc, VARIANT* pvarChild);
-extern "C" HRESULT __stdcall          AccessibleObjectFromPoint(POINT ptScreen, IAccessible ** ppacc, VARIANT* pvarChild);
-extern "C" HRESULT __stdcall          AccessibleChildren (IAccessible* paccContainer, LONG iChildStart,LONG cChildren, VARIANT* rgvarChildren,LONG* pcObtained);
-
-extern "C" UINT __stdcall   GetRoleTextA(DWORD lRole, LPSTR lpszRole, UINT cchRoleMax);
-extern "C" UINT __stdcall   GetRoleTextW(DWORD lRole, LPWSTR lpszRole, UINT cchRoleMax);
-
-
-
-
-
-
-
-extern "C" UINT __stdcall   GetStateTextA(DWORD lStateBit, LPSTR lpszState, UINT cchState);
-extern "C" UINT __stdcall   GetStateTextW(DWORD lStateBit, LPWSTR lpszState, UINT cchState);
-
-
-
-
-
-
-extern "C" void __stdcall   GetOleaccVersionInfo(DWORD* pVer, DWORD* pBuild);
-
-extern "C" HRESULT __stdcall          CreateStdAccessibleObject(HWND hwnd, LONG idObject, const IID & riid, void** ppvObject);
-
-extern "C" HRESULT __stdcall          CreateStdAccessibleProxyA(HWND hwnd, LPCSTR pClassName, LONG idObject, const IID & riid, void** ppvObject);
-extern "C" HRESULT __stdcall          CreateStdAccessibleProxyW(HWND hwnd, LPCWSTR pClassName, LONG idObject, const IID & riid, void** ppvObject);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMSAAMENUINFO {
-    DWORD   dwMSAASignature; 
-    DWORD   cchWText;        
-    LPWSTR  pszWText;        
-} MSAAMENUINFO, *LPMSAAMENUINFO;
-
-
-
-
-
-
-extern "C" const GUID  PROPID_ACC_NAME;
-extern "C" const GUID  PROPID_ACC_VALUE;
-extern "C" const GUID  PROPID_ACC_DESCRIPTION;
-extern "C" const GUID  PROPID_ACC_ROLE;
-extern "C" const GUID  PROPID_ACC_STATE;
-extern "C" const GUID  PROPID_ACC_HELP;
-extern "C" const GUID  PROPID_ACC_KEYBOARDSHORTCUT;
-extern "C" const GUID  PROPID_ACC_DEFAULTACTION;
-
-extern "C" const GUID  PROPID_ACC_HELPTOPIC;
-extern "C" const GUID  PROPID_ACC_FOCUS;
-extern "C" const GUID  PROPID_ACC_SELECTION;
-extern "C" const GUID  PROPID_ACC_PARENT;
-
-extern "C" const GUID  PROPID_ACC_NAV_UP;
-extern "C" const GUID  PROPID_ACC_NAV_DOWN;
-extern "C" const GUID  PROPID_ACC_NAV_LEFT;
-extern "C" const GUID  PROPID_ACC_NAV_RIGHT;
-extern "C" const GUID  PROPID_ACC_NAV_PREV;
-extern "C" const GUID  PROPID_ACC_NAV_NEXT;
-extern "C" const GUID  PROPID_ACC_NAV_FIRSTCHILD;
-extern "C" const GUID  PROPID_ACC_NAV_LASTCHILD;
-
-
-extern "C" const GUID  PROPID_ACC_ROLEMAP;
-extern "C" const GUID  PROPID_ACC_VALUEMAP;
-extern "C" const GUID  PROPID_ACC_STATEMAP;
-extern "C" const GUID  PROPID_ACC_DESCRIPTIONMAP;
-
-extern "C" const GUID  PROPID_ACC_DODEFAULTACTION;
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  IAccessible *LPACCESSIBLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IAccessible;
-
-
-    
-    struct __declspec(uuid("618736e0-3c3d-11cf-810c-00aa00389b71")) __declspec(novtable)
-    IAccessible : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_accParent( 
-             IDispatch **ppdispParent) = 0;
-        
-        virtual  HRESULT __stdcall get_accChildCount( 
-             long *pcountChildren) = 0;
-        
-        virtual  HRESULT __stdcall get_accChild( 
-             VARIANT varChild,
-             IDispatch **ppdispChild) = 0;
-        
-        virtual  HRESULT __stdcall get_accName( 
-             VARIANT varChild,
-             BSTR *pszName) = 0;
-        
-        virtual  HRESULT __stdcall get_accValue( 
-             VARIANT varChild,
-             BSTR *pszValue) = 0;
-        
-        virtual  HRESULT __stdcall get_accDescription( 
-             VARIANT varChild,
-             BSTR *pszDescription) = 0;
-        
-        virtual  HRESULT __stdcall get_accRole( 
-             VARIANT varChild,
-             VARIANT *pvarRole) = 0;
-        
-        virtual  HRESULT __stdcall get_accState( 
-             VARIANT varChild,
-             VARIANT *pvarState) = 0;
-        
-        virtual  HRESULT __stdcall get_accHelp( 
-             VARIANT varChild,
-             BSTR *pszHelp) = 0;
-        
-        virtual  HRESULT __stdcall get_accHelpTopic( 
-             BSTR *pszHelpFile,
-             VARIANT varChild,
-             long *pidTopic) = 0;
-        
-        virtual  HRESULT __stdcall get_accKeyboardShortcut( 
-             VARIANT varChild,
-             BSTR *pszKeyboardShortcut) = 0;
-        
-        virtual  HRESULT __stdcall get_accFocus( 
-             VARIANT *pvarChild) = 0;
-        
-        virtual  HRESULT __stdcall get_accSelection( 
-             VARIANT *pvarChildren) = 0;
-        
-        virtual  HRESULT __stdcall get_accDefaultAction( 
-             VARIANT varChild,
-             BSTR *pszDefaultAction) = 0;
-        
-        virtual  HRESULT __stdcall accSelect( 
-             long flagsSelect,
-             VARIANT varChild) = 0;
-        
-        virtual  HRESULT __stdcall accLocation( 
-             long *pxLeft,
-             long *pyTop,
-             long *pcxWidth,
-             long *pcyHeight,
-             VARIANT varChild) = 0;
-        
-        virtual  HRESULT __stdcall accNavigate( 
-             long navDir,
-             VARIANT varStart,
-             VARIANT *pvarEndUpAt) = 0;
-        
-        virtual  HRESULT __stdcall accHitTest( 
-             long xLeft,
-             long yTop,
-             VARIANT *pvarChild) = 0;
-        
-        virtual  HRESULT __stdcall accDoDefaultAction( 
-             VARIANT varChild) = 0;
-        
-        virtual  HRESULT __stdcall put_accName( 
-             VARIANT varChild,
-             BSTR szName) = 0;
-        
-        virtual  HRESULT __stdcall put_accValue( 
-             VARIANT varChild,
-             BSTR szValue) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAccessible_get_accParent_Proxy( 
-    IAccessible * This,
-     IDispatch **ppdispParent);
-
-
-void __stdcall IAccessible_get_accParent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accChildCount_Proxy( 
-    IAccessible * This,
-     long *pcountChildren);
-
-
-void __stdcall IAccessible_get_accChildCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accChild_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     IDispatch **ppdispChild);
-
-
-void __stdcall IAccessible_get_accChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accName_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszName);
-
-
-void __stdcall IAccessible_get_accName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accValue_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszValue);
-
-
-void __stdcall IAccessible_get_accValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accDescription_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszDescription);
-
-
-void __stdcall IAccessible_get_accDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accRole_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     VARIANT *pvarRole);
-
-
-void __stdcall IAccessible_get_accRole_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accState_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     VARIANT *pvarState);
-
-
-void __stdcall IAccessible_get_accState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accHelp_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszHelp);
-
-
-void __stdcall IAccessible_get_accHelp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accHelpTopic_Proxy( 
-    IAccessible * This,
-     BSTR *pszHelpFile,
-     VARIANT varChild,
-     long *pidTopic);
-
-
-void __stdcall IAccessible_get_accHelpTopic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accKeyboardShortcut_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszKeyboardShortcut);
-
-
-void __stdcall IAccessible_get_accKeyboardShortcut_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accFocus_Proxy( 
-    IAccessible * This,
-     VARIANT *pvarChild);
-
-
-void __stdcall IAccessible_get_accFocus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accSelection_Proxy( 
-    IAccessible * This,
-     VARIANT *pvarChildren);
-
-
-void __stdcall IAccessible_get_accSelection_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accDefaultAction_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszDefaultAction);
-
-
-void __stdcall IAccessible_get_accDefaultAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accSelect_Proxy( 
-    IAccessible * This,
-     long flagsSelect,
-     VARIANT varChild);
-
-
-void __stdcall IAccessible_accSelect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accLocation_Proxy( 
-    IAccessible * This,
-     long *pxLeft,
-     long *pyTop,
-     long *pcxWidth,
-     long *pcyHeight,
-     VARIANT varChild);
-
-
-void __stdcall IAccessible_accLocation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accNavigate_Proxy( 
-    IAccessible * This,
-     long navDir,
-     VARIANT varStart,
-     VARIANT *pvarEndUpAt);
-
-
-void __stdcall IAccessible_accNavigate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accHitTest_Proxy( 
-    IAccessible * This,
-     long xLeft,
-     long yTop,
-     VARIANT *pvarChild);
-
-
-void __stdcall IAccessible_accHitTest_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accDoDefaultAction_Proxy( 
-    IAccessible * This,
-     VARIANT varChild);
-
-
-void __stdcall IAccessible_accDoDefaultAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_put_accName_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR szName);
-
-
-void __stdcall IAccessible_put_accName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_put_accValue_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR szValue);
-
-
-void __stdcall IAccessible_put_accValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IAccessibleHandler *LPACCESSIBLEHANDLER;
-
-
-extern "C" const IID IID_IAccessibleHandler;
-
-
-    
-    struct __declspec(uuid("03022430-ABC4-11d0-BDE2-00AA001A1953")) __declspec(novtable)
-    IAccessibleHandler : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AccessibleObjectFromID( 
-             long hwnd,
-             long lObjectID,
-             LPACCESSIBLE *pIAccessible) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccessibleHandler_AccessibleObjectFromID_Proxy( 
-    IAccessibleHandler * This,
-     long hwnd,
-     long lObjectID,
-     LPACCESSIBLE *pIAccessible);
-
-
-void __stdcall IAccessibleHandler_AccessibleObjectFromID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-typedef 
-enum AnnoScope
-    {	ANNO_THIS	= 0,
-	ANNO_CONTAINER	= 1
-    } 	AnnoScope;
-
-typedef GUID MSAAPROPID;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0116_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0116_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccIdentity;
-
-
-    
-    struct __declspec(uuid("7852b78d-1cfd-41c1-a615-9c0c85960b5f")) __declspec(novtable)
-    IAccIdentity : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetIdentityString( 
-             DWORD dwIDChild,
-             BYTE **ppIDString,
-             DWORD *pdwIDStringLen) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccIdentity_GetIdentityString_Proxy( 
-    IAccIdentity * This,
-     DWORD dwIDChild,
-     BYTE **ppIDString,
-     DWORD *pdwIDStringLen);
-
-
-void __stdcall IAccIdentity_GetIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccPropServer;
-
-
-    
-    struct __declspec(uuid("76c0dbbb-15e0-4e7b-b61b-20eeea2001e0")) __declspec(novtable)
-    IAccPropServer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetPropValue( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             MSAAPROPID idProp,
-             VARIANT *pvarValue,
-             BOOL *pfHasProp) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccPropServer_GetPropValue_Proxy( 
-    IAccPropServer * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     MSAAPROPID idProp,
-     VARIANT *pvarValue,
-     BOOL *pfHasProp);
-
-
-void __stdcall IAccPropServer_GetPropValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccPropServices;
-
-
-    
-    struct __declspec(uuid("6e26e776-04f0-495d-80e4-3330352e3169")) __declspec(novtable)
-    IAccPropServices : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetPropValue( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             MSAAPROPID idProp,
-             VARIANT var) = 0;
-        
-        virtual HRESULT __stdcall SetPropServer( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             const MSAAPROPID *paProps,
-             int cProps,
-             IAccPropServer *pServer,
-             AnnoScope annoScope) = 0;
-        
-        virtual HRESULT __stdcall ClearProps( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             const MSAAPROPID *paProps,
-             int cProps) = 0;
-        
-        virtual HRESULT __stdcall SetHwndProp( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             MSAAPROPID idProp,
-             VARIANT var) = 0;
-        
-        virtual HRESULT __stdcall SetHwndPropStr( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             MSAAPROPID idProp,
-             LPCWSTR str) = 0;
-        
-        virtual HRESULT __stdcall SetHwndPropServer( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             const MSAAPROPID *paProps,
-             int cProps,
-             IAccPropServer *pServer,
-             AnnoScope annoScope) = 0;
-        
-        virtual HRESULT __stdcall ClearHwndProps( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             const MSAAPROPID *paProps,
-             int cProps) = 0;
-        
-        virtual HRESULT __stdcall ComposeHwndIdentityString( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             BYTE **ppIDString,
-             DWORD *pdwIDStringLen) = 0;
-        
-        virtual HRESULT __stdcall DecomposeHwndIdentityString( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             HWND *phwnd,
-             DWORD *pidObject,
-             DWORD *pidChild) = 0;
-        
-        virtual HRESULT __stdcall SetHmenuProp( 
-             HMENU hmenu,
-             DWORD idChild,
-             MSAAPROPID idProp,
-             VARIANT var) = 0;
-        
-        virtual HRESULT __stdcall SetHmenuPropStr( 
-             HMENU hmenu,
-             DWORD idChild,
-             MSAAPROPID idProp,
-             LPCWSTR str) = 0;
-        
-        virtual HRESULT __stdcall SetHmenuPropServer( 
-             HMENU hmenu,
-             DWORD idChild,
-             const MSAAPROPID *paProps,
-             int cProps,
-             IAccPropServer *pServer,
-             AnnoScope annoScope) = 0;
-        
-        virtual HRESULT __stdcall ClearHmenuProps( 
-             HMENU hmenu,
-             DWORD idChild,
-             const MSAAPROPID *paProps,
-             int cProps) = 0;
-        
-        virtual HRESULT __stdcall ComposeHmenuIdentityString( 
-             HMENU hmenu,
-             DWORD idChild,
-             BYTE **ppIDString,
-             DWORD *pdwIDStringLen) = 0;
-        
-        virtual HRESULT __stdcall DecomposeHmenuIdentityString( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             HMENU *phmenu,
-             DWORD *pidChild) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccPropServices_SetPropValue_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     MSAAPROPID idProp,
-     VARIANT var);
-
-
-void __stdcall IAccPropServices_SetPropValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetPropServer_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     const MSAAPROPID *paProps,
-     int cProps,
-     IAccPropServer *pServer,
-     AnnoScope annoScope);
-
-
-void __stdcall IAccPropServices_SetPropServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ClearProps_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     const MSAAPROPID *paProps,
-     int cProps);
-
-
-void __stdcall IAccPropServices_ClearProps_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHwndProp_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     MSAAPROPID idProp,
-     VARIANT var);
-
-
-void __stdcall IAccPropServices_SetHwndProp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHwndPropStr_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     MSAAPROPID idProp,
-     LPCWSTR str);
-
-
-void __stdcall IAccPropServices_SetHwndPropStr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHwndPropServer_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     const MSAAPROPID *paProps,
-     int cProps,
-     IAccPropServer *pServer,
-     AnnoScope annoScope);
-
-
-void __stdcall IAccPropServices_SetHwndPropServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ClearHwndProps_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     const MSAAPROPID *paProps,
-     int cProps);
-
-
-void __stdcall IAccPropServices_ClearHwndProps_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ComposeHwndIdentityString_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     BYTE **ppIDString,
-     DWORD *pdwIDStringLen);
-
-
-void __stdcall IAccPropServices_ComposeHwndIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_DecomposeHwndIdentityString_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     HWND *phwnd,
-     DWORD *pidObject,
-     DWORD *pidChild);
-
-
-void __stdcall IAccPropServices_DecomposeHwndIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHmenuProp_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     MSAAPROPID idProp,
-     VARIANT var);
-
-
-void __stdcall IAccPropServices_SetHmenuProp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHmenuPropStr_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     MSAAPROPID idProp,
-     LPCWSTR str);
-
-
-void __stdcall IAccPropServices_SetHmenuPropStr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHmenuPropServer_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     const MSAAPROPID *paProps,
-     int cProps,
-     IAccPropServer *pServer,
-     AnnoScope annoScope);
-
-
-void __stdcall IAccPropServices_SetHmenuPropServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ClearHmenuProps_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     const MSAAPROPID *paProps,
-     int cProps);
-
-
-void __stdcall IAccPropServices_ClearHmenuProps_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ComposeHmenuIdentityString_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     BYTE **ppIDString,
-     DWORD *pdwIDStringLen);
-
-
-void __stdcall IAccPropServices_ComposeHmenuIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_DecomposeHmenuIdentityString_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     HMENU *phmenu,
-     DWORD *pidChild);
-
-
-void __stdcall IAccPropServices_DecomposeHmenuIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0119_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0119_v0_0_s_ifspec;
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-extern "C" const IID LIBID_Accessibility;
-
-extern "C" const CLSID CLSID_CAccPropServices;
-
-
-
-class __declspec(uuid("b5f8350b-0548-48b1-a6ee-88bd00b4a5e7"))
-CAccPropServices;
-
-
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  HMENU_UserSize(     unsigned long *, unsigned long            , HMENU * ); 
-unsigned char * __stdcall  HMENU_UserMarshal(  unsigned long *, unsigned char *, HMENU * ); 
-unsigned char * __stdcall  HMENU_UserUnmarshal(unsigned long *, unsigned char *, HMENU * ); 
-void                      __stdcall  HMENU_UserFree(     unsigned long *, HMENU * ); 
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
-unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
-void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-extern "C" const CLSID CLSID_Registrar;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_atliface_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_atliface_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRegistrarBase;
-
-
-
-	struct __declspec(uuid("e21f8a85-b05d-4243-8183-c7cb405588f7")) __declspec(novtable)
-	IRegistrarBase : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall AddReplacement( 
-			 LPCOLESTR key,
-			 LPCOLESTR item) = 0;
-
-		virtual HRESULT __stdcall ClearReplacements( void) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRegistrarBase_AddReplacement_Proxy( 
-	IRegistrarBase * This,
-	 LPCOLESTR key,
-	 LPCOLESTR item);
-
-
-void __stdcall IRegistrarBase_AddReplacement_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrarBase_ClearReplacements_Proxy( 
-	IRegistrarBase * This);
-
-
-void __stdcall IRegistrarBase_ClearReplacements_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRegistrar;
-
-
-
-	struct __declspec(uuid("44EC053B-400F-11D0-9DCD-00A0C90391D3")) __declspec(novtable)
-	IRegistrar : public IRegistrarBase
-	{
-	public:
-		virtual HRESULT __stdcall ResourceRegisterSz( 
-			 LPCOLESTR resFileName,
-			 LPCOLESTR szID,
-			 LPCOLESTR szType) = 0;
-
-		virtual HRESULT __stdcall ResourceUnregisterSz( 
-			 LPCOLESTR resFileName,
-			 LPCOLESTR szID,
-			 LPCOLESTR szType) = 0;
-
-		virtual HRESULT __stdcall FileRegister( 
-			 LPCOLESTR fileName) = 0;
-
-		virtual HRESULT __stdcall FileUnregister( 
-			 LPCOLESTR fileName) = 0;
-
-		virtual HRESULT __stdcall StringRegister( 
-			 LPCOLESTR data) = 0;
-
-		virtual HRESULT __stdcall StringUnregister( 
-			 LPCOLESTR data) = 0;
-
-		virtual HRESULT __stdcall ResourceRegister( 
-			 LPCOLESTR resFileName,
-			 UINT nID,
-			 LPCOLESTR szType) = 0;
-
-		virtual HRESULT __stdcall ResourceUnregister( 
-			 LPCOLESTR resFileName,
-			 UINT nID,
-			 LPCOLESTR szType) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRegistrar_ResourceRegisterSz_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR resFileName,
-	 LPCOLESTR szID,
-	 LPCOLESTR szType);
-
-
-void __stdcall IRegistrar_ResourceRegisterSz_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_ResourceUnregisterSz_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR resFileName,
-	 LPCOLESTR szID,
-	 LPCOLESTR szType);
-
-
-void __stdcall IRegistrar_ResourceUnregisterSz_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_FileRegister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR fileName);
-
-
-void __stdcall IRegistrar_FileRegister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_FileUnregister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR fileName);
-
-
-void __stdcall IRegistrar_FileUnregister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_StringRegister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR data);
-
-
-void __stdcall IRegistrar_StringRegister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_StringUnregister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR data);
-
-
-void __stdcall IRegistrar_StringUnregister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_ResourceRegister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR resFileName,
-	 UINT nID,
-	 LPCOLESTR szType);
-
-
-void __stdcall IRegistrar_ResourceRegister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_ResourceUnregister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR resFileName,
-	 UINT nID,
-	 LPCOLESTR szType);
-
-
-void __stdcall IRegistrar_ResourceUnregister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef 
-enum tagDOCHOSTUIDBLCLKDispatch
-	{	docHostUIDblClkDEFAULT	= 0,
-	docHostUIDblClkSHOWPROPERTIES	= 1,
-	docHostUIDblClkSHOWCODE	= 2
-	} 	DOCHOSTUIDBLCLKDispatch;
-
-typedef 
-enum tagDocHostUIFlagDispatch
-	{	docHostUIFlagDIALOG	= 1,
-	docHostUIFlagDISABLE_HELP_MENU	= 2,
-	docHostUIFlagNO3DBORDER	= 4,
-	docHostUIFlagSCROLL_NO	= 8,
-	docHostUIFlagDISABLE_SCRIPT_INACTIVE	= 16,
-	docHostUIFlagOPENNEWWIN	= 32,
-	docHostUIFlagDISABLE_OFFSCREEN	= 64,
-	docHostUIFlagFLAT_SCROLLBAR	= 128,
-	docHostUIFlagDIV_BLOCKDEFAULT	= 256,
-	docHostUIFlagACTIVATE_CLIENTHIT_ONLY	= 512
-	} 	DocHostUIFlagDispatch;
-
-
-extern "C" const IID IID_IDocHostUIHandlerDispatch;
-
-
-
-	struct __declspec(uuid("425B5AF0-65F1-11d1-9611-0000F81E0D0D")) __declspec(novtable)
-	IDocHostUIHandlerDispatch : public IDispatch
-	{
-	public:
-		virtual HRESULT __stdcall ShowContextMenu( 
-			 DWORD dwID,
-			 DWORD x,
-			 DWORD y,
-			 IUnknown *pcmdtReserved,
-			 IDispatch *pdispReserved,
-			 HRESULT *dwRetVal) = 0;
-
-		virtual HRESULT __stdcall GetHostInfo( 
-			 DWORD *pdwFlags,
-			 DWORD *pdwDoubleClick) = 0;
-
-		virtual HRESULT __stdcall ShowUI( 
-			 DWORD dwID,
-			 IUnknown *pActiveObject,
-			 IUnknown *pCommandTarget,
-			 IUnknown *pFrame,
-			 IUnknown *pDoc,
-			 HRESULT *dwRetVal) = 0;
-
-		virtual HRESULT __stdcall HideUI( void) = 0;
-
-		virtual HRESULT __stdcall UpdateUI( void) = 0;
-
-		virtual HRESULT __stdcall EnableModeless( 
-			 VARIANT_BOOL fEnable) = 0;
-
-		virtual HRESULT __stdcall OnDocWindowActivate( 
-			 VARIANT_BOOL fActivate) = 0;
-
-		virtual HRESULT __stdcall OnFrameWindowActivate( 
-			 VARIANT_BOOL fActivate) = 0;
-
-		virtual HRESULT __stdcall ResizeBorder( 
-			 long left,
-			 long top,
-			 long right,
-			 long bottom,
-			 IUnknown *pUIWindow,
-			 VARIANT_BOOL fFrameWindow) = 0;
-
-		virtual HRESULT __stdcall TranslateAcceleratorW( 
-			 DWORD_PTR hWnd,
-			 DWORD nMessage,
-			 DWORD_PTR wParam,
-			 DWORD_PTR lParam,
-			 BSTR bstrGuidCmdGroup,
-			 DWORD nCmdID,
-			 HRESULT *dwRetVal) = 0;
-
-		virtual HRESULT __stdcall GetOptionKeyPath( 
-			 BSTR *pbstrKey,
-			 DWORD dw) = 0;
-
-		virtual HRESULT __stdcall GetDropTarget( 
-			 IUnknown *pDropTarget,
-			 IUnknown **ppDropTarget) = 0;
-
-		virtual HRESULT __stdcall GetExternal( 
-			 IDispatch **ppDispatch) = 0;
-
-		virtual HRESULT __stdcall TranslateUrl( 
-			 DWORD dwTranslate,
-			 BSTR bstrURLIn,
-			 BSTR *pbstrURLOut) = 0;
-
-		virtual HRESULT __stdcall FilterDataObject( 
-			 IUnknown *pDO,
-			 IUnknown **ppDORet) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_ShowContextMenu_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD dwID,
-	 DWORD x,
-	 DWORD y,
-	 IUnknown *pcmdtReserved,
-	 IDispatch *pdispReserved,
-	 HRESULT *dwRetVal);
-
-
-void __stdcall IDocHostUIHandlerDispatch_ShowContextMenu_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_GetHostInfo_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD *pdwFlags,
-	 DWORD *pdwDoubleClick);
-
-
-void __stdcall IDocHostUIHandlerDispatch_GetHostInfo_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_ShowUI_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD dwID,
-	 IUnknown *pActiveObject,
-	 IUnknown *pCommandTarget,
-	 IUnknown *pFrame,
-	 IUnknown *pDoc,
-	 HRESULT *dwRetVal);
-
-
-void __stdcall IDocHostUIHandlerDispatch_ShowUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_HideUI_Proxy( 
-	IDocHostUIHandlerDispatch * This);
-
-
-void __stdcall IDocHostUIHandlerDispatch_HideUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_UpdateUI_Proxy( 
-	IDocHostUIHandlerDispatch * This);
-
-
-void __stdcall IDocHostUIHandlerDispatch_UpdateUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_EnableModeless_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 VARIANT_BOOL fEnable);
-
-
-void __stdcall IDocHostUIHandlerDispatch_EnableModeless_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_OnDocWindowActivate_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 VARIANT_BOOL fActivate);
-
-
-void __stdcall IDocHostUIHandlerDispatch_OnDocWindowActivate_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_OnFrameWindowActivate_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 VARIANT_BOOL fActivate);
-
-
-void __stdcall IDocHostUIHandlerDispatch_OnFrameWindowActivate_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_ResizeBorder_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 long left,
-	 long top,
-	 long right,
-	 long bottom,
-	 IUnknown *pUIWindow,
-	 VARIANT_BOOL fFrameWindow);
-
-
-void __stdcall IDocHostUIHandlerDispatch_ResizeBorder_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_TranslateAccelerator_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD_PTR hWnd,
-	 DWORD nMessage,
-	 DWORD_PTR wParam,
-	 DWORD_PTR lParam,
-	 BSTR bstrGuidCmdGroup,
-	 DWORD nCmdID,
-	 HRESULT *dwRetVal);
-
-
-void __stdcall IDocHostUIHandlerDispatch_TranslateAccelerator_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_GetOptionKeyPath_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 BSTR *pbstrKey,
-	 DWORD dw);
-
-
-void __stdcall IDocHostUIHandlerDispatch_GetOptionKeyPath_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_GetDropTarget_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 IUnknown *pDropTarget,
-	 IUnknown **ppDropTarget);
-
-
-void __stdcall IDocHostUIHandlerDispatch_GetDropTarget_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_GetExternal_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 IDispatch **ppDispatch);
-
-
-void __stdcall IDocHostUIHandlerDispatch_GetExternal_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_TranslateUrl_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD dwTranslate,
-	 BSTR bstrURLIn,
-	 BSTR *pbstrURLOut);
-
-
-void __stdcall IDocHostUIHandlerDispatch_TranslateUrl_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_FilterDataObject_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 IUnknown *pDO,
-	 IUnknown **ppDORet);
-
-
-void __stdcall IDocHostUIHandlerDispatch_FilterDataObject_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAxWinHostWindow;
-
-
-
-	struct __declspec(uuid("B6EA2050-048A-11d1-82B9-00C04FB9942E")) __declspec(novtable)
-	IAxWinHostWindow : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall CreateControl( 
-			 LPCOLESTR lpTricsData,
-			 HWND hWnd,
-			 IStream *pStream) = 0;
-
-		virtual HRESULT __stdcall CreateControlEx( 
-			 LPCOLESTR lpTricsData,
-			 HWND hWnd,
-			 IStream *pStream,
-			 IUnknown **ppUnk,
-			 const IID & riidAdvise,
-			 IUnknown *punkAdvise) = 0;
-
-		virtual HRESULT __stdcall AttachControl( 
-			 IUnknown *pUnkControl,
-			 HWND hWnd) = 0;
-
-		virtual HRESULT __stdcall QueryControl( 
-			 const IID & riid,
-			 void **ppvObject) = 0;
-
-		virtual HRESULT __stdcall SetExternalDispatch( 
-			 IDispatch *pDisp) = 0;
-
-		virtual HRESULT __stdcall SetExternalUIHandler( 
-			 IDocHostUIHandlerDispatch *pDisp) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAxWinHostWindow_CreateControl_Proxy( 
-	IAxWinHostWindow * This,
-	 LPCOLESTR lpTricsData,
-	 HWND hWnd,
-	 IStream *pStream);
-
-
-void __stdcall IAxWinHostWindow_CreateControl_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_CreateControlEx_Proxy( 
-	IAxWinHostWindow * This,
-	 LPCOLESTR lpTricsData,
-	 HWND hWnd,
-	 IStream *pStream,
-	 IUnknown **ppUnk,
-	 const IID & riidAdvise,
-	 IUnknown *punkAdvise);
-
-
-void __stdcall IAxWinHostWindow_CreateControlEx_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_AttachControl_Proxy( 
-	IAxWinHostWindow * This,
-	 IUnknown *pUnkControl,
-	 HWND hWnd);
-
-
-void __stdcall IAxWinHostWindow_AttachControl_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_QueryControl_Proxy( 
-	IAxWinHostWindow * This,
-	 const IID & riid,
-	 void **ppvObject);
-
-
-void __stdcall IAxWinHostWindow_QueryControl_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_SetExternalDispatch_Proxy( 
-	IAxWinHostWindow * This,
-	 IDispatch *pDisp);
-
-
-void __stdcall IAxWinHostWindow_SetExternalDispatch_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_SetExternalUIHandler_Proxy( 
-	IAxWinHostWindow * This,
-	 IDocHostUIHandlerDispatch *pDisp);
-
-
-void __stdcall IAxWinHostWindow_SetExternalUIHandler_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAxWinHostWindowLic;
-
-
-
-	struct __declspec(uuid("3935BDA8-4ED9-495c-8650-E01FC1E38A4B")) __declspec(novtable)
-	IAxWinHostWindowLic : public IAxWinHostWindow
-	{
-	public:
-		virtual HRESULT __stdcall CreateControlLic( 
-			 LPCOLESTR lpTricsData,
-			 HWND hWnd,
-			 IStream *pStream,
-			 BSTR bstrLic) = 0;
-
-		virtual HRESULT __stdcall CreateControlLicEx( 
-			 LPCOLESTR lpTricsData,
-			 HWND hWnd,
-			 IStream *pStream,
-			 IUnknown **ppUnk,
-			 const IID & riidAdvise,
-			 IUnknown *punkAdvise,
-			 BSTR bstrLic) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAxWinHostWindowLic_CreateControlLic_Proxy( 
-	IAxWinHostWindowLic * This,
-	 LPCOLESTR lpTricsData,
-	 HWND hWnd,
-	 IStream *pStream,
-	 BSTR bstrLic);
-
-
-void __stdcall IAxWinHostWindowLic_CreateControlLic_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindowLic_CreateControlLicEx_Proxy( 
-	IAxWinHostWindowLic * This,
-	 LPCOLESTR lpTricsData,
-	 HWND hWnd,
-	 IStream *pStream,
-	 IUnknown **ppUnk,
-	 const IID & riidAdvise,
-	 IUnknown *punkAdvise,
-	 BSTR bstrLic);
-
-
-void __stdcall IAxWinHostWindowLic_CreateControlLicEx_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAxWinAmbientDispatch;
-
-
-
-	struct __declspec(uuid("B6EA2051-048A-11d1-82B9-00C04FB9942E")) __declspec(novtable)
-	IAxWinAmbientDispatch : public IDispatch
-	{
-	public:
-		virtual  HRESULT __stdcall put_AllowWindowlessActivation( 
-			 VARIANT_BOOL bCanWindowlessActivate) = 0;
-
-		virtual  HRESULT __stdcall get_AllowWindowlessActivation( 
-			 VARIANT_BOOL *pbCanWindowlessActivate) = 0;
-
-		virtual  HRESULT __stdcall put_BackColor( 
-			 OLE_COLOR clrBackground) = 0;
-
-		virtual  HRESULT __stdcall get_BackColor( 
-			 OLE_COLOR *pclrBackground) = 0;
-
-		virtual  HRESULT __stdcall put_ForeColor( 
-			 OLE_COLOR clrForeground) = 0;
-
-		virtual  HRESULT __stdcall get_ForeColor( 
-			 OLE_COLOR *pclrForeground) = 0;
-
-		virtual  HRESULT __stdcall put_LocaleID( 
-			 LCID lcidLocaleID) = 0;
-
-		virtual  HRESULT __stdcall get_LocaleID( 
-			 LCID *plcidLocaleID) = 0;
-
-		virtual  HRESULT __stdcall put_UserMode( 
-			 VARIANT_BOOL bUserMode) = 0;
-
-		virtual  HRESULT __stdcall get_UserMode( 
-			 VARIANT_BOOL *pbUserMode) = 0;
-
-		virtual  HRESULT __stdcall put_DisplayAsDefault( 
-			 VARIANT_BOOL bDisplayAsDefault) = 0;
-
-		virtual  HRESULT __stdcall get_DisplayAsDefault( 
-			 VARIANT_BOOL *pbDisplayAsDefault) = 0;
-
-		virtual  HRESULT __stdcall put_Font( 
-			 IFontDisp *pFont) = 0;
-
-		virtual  HRESULT __stdcall get_Font( 
-			 IFontDisp **pFont) = 0;
-
-		virtual  HRESULT __stdcall put_MessageReflect( 
-			 VARIANT_BOOL bMsgReflect) = 0;
-
-		virtual  HRESULT __stdcall get_MessageReflect( 
-			 VARIANT_BOOL *pbMsgReflect) = 0;
-
-		virtual  HRESULT __stdcall get_ShowGrabHandles( 
-			 VARIANT_BOOL *pbShowGrabHandles) = 0;
-
-		virtual  HRESULT __stdcall get_ShowHatching( 
-			 VARIANT_BOOL *pbShowHatching) = 0;
-
-		virtual  HRESULT __stdcall put_DocHostFlags( 
-			 DWORD dwDocHostFlags) = 0;
-
-		virtual  HRESULT __stdcall get_DocHostFlags( 
-			 DWORD *pdwDocHostFlags) = 0;
-
-		virtual  HRESULT __stdcall put_DocHostDoubleClickFlags( 
-			 DWORD dwDocHostDoubleClickFlags) = 0;
-
-		virtual  HRESULT __stdcall get_DocHostDoubleClickFlags( 
-			 DWORD *pdwDocHostDoubleClickFlags) = 0;
-
-		virtual  HRESULT __stdcall put_AllowContextMenu( 
-			 VARIANT_BOOL bAllowContextMenu) = 0;
-
-		virtual  HRESULT __stdcall get_AllowContextMenu( 
-			 VARIANT_BOOL *pbAllowContextMenu) = 0;
-
-		virtual  HRESULT __stdcall put_AllowShowUI( 
-			 VARIANT_BOOL bAllowShowUI) = 0;
-
-		virtual  HRESULT __stdcall get_AllowShowUI( 
-			 VARIANT_BOOL *pbAllowShowUI) = 0;
-
-		virtual  HRESULT __stdcall put_OptionKeyPath( 
-			 BSTR bstrOptionKeyPath) = 0;
-
-		virtual  HRESULT __stdcall get_OptionKeyPath( 
-			 BSTR *pbstrOptionKeyPath) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_AllowWindowlessActivation_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bCanWindowlessActivate);
-
-
-void __stdcall IAxWinAmbientDispatch_put_AllowWindowlessActivation_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_AllowWindowlessActivation_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbCanWindowlessActivate);
-
-
-void __stdcall IAxWinAmbientDispatch_get_AllowWindowlessActivation_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_BackColor_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 OLE_COLOR clrBackground);
-
-
-void __stdcall IAxWinAmbientDispatch_put_BackColor_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_BackColor_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 OLE_COLOR *pclrBackground);
-
-
-void __stdcall IAxWinAmbientDispatch_get_BackColor_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_ForeColor_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 OLE_COLOR clrForeground);
-
-
-void __stdcall IAxWinAmbientDispatch_put_ForeColor_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_ForeColor_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 OLE_COLOR *pclrForeground);
-
-
-void __stdcall IAxWinAmbientDispatch_get_ForeColor_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_LocaleID_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 LCID lcidLocaleID);
-
-
-void __stdcall IAxWinAmbientDispatch_put_LocaleID_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_LocaleID_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 LCID *plcidLocaleID);
-
-
-void __stdcall IAxWinAmbientDispatch_get_LocaleID_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_UserMode_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bUserMode);
-
-
-void __stdcall IAxWinAmbientDispatch_put_UserMode_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_UserMode_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbUserMode);
-
-
-void __stdcall IAxWinAmbientDispatch_get_UserMode_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_DisplayAsDefault_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bDisplayAsDefault);
-
-
-void __stdcall IAxWinAmbientDispatch_put_DisplayAsDefault_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_DisplayAsDefault_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbDisplayAsDefault);
-
-
-void __stdcall IAxWinAmbientDispatch_get_DisplayAsDefault_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_Font_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 IFontDisp *pFont);
-
-
-void __stdcall IAxWinAmbientDispatch_put_Font_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_Font_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 IFontDisp **pFont);
-
-
-void __stdcall IAxWinAmbientDispatch_get_Font_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_MessageReflect_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bMsgReflect);
-
-
-void __stdcall IAxWinAmbientDispatch_put_MessageReflect_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_MessageReflect_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbMsgReflect);
-
-
-void __stdcall IAxWinAmbientDispatch_get_MessageReflect_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_ShowGrabHandles_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbShowGrabHandles);
-
-
-void __stdcall IAxWinAmbientDispatch_get_ShowGrabHandles_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_ShowHatching_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbShowHatching);
-
-
-void __stdcall IAxWinAmbientDispatch_get_ShowHatching_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_DocHostFlags_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 DWORD dwDocHostFlags);
-
-
-void __stdcall IAxWinAmbientDispatch_put_DocHostFlags_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_DocHostFlags_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 DWORD *pdwDocHostFlags);
-
-
-void __stdcall IAxWinAmbientDispatch_get_DocHostFlags_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_DocHostDoubleClickFlags_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 DWORD dwDocHostDoubleClickFlags);
-
-
-void __stdcall IAxWinAmbientDispatch_put_DocHostDoubleClickFlags_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_DocHostDoubleClickFlags_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 DWORD *pdwDocHostDoubleClickFlags);
-
-
-void __stdcall IAxWinAmbientDispatch_get_DocHostDoubleClickFlags_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_AllowContextMenu_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bAllowContextMenu);
-
-
-void __stdcall IAxWinAmbientDispatch_put_AllowContextMenu_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_AllowContextMenu_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbAllowContextMenu);
-
-
-void __stdcall IAxWinAmbientDispatch_get_AllowContextMenu_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_AllowShowUI_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bAllowShowUI);
-
-
-void __stdcall IAxWinAmbientDispatch_put_AllowShowUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_AllowShowUI_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbAllowShowUI);
-
-
-void __stdcall IAxWinAmbientDispatch_get_AllowShowUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_OptionKeyPath_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 BSTR bstrOptionKeyPath);
-
-
-void __stdcall IAxWinAmbientDispatch_put_OptionKeyPath_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_OptionKeyPath_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 BSTR *pbstrOptionKeyPath);
-
-
-void __stdcall IAxWinAmbientDispatch_get_OptionKeyPath_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAxWinAmbientDispatchEx;
-
-
-
-	struct __declspec(uuid("B2D0778B-AC99-4c58-A5C8-E7724E5316B5")) __declspec(novtable)
-	IAxWinAmbientDispatchEx : public IAxWinAmbientDispatch
-	{
-	public:
-		virtual  HRESULT __stdcall SetAmbientDispatch( 
-			 IDispatch *pDispatch) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAxWinAmbientDispatchEx_SetAmbientDispatch_Proxy( 
-	IAxWinAmbientDispatchEx * This,
-	 IDispatch *pDispatch);
-
-
-void __stdcall IAxWinAmbientDispatchEx_SetAmbientDispatch_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IInternalConnection;
-
-
-
-	struct __declspec(uuid("72AD0770-6A9F-11d1-BCEC-0060088F444E")) __declspec(novtable)
-	IInternalConnection : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall AddConnection( void) = 0;
-
-		virtual HRESULT __stdcall ReleaseConnection( void) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternalConnection_AddConnection_Proxy( 
-	IInternalConnection * This);
-
-
-void __stdcall IInternalConnection_AddConnection_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternalConnection_ReleaseConnection_Proxy( 
-	IInternalConnection * This);
-
-
-void __stdcall IInternalConnection_ReleaseConnection_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) INT_PTR __stdcall AtlAxDialogBoxW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
-extern "C" __declspec(dllimport) INT_PTR __stdcall AtlAxDialogBoxA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HWND __stdcall AtlAxCreateDialogW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
-extern "C" __declspec(dllimport) HWND __stdcall AtlAxCreateDialogA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControl(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, 
-		IUnknown** ppUnkContainer, IUnknown** ppUnkControl, 
-		const IID & iidSink=GUID_NULL, IUnknown* punkSink=0);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlLic(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer, BSTR bstrLic = 0);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlLicEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, 
-		IUnknown** ppUnkContainer, IUnknown** ppUnkControl, 
-		const IID & iidSink=GUID_NULL, IUnknown* punkSink=0, BSTR bstrLic = 0);
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxAttachControl(IUnknown* pControl, HWND hWnd, IUnknown** ppUnkContainer);
-extern "C" __declspec(dllimport) BOOL __stdcall AtlAxWinInit();
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxGetHost(HWND h, IUnknown** pp);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxGetControl(HWND h, IUnknown** pp);
-
-}; 
-#pragma pack(pop)
-
-extern RPC_IF_HANDLE __MIDL_itf_atliface_0257_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_atliface_0257_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccessibleProxy;
-
-
-
-	struct __declspec(uuid("7A7D9DCF-B7A1-4019-9031-258268846980")) __declspec(novtable)
-	IAccessibleProxy : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall SetServer( 
-			 IAccessible *pAccessible,
-			 IAccessibleServer *pServer) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccessibleProxy_SetServer_Proxy( 
-	IAccessibleProxy * This,
-	 IAccessible *pAccessible,
-	 IAccessibleServer *pServer);
-
-
-void __stdcall IAccessibleProxy_SetServer_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccessibleServer;
-
-
-
-	struct __declspec(uuid("52C8FB5E-D779-4e77-AE9F-F611FA7E9D7A")) __declspec(novtable)
-	IAccessibleServer : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall SetProxy( 
-			 IAccessibleProxy *pUnknown) = 0;
-
-		virtual HRESULT __stdcall GetHWND( 
-			 HWND *phWnd) = 0;
-
-		virtual HRESULT __stdcall GetEnumVariant( 
-			 IEnumVARIANT **ppEnumVariant) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccessibleServer_SetProxy_Proxy( 
-	IAccessibleServer * This,
-	 IAccessibleProxy *pUnknown);
-
-
-void __stdcall IAccessibleServer_SetProxy_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccessibleServer_GetHWND_Proxy( 
-	IAccessibleServer * This,
-	 HWND *phWnd);
-
-
-void __stdcall IAccessibleServer_GetHWND_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccessibleServer_GetEnumVariant_Proxy( 
-	IAccessibleServer * This,
-	 IEnumVARIANT **ppEnumVariant);
-
-
-void __stdcall IAccessibleServer_GetEnumVariant_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) uintptr_t __cdecl _beginthread (     void (__cdecl * _StartAddress) (void *),
-             unsigned _StackSize,        void * _ArgList);
-__declspec(dllimport) void __cdecl _endthread(void);
-__declspec(dllimport) uintptr_t __cdecl _beginthreadex(       void * _Security,      unsigned _StackSize,
-             unsigned (__stdcall * _StartAddress) (void *),        void * _ArgList, 
-             unsigned _InitFlag,        unsigned * _ThrdAddr);
-__declspec(dllimport) void __cdecl _endthreadex(     unsigned _Retval);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) void __cdecl _cexit(void);
-__declspec(dllimport) void __cdecl _c_exit(void);
-__declspec(dllimport) int __cdecl _getpid(void);
-
-__declspec(dllimport) intptr_t __cdecl _cwait(       int * _TermStat,      intptr_t _ProcHandle,      int _Action);
-__declspec(dllimport) intptr_t __cdecl _execl(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _execle(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _execlp(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _execlpe(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _execv(       const char * _Filename,        const char * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _execve(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _execvp(       const char * _Filename,        const char * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _execvpe(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _spawnl(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _spawnle(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _spawnlp(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _spawnlpe(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _spawnv(     int _Mode,        const char * _Filename,        const char * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _spawnve(     int _Mode,        const char * _Filename,        const char * const * _ArgList,
-                 const char * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _spawnvp(     int _Mode,        const char * _Filename,        const char * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _spawnvpe(     int _Mode,        const char * _Filename,        const char * const * _ArgList,
-                 const char * const * _Env);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void __cdecl __security_init_cookie(void);
-
-void __fastcall __security_check_cookie(     uintptr_t _StackCookie);
-__declspec(noreturn) void __cdecl __report_gsfailure(void);
-
-
-
-
-
-extern uintptr_t __security_cookie;
-
-
-
-
-
-
-
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "LoadLibrary" " instead. See online help for details.")) intptr_t __cdecl _loaddll(       char * _Filename);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "FreeLibrary" " instead. See online help for details.")) int __cdecl _unloaddll(     intptr_t _Handle);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetProcAddress" " instead. See online help for details.")) int (__cdecl * __cdecl _getdllprocaddr(     intptr_t _Handle,          char * _ProcedureName,      intptr_t _Ordinal))(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_cwait" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl cwait(       int * _TermStat,      intptr_t _ProcHandle,      int _Action);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execl" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execl(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execle" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execle(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execlp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execlp(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execlpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execlpe(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execv" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execv(       const char * _Filename,        const char * const * _ArgList);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execve" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execve(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execvp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execvp(       const char * _Filename,        const char * const * _ArgList);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execvpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execvpe(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnl" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnl(     int,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnle" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnle(     int,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnlp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnlp(     int,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnlpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnlpe(     int,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnv" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnv(     int,        const char * _Filename,        const char * const * _ArgList);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnve" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnve(     int,        const char * _Filename,        const char * const * _ArgList,
-                 const char * const * _Env);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnvp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnvp(     int,        const char * _Filename,        const char * const * _ArgList);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnvpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnvpe(     int,        const char * _Filename,        const char * const * _ArgList,
-                 const char * const * _Env);
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_getpid" ". See online help for details.")) __declspec(dllimport) int __cdecl getpid(void);
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _SHITEMID
-    {
-    USHORT cb;
-    BYTE abID[ 1 ];
-    } 	SHITEMID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-typedef SHITEMID  *LPSHITEMID;
-
-typedef const SHITEMID  *LPCSHITEMID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _ITEMIDLIST
-    {
-    SHITEMID mkid;
-    } 	ITEMIDLIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-typedef  BYTE_BLOB *wirePIDL;
-
-typedef  ITEMIDLIST  *LPITEMIDLIST;
-
-typedef  const ITEMIDLIST  *LPCITEMIDLIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  
-enum tagSTRRET_TYPE
-    {	STRRET_WSTR	= 0,
-	STRRET_OFFSET	= 0x1,
-	STRRET_CSTR	= 0x2
-    } 	STRRET_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-typedef struct _STRRET
-    {
-    UINT uType;
-     union 
-        {
-         LPWSTR pOleStr;
-         UINT uOffset;
-         char cStr[ 260 ];
-        } 	;
-    } 	STRRET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-typedef STRRET *LPSTRRET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _SHELLDETAILS
-    {
-    int fmt;
-    int cxChar;
-    STRRET str;
-    } 	SHELLDETAILS;
-
-typedef struct _SHELLDETAILS *LPSHELLDETAILS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_shtypes_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_shtypes_0000_v0_0_s_ifspec;
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrChrA(LPCSTR lpStart, WORD wMatch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrChrW(LPCWSTR lpStart, WCHAR wMatch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrChrIA(LPCSTR lpStart, WORD wMatch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrChrIW(LPCWSTR lpStart, WCHAR wMatch);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpNA(LPCSTR lpStr1, LPCSTR lpStr2, int nChar);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpNW(LPCWSTR lpStr1, LPCWSTR lpStr2, int nChar);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpNIA(LPCSTR lpStr1, LPCSTR lpStr2, int nChar);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpNIW(LPCWSTR lpStr1, LPCWSTR lpStr2, int nChar);
-extern "C" __declspec(dllimport) int __stdcall      StrCSpnA(LPCSTR lpStr, LPCSTR lpSet);
-extern "C" __declspec(dllimport) int __stdcall      StrCSpnW(LPCWSTR lpStr, LPCWSTR lpSet);
-extern "C" __declspec(dllimport) int __stdcall      StrCSpnIA(LPCSTR lpStr, LPCSTR lpSet);
-extern "C" __declspec(dllimport) int __stdcall      StrCSpnIW(LPCWSTR lpStr, LPCWSTR lpSet);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrDupA(LPCSTR lpSrch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrDupW(LPCWSTR lpSrch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatByteSizeA(DWORD dw, LPSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatByteSize64A(LONGLONG qdw, LPSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrFormatByteSizeW(LONGLONG qdw, LPWSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrFormatKBSizeW(LONGLONG qdw, LPWSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatKBSizeA(LONGLONG qdw, LPSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) int __stdcall      StrFromTimeIntervalA(LPSTR pszOut, UINT cchMax, DWORD dwTimeMS, int digits);
-extern "C" __declspec(dllimport) int __stdcall      StrFromTimeIntervalW(LPWSTR pszOut, UINT cchMax, DWORD dwTimeMS, int digits);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrIsIntlEqualA(BOOL fCaseSens, LPCSTR lpString1, LPCSTR lpString2, int nChar);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrIsIntlEqualW(BOOL fCaseSens, LPCWSTR lpString1, LPCWSTR lpString2, int nChar);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrNCatA(LPSTR psz1, LPCSTR psz2, int cchMax);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrNCatW(LPWSTR psz1, LPCWSTR psz2, int cchMax);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrPBrkA(LPCSTR psz, LPCSTR pszSet);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrPBrkW(LPCWSTR psz, LPCWSTR pszSet);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrRChrA(LPCSTR lpStart, LPCSTR lpEnd, WORD wMatch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRChrW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrRChrIA(LPCSTR lpStart, LPCSTR lpEnd, WORD wMatch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRChrIW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrRStrIA(LPCSTR lpSource, LPCSTR lpLast, LPCSTR lpSrch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRStrIW(LPCWSTR lpSource, LPCWSTR lpLast, LPCWSTR lpSrch);
-extern "C" __declspec(dllimport) int __stdcall      StrSpnA(LPCSTR psz, LPCSTR pszSet);
-extern "C" __declspec(dllimport) int __stdcall      StrSpnW(LPCWSTR psz, LPCWSTR pszSet);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrStrA(LPCSTR lpFirst, LPCSTR lpSrch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrStrW(LPCWSTR lpFirst, LPCWSTR lpSrch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrStrIA(LPCSTR lpFirst, LPCSTR lpSrch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch);
-extern "C" __declspec(dllimport) int __stdcall      StrToIntA(LPCSTR lpSrc);
-extern "C" __declspec(dllimport) int __stdcall      StrToIntW(LPCWSTR lpSrc);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrToIntExA(LPCSTR pszString, DWORD dwFlags, int * piRet);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrToIntExW(LPCWSTR pszString, DWORD dwFlags, int * piRet);
-
-extern "C" __declspec(dllimport) BOOL __stdcall     StrToInt64ExA(LPCSTR pszString, DWORD dwFlags, LONGLONG * pllRet);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrToInt64ExW(LPCWSTR pszString, DWORD dwFlags, LONGLONG * pllRet);
-
-extern "C" __declspec(dllimport) BOOL __stdcall     StrTrimA(LPSTR psz, LPCSTR pszTrimChars);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrTrimW(LPWSTR psz, LPCWSTR pszTrimChars);
-
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCatW(LPWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpW(LPCWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpIW(LPCWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCpyW(LPWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCpyNW(LPWSTR psz1, LPCWSTR psz2, int cchMax);
-
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCatBuffW(LPWSTR pszDest, LPCWSTR pszSrc, int cchDestBuffSize);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrCatBuffA(LPSTR pszDest, LPCSTR pszSrc, int cchDestBuffSize);
-
-extern "C" __declspec(dllimport) BOOL __stdcall     ChrCmpIA(WORD w1, WORD w2);
-extern "C" __declspec(dllimport) BOOL __stdcall     ChrCmpIW(WCHAR w1, WCHAR w2);
-
-extern "C" __declspec(dllimport) int __stdcall      wvnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, va_list arglist);
-extern "C" __declspec(dllimport) int __stdcall      wvnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, va_list arglist);
-extern "C" __declspec(dllimport) int __cdecl     wnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, ...);
-extern "C" __declspec(dllimport) int __cdecl     wnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, ...);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToStrA(STRRET *pstr, LPCITEMIDLIST pidl, LPSTR *ppsz);
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToStrW(STRRET *pstr, LPCITEMIDLIST pidl, LPWSTR *ppsz);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBufA(STRRET *pstr, LPCITEMIDLIST pidl, LPSTR pszBuf, UINT cchBuf);
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBufW(STRRET *pstr, LPCITEMIDLIST pidl, LPWSTR pszBuf, UINT cchBuf);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBSTR(STRRET *pstr, LPCITEMIDLIST pidl, BSTR *pbstr);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHStrDupA(LPCSTR psz, WCHAR **ppwsz);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHStrDupW(LPCWSTR psz, WCHAR **ppwsz);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) int __stdcall StrCmpLogicalW(LPCWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) DWORD __stdcall StrCatChainW(LPWSTR pszDst, DWORD cchDst, DWORD ichAt, LPCWSTR pszSrc);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHLoadIndirectString(LPCWSTR pszSource, LPWSTR pszOutBuf, UINT cchOutBuf, void **ppvReserved);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     IntlStrEqWorkerA(BOOL fCaseSens, LPCSTR lpString1, LPCSTR lpString2, int nChar);
-extern "C" __declspec(dllimport) BOOL __stdcall     IntlStrEqWorkerW(BOOL fCaseSens, LPCWSTR lpString1, LPCWSTR lpString2, int nChar);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathAddBackslashA(LPSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathAddBackslashW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathAddExtensionA(LPSTR pszPath, LPCSTR pszExt);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathAddExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathAppendA(LPSTR pszPath, LPCSTR pMore);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathAppendW(LPWSTR pszPath, LPCWSTR pMore);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathBuildRootA(LPSTR pszRoot, int iDrive);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathBuildRootW(LPWSTR pszRoot, int iDrive);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCanonicalizeA(LPSTR pszBuf, LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCanonicalizeW(LPWSTR pszBuf, LPCWSTR pszPath);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathCombineA(LPSTR pszDest, LPCSTR pszDir, LPCSTR pszFile);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathCombineW(LPWSTR pszDest, LPCWSTR pszDir, LPCWSTR pszFile);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathA(HDC hDC, LPSTR pszPath, UINT dx);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathW(HDC hDC, LPWSTR pszPath, UINT dx);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathExA(LPSTR pszOut, LPCSTR pszSrc, UINT cchMax, DWORD dwFlags);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathExW(LPWSTR pszOut, LPCWSTR pszSrc, UINT cchMax, DWORD dwFlags);
-extern "C" __declspec(dllimport) int __stdcall      PathCommonPrefixA(LPCSTR pszFile1, LPCSTR pszFile2, LPSTR achPath);
-extern "C" __declspec(dllimport) int __stdcall      PathCommonPrefixW(LPCWSTR pszFile1, LPCWSTR pszFile2, LPWSTR achPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathFileExistsA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathFileExistsW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindExtensionA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindExtensionW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindFileNameA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindFileNameW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindNextComponentA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindNextComponentW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathFindOnPathA(LPSTR pszPath, LPCSTR * ppszOtherDirs);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathFindOnPathW(LPWSTR pszPath, LPCWSTR * ppszOtherDirs);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathGetArgsA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathGetArgsW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPCSTR __stdcall PathFindSuffixArrayA(LPCSTR pszPath, const LPCSTR *apszSuffix, int iArraySize);
-extern "C" __declspec(dllimport) LPCWSTR __stdcall PathFindSuffixArrayW(LPCWSTR pszPath, const LPCWSTR *apszSuffix, int iArraySize);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsLFNFileSpecA(LPCSTR lpName);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsLFNFileSpecW(LPCWSTR lpName);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) UINT __stdcall     PathGetCharTypeA(UCHAR ch);
-extern "C" __declspec(dllimport) UINT __stdcall     PathGetCharTypeW(WCHAR ch);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) int __stdcall      PathGetDriveNumberA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) int __stdcall      PathGetDriveNumberW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryEmptyA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryEmptyW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsFileSpecA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsFileSpecW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsPrefixA(LPCSTR pszPrefix, LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsPrefixW(LPCWSTR pszPrefix, LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRelativeA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRelativeW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRootA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRootW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSameRootA(LPCSTR pszPath1, LPCSTR pszPath2);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSameRootW(LPCWSTR pszPath1, LPCWSTR pszPath2);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsNetworkPathA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsNetworkPathW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerShareA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerShareW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsContentTypeA(LPCSTR pszPath, LPCSTR pszContentType);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsContentTypeW(LPCWSTR pszPath, LPCWSTR pszContentType);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsURLA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsURLW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMakePrettyA(LPSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMakePrettyW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMatchSpecA(LPCSTR pszFile, LPCSTR pszSpec);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMatchSpecW(LPCWSTR pszFile, LPCWSTR pszSpec);
-extern "C" __declspec(dllimport) int __stdcall      PathParseIconLocationA(LPSTR pszIconFile);
-extern "C" __declspec(dllimport) int __stdcall      PathParseIconLocationW(LPWSTR pszIconFile);
-extern "C" __declspec(dllimport) void __stdcall     PathQuoteSpacesA(LPSTR lpsz);
-extern "C" __declspec(dllimport) void __stdcall     PathQuoteSpacesW(LPWSTR lpsz);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRelativePathToA(LPSTR pszPath, LPCSTR pszFrom, DWORD dwAttrFrom, LPCSTR pszTo, DWORD dwAttrTo);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRelativePathToW(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveArgsA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveArgsW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathRemoveBackslashA(LPSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathRemoveBackslashW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveBlanksA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveBlanksW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveExtensionA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveExtensionW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRemoveFileSpecA(LPSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRemoveFileSpecW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRenameExtensionA(LPSTR pszPath, LPCSTR pszExt);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRenameExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathSearchAndQualifyA(LPCSTR pszPath, LPSTR pszBuf, UINT cchBuf);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathSearchAndQualifyW(LPCWSTR pszPath, LPWSTR pszBuf, UINT cchBuf);
-extern "C" __declspec(dllimport) void __stdcall     PathSetDlgItemPathA(HWND hDlg, int id, LPCSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathSetDlgItemPathW(HWND hDlg, int id, LPCWSTR pszPath);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathSkipRootA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathSkipRootW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     PathStripPathA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathStripPathW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathStripToRootA(LPSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathStripToRootW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     PathUnquoteSpacesA(LPSTR lpsz);
-extern "C" __declspec(dllimport) void __stdcall     PathUnquoteSpacesW(LPWSTR lpsz);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMakeSystemFolderA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMakeSystemFolderW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathUnmakeSystemFolderA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathUnmakeSystemFolderW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSystemFolderA(LPCSTR pszPath, DWORD dwAttrb);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSystemFolderW(LPCWSTR pszPath, DWORD dwAttrb);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     PathUndecorateA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathUndecorateW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathUnExpandEnvStringsA(LPCSTR pszPath, LPSTR pszBuf, UINT cchBuf);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathUnExpandEnvStringsW(LPCWSTR pszPath, LPWSTR pszBuf, UINT cchBuf);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum {
-    URL_SCHEME_INVALID     = -1,
-    URL_SCHEME_UNKNOWN     =  0,
-    URL_SCHEME_FTP,
-    URL_SCHEME_HTTP,
-    URL_SCHEME_GOPHER,
-    URL_SCHEME_MAILTO,
-    URL_SCHEME_NEWS,
-    URL_SCHEME_NNTP,
-    URL_SCHEME_TELNET,
-    URL_SCHEME_WAIS,
-    URL_SCHEME_FILE,
-    URL_SCHEME_MK,
-    URL_SCHEME_HTTPS,
-    URL_SCHEME_SHELL,
-    URL_SCHEME_SNEWS,
-    URL_SCHEME_LOCAL,
-    URL_SCHEME_JAVASCRIPT,
-    URL_SCHEME_VBSCRIPT,
-    URL_SCHEME_ABOUT,
-    URL_SCHEME_RES,
-    URL_SCHEME_MSSHELLROOTED,
-    URL_SCHEME_MSSHELLIDLIST,
-    URL_SCHEME_MSHELP,
-    URL_SCHEME_MAXVALUE
-} URL_SCHEME;
-
-typedef enum {
-    URL_PART_NONE       = 0,
-    URL_PART_SCHEME     = 1,
-    URL_PART_HOSTNAME,
-    URL_PART_USERNAME,
-    URL_PART_PASSWORD,
-    URL_PART_PORT,
-    URL_PART_QUERY,
-} URL_PART;
-
-typedef enum {
-    URLIS_URL,
-    URLIS_OPAQUE,
-    URLIS_NOHISTORY,
-    URLIS_FILEURL,
-    URLIS_APPLIABLE,
-    URLIS_DIRECTORY,
-    URLIS_HASQUERY,
-} URLIS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) int __stdcall          UrlCompareA(LPCSTR psz1, LPCSTR psz2, BOOL fIgnoreSlash);
-extern "C" __declspec(dllimport) int __stdcall          UrlCompareW(LPCWSTR psz1, LPCWSTR psz2, BOOL fIgnoreSlash);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, LPSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, LPWSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsOpaqueA(LPCSTR pszURL);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsOpaqueW(LPCWSTR pszURL);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsNoHistoryA(LPCSTR pszURL);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsNoHistoryW(LPCWSTR pszURL);
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsA(LPCSTR pszUrl, URLIS UrlIs);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsW(LPCWSTR pszUrl, URLIS UrlIs);
-extern "C" __declspec(dllimport) LPCSTR __stdcall       UrlGetLocationA(LPCSTR psz1);
-extern "C" __declspec(dllimport) LPCWSTR __stdcall      UrlGetLocationW(LPCWSTR psz1);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlUnescapeA(LPSTR pszUrl, LPSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlUnescapeW(LPWSTR pszUrl, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlEscapeA(LPCSTR pszUrl, LPSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlEscapeW(LPCWSTR pszUrl, LPWSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCreateFromPathA(LPCSTR pszPath, LPSTR pszUrl, LPDWORD pcchUrl, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCreateFromPathW(LPCWSTR pszPath, LPWSTR pszUrl, LPDWORD pcchUrl, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                PathCreateFromUrlA(LPCSTR pszUrl, LPSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlHashA(LPCSTR pszUrl, LPBYTE pbHash, DWORD cbHash);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlHashW(LPCWSTR pszUrl, LPBYTE pbHash, DWORD cbHash);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlApplySchemeA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                HashData(LPBYTE pbData, DWORD cbData, LPBYTE pbHash, DWORD cbHash);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteEmptyKeyA(HKEY hkey, LPCSTR pszSubKey);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteEmptyKeyW(HKEY hkey, LPCWSTR pszSubKey);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteKeyA(HKEY hkey, LPCSTR pszSubKey);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteKeyW(HKEY hkey, LPCWSTR pszSubKey);
-
-
-
-
-
-extern "C" __declspec(dllimport) HKEY __stdcall     SHRegDuplicateHKey(HKEY hkey);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHGetValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue, DWORD *pdwType, void *pvData, DWORD *pcbData);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHGetValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD *pdwType, void *pvData, DWORD *pcbData);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHSetValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue, DWORD dwType, LPCVOID pvData, DWORD cbData);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHSetValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwType, LPCVOID pvData, DWORD cbData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHQueryValueExA(HKEY hkey, LPCSTR pszValue, DWORD *pdwReserved, DWORD *pdwType, void *pvData, DWORD *pcbData);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHQueryValueExW(HKEY hkey, LPCWSTR pszValue, DWORD *pdwReserved, DWORD *pdwType, void *pvData, DWORD *pcbData);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) LONG __stdcall     SHEnumKeyExA(HKEY hkey, DWORD dwIndex, LPSTR pszName, LPDWORD pcchName);
-extern "C" __declspec(dllimport) LONG __stdcall     SHEnumKeyExW(HKEY hkey, DWORD dwIndex, LPWSTR pszName, LPDWORD pcchName);
-extern "C" __declspec(dllimport) LONG __stdcall     SHEnumValueA(HKEY hkey, DWORD dwIndex, LPSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData);
-extern "C" __declspec(dllimport) LONG __stdcall     SHEnumValueW(HKEY hkey, DWORD dwIndex, LPWSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData);
-extern "C" __declspec(dllimport) LONG __stdcall     SHQueryInfoKeyA(HKEY hkey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen);
-extern "C" __declspec(dllimport) LONG __stdcall     SHQueryInfoKeyW(HKEY hkey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen);
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall     SHCopyKeyA(HKEY hkeySrc, LPCSTR   szSrcSubKey, HKEY hkeyDest, DWORD fReserved);
-extern "C" __declspec(dllimport) DWORD __stdcall     SHCopyKeyW(HKEY hkeySrc, LPCWSTR wszSrcSubKey, HKEY hkeyDest, DWORD fReserved);
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHRegGetPathA(HKEY hKey, LPCSTR pcszSubKey, LPCSTR pcszValue, LPSTR pszPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHRegGetPathW(HKEY hKey, LPCWSTR pcszSubKey, LPCWSTR pcszValue, LPWSTR pszPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHRegSetPathA(HKEY hKey, LPCSTR pcszSubKey, LPCSTR pcszValue, LPCSTR pcszPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHRegSetPathW(HKEY hKey, LPCWSTR pcszSubKey, LPCWSTR pcszValue, LPCWSTR pcszPath, DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum
-{
-    SHREGDEL_DEFAULT = 0x00000000,       
-    SHREGDEL_HKCU    = 0x00000001,       
-    SHREGDEL_HKLM    = 0x00000010,       
-    SHREGDEL_BOTH    = 0x00000011,       
-} SHREGDEL_FLAGS;
-
-typedef enum
-{
-    SHREGENUM_DEFAULT = 0x00000000,       
-    SHREGENUM_HKCU    = 0x00000001,       
-    SHREGENUM_HKLM    = 0x00000010,       
-    SHREGENUM_BOTH    = 0x00000011,       
-                                          
-} SHREGENUM_FLAGS;
-
-
-
-
-
-
-
-typedef HANDLE HUSKEY;  
-typedef HUSKEY *PHUSKEY;
-
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegCreateUSKeyA(LPCSTR pszPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegCreateUSKeyW(LPCWSTR pwzPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegOpenUSKeyA(LPCSTR pszPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, BOOL fIgnoreHKCU);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegOpenUSKeyW(LPCWSTR pwzPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, BOOL fIgnoreHKCU);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryUSValueA(HUSKEY hUSKey, LPCSTR pszValue, LPDWORD pdwType, void *pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, LPDWORD pdwType, void *pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegWriteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegWriteUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, SHREGDEL_FLAGS delRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteEmptyUSKeyW(HUSKEY hUSKey, LPCWSTR pwzSubKey, SHREGDEL_FLAGS delRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteEmptyUSKeyA(HUSKEY hUSKey, LPCSTR pszSubKey, SHREGDEL_FLAGS delRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, SHREGDEL_FLAGS delRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSKeyA(HUSKEY hUSKey, DWORD dwIndex, LPSTR pszName, LPDWORD pcchName, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSKeyW(HUSKEY hUSKey, DWORD dwIndex, LPWSTR pwzName, LPDWORD pcchName, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSValueA(HUSKEY hUSkey, DWORD dwIndex, LPSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSValueW(HUSKEY hUSkey, DWORD dwIndex, LPWSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryInfoUSKeyA(HUSKEY hUSKey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryInfoUSKeyW(HUSKEY hUSKey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegCloseUSKey(HUSKEY hUSKey);
-
-
-
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegGetUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, LPDWORD pdwType, void * pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegGetUSValueW(LPCWSTR pwzSubKey, LPCWSTR pwzValue, LPDWORD pdwType, void * pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegSetUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegSetUSValueW(LPCWSTR pwzSubKey, LPCWSTR pwzValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
-extern "C" __declspec(dllimport) int __stdcall         SHRegGetIntW(HKEY hk, LPCWSTR pwzKey, int iDefault);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHRegGetBoolUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, BOOL fIgnoreHKCU, BOOL fDefault);
-extern "C" __declspec(dllimport) BOOL __stdcall SHRegGetBoolUSValueW(LPCWSTR pszSubKey, LPCWSTR pszValue, BOOL fIgnoreHKCU, BOOL fDefault);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-enum {
-    ASSOCF_INIT_NOREMAPCLSID           = 0x00000001,  
-    ASSOCF_INIT_BYEXENAME              = 0x00000002,  
-    ASSOCF_OPEN_BYEXENAME              = 0x00000002,  
-    ASSOCF_INIT_DEFAULTTOSTAR          = 0x00000004,  
-    ASSOCF_INIT_DEFAULTTOFOLDER        = 0x00000008,  
-    ASSOCF_NOUSERSETTINGS              = 0x00000010,  
-    ASSOCF_NOTRUNCATE                  = 0x00000020,  
-    ASSOCF_VERIFY                      = 0x00000040,  
-    ASSOCF_REMAPRUNDLL                 = 0x00000080,  
-    ASSOCF_NOFIXUPS                    = 0x00000100,  
-    ASSOCF_IGNOREBASECLASS             = 0x00000200,  
-};
-
-typedef DWORD ASSOCF;
-
-
-typedef enum {
-    ASSOCSTR_COMMAND      = 1,  
-    ASSOCSTR_EXECUTABLE,        
-    ASSOCSTR_FRIENDLYDOCNAME,   
-    ASSOCSTR_FRIENDLYAPPNAME,   
-    ASSOCSTR_NOOPEN,            
-    ASSOCSTR_SHELLNEWVALUE,     
-    ASSOCSTR_DDECOMMAND,        
-    ASSOCSTR_DDEIFEXEC,         
-    ASSOCSTR_DDEAPPLICATION,    
-    ASSOCSTR_DDETOPIC,          
-    ASSOCSTR_INFOTIP,           
-    ASSOCSTR_QUICKTIP,          
-    ASSOCSTR_TILEINFO,          
-    ASSOCSTR_CONTENTTYPE,       
-    ASSOCSTR_DEFAULTICON,       
-    ASSOCSTR_SHELLEXTENSION,    
-    ASSOCSTR_MAX                
-} ASSOCSTR;
-
-typedef enum {
-    ASSOCKEY_SHELLEXECCLASS = 1,  
-    ASSOCKEY_APP,                 
-    ASSOCKEY_CLASS,               
-    ASSOCKEY_BASECLASS,           
-    ASSOCKEY_MAX                  
-} ASSOCKEY;
-
-typedef enum {
-    ASSOCDATA_MSIDESCRIPTOR = 1,  
-    ASSOCDATA_NOACTIVATEHANDLER,  
-    ASSOCDATA_QUERYCLASSSTORE,    
-    ASSOCDATA_HASPERUSERASSOC,    
-    ASSOCDATA_EDITFLAGS,          
-    ASSOCDATA_VALUE,              
-    ASSOCDATA_MAX
-} ASSOCDATA;
-
-typedef enum {
-    ASSOCENUM_NONE
-} ASSOCENUM;
-
-
-
-
-struct __declspec(novtable) IQueryAssociations : public IUnknown
-{
-    
-    virtual HRESULT __stdcall QueryInterface( const IID & riid, void **ppv) = 0;
-    virtual ULONG __stdcall AddRef ( void ) = 0;
-    virtual ULONG __stdcall Release ( void ) = 0;
-
-    
-    virtual HRESULT __stdcall Init( ASSOCF flags, LPCWSTR pszAssoc, HKEY hkProgid, HWND hwnd) = 0;
-    virtual HRESULT __stdcall GetString( ASSOCF flags, ASSOCSTR str, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut) = 0;
-    virtual HRESULT __stdcall GetKey( ASSOCF flags, ASSOCKEY key, LPCWSTR pszExtra, HKEY *phkeyOut) = 0;
-    virtual HRESULT __stdcall GetData( ASSOCF flags, ASSOCDATA data, LPCWSTR pszExtra, LPVOID pvOut, DWORD *pcbOut) = 0;
-    virtual HRESULT __stdcall GetEnum( ASSOCF flags, ASSOCENUM assocenum, LPCWSTR pszExtra, const IID & riid, LPVOID *ppvOut) = 0;
-};
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocCreate(CLSID clsid, const IID & riid, LPVOID *ppv);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringA(ASSOCF flags, ASSOCSTR str, LPCSTR pszAssoc, LPCSTR pszExtra, LPSTR pszOut, DWORD *pcchOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringW(ASSOCF flags, ASSOCSTR str, LPCWSTR pszAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringByKeyA(ASSOCF flags, ASSOCSTR str, HKEY hkAssoc, LPCSTR pszExtra, LPSTR pszOut, DWORD *pcchOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringByKeyW(ASSOCF flags, ASSOCSTR str, HKEY hkAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryKeyA(ASSOCF flags, ASSOCKEY key, LPCSTR pszAssoc, LPCSTR pszExtra, HKEY *phkeyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryKeyW(ASSOCF flags, ASSOCKEY key, LPCWSTR pszAssoc, LPCWSTR pszExtra, HKEY *phkeyOut);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStreamA(HKEY hkey, LPCSTR pszSubkey, LPCSTR pszValue, DWORD grfMode);
-extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStreamW(HKEY hkey, LPCWSTR pszSubkey, LPCWSTR pszValue, DWORD grfMode);
-
-
-
-
-
-extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStream2A(HKEY hkey, LPCSTR pszSubkey, LPCSTR pszValue, DWORD grfMode);
-extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStream2W(HKEY hkey, LPCWSTR pszSubkey, LPCWSTR pszValue, DWORD grfMode);
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileA(LPCSTR pszFile, DWORD grfMode, struct IStream **ppstm);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileW(LPCWSTR pszFile, DWORD grfMode, struct IStream **ppstm);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileEx(LPCWSTR pszFile, DWORD grfMode, DWORD dwAttributes, BOOL fCreate, struct IStream * pstmTemplate, struct IStream **ppstm);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHAutoComplete(HWND hwndEdit, DWORD dwFlags);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHSetThreadRef(IUnknown *punk);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHGetThreadRef(IUnknown **ppunk);
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHSkipJunction(struct IBindCtx* pbc, const CLSID *pclsid);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, void *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHReleaseThreadRef(); 
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HPALETTE __stdcall SHCreateShellPalette(HDC hdc);
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     ColorRGBToHLS(COLORREF clrRGB, WORD* pwHue, WORD* pwLuminance, WORD* pwSaturation);
-extern "C" __declspec(dllimport) COLORREF __stdcall ColorHLSToRGB(WORD wHue, WORD wLuminance, WORD wSaturation);
-extern "C" __declspec(dllimport) COLORREF __stdcall ColorAdjustLuma(COLORREF clrRGB, int n, BOOL fScale);
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DLLVERSIONINFO
-{
-    DWORD cbSize;
-    DWORD dwMajorVersion;                   
-    DWORD dwMinorVersion;                   
-    DWORD dwBuildNumber;                    
-    DWORD dwPlatformID;                     
-} DLLVERSIONINFO;
-
-
-
-
-
-
-
-typedef struct _DLLVERSIONINFO2
-{
-    DLLVERSIONINFO info1;
-    DWORD dwFlags;                          
-    ULONGLONG ullVersion;                   
-                                            
-                                            
-                                            
-                                            
-} DLLVERSIONINFO2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef HRESULT (__stdcall* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
-
-
-extern "C" HRESULT __stdcall DllInstall(BOOL bInstall, LPCWSTR pszCmdLine);
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push, 8)
-
-
-
-
-	#pragma comment(lib, "atl.lib")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    #pragma comment(linker,"/manifestdependency:\"type='win32' "        \
-        "name='" "Microsoft.VC80" ".ATL' "              \
-        "version='" "8.0.50727.4053" "' "                          \
-        "processorArchitecture='x86' "                                  \
-        "publicKeyToken='" "1fc8b3b9a1e18e3b" "'\"")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	#pragma comment(lib, "atlsd.lib")
-
-
-
-
-
-
-
-
-
-
-	
-
-
-
-
-
-
-		
-			#pragma comment(linker, "/include:__forceAtlDllManifest")
-		
-
-
-	
-
-
-extern "C" const __declspec(selectany) GUID LIBID_ATLLib = 					 {0x44EC0535,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) CLSID CLSID_Registrar = 				 {0x44EC053A,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) IID IID_IRegistrar = 				 {0x44EC053B,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) IID IID_IAxWinHostWindow = 			 {0xb6ea2050,0x048a,0x11d1,{0x82,0xb9,0x00,0xc0,0x4f,0xb9,0x94,0x2e}};
-extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatch = 		 {0xb6ea2051,0x048a,0x11d1,{0x82,0xb9,0x00,0xc0,0x4f,0xb9,0x94,0x2e}};
-extern "C" const __declspec(selectany) IID IID_IInternalConnection = 		 {0x72AD0770,0x6A9F,0x11d1,{0xBC,0xEC,0x00,0x60,0x08,0x8F,0x44,0x4E}};
-extern "C" const __declspec(selectany) IID IID_IDocHostUIHandlerDispatch = 	 {0x425B5AF0,0x65F1,0x11d1,{0x96,0x11,0x00,0x00,0xF8,0x1E,0x0D,0x0D}};
-extern "C" const __declspec(selectany) IID IID_IAxWinHostWindowLic = 		 {0x3935BDA8,0x4ED9,0x495c,{0x86,0x50,0xE0,0x1F,0xC1,0xE3,0x8A,0x4B}};
-extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatchEx = 	 {0xB2D0778B,0xAC99,0x4c58,{0xA5,0xC8,0xE7,0x72,0x4E,0x53,0x16,0xB5}};
-
-
-
-extern "C" IMAGE_DOS_HEADER __ImageBase;
-
-
-
-
-
-
-
-
- 
-namespace ATL
-{
-
-struct _ATL_CATMAP_ENTRY
-{
-   int iType;
-   const CATID* pcatid;
-};
-
-
-
-
-
-typedef HRESULT (__stdcall _ATL_CREATORFUNC)(void* pv, const IID & riid, LPVOID* ppv);
-typedef HRESULT (__stdcall _ATL_CREATORARGFUNC)(void* pv, const IID & riid, LPVOID* ppv, DWORD_PTR dw);
-typedef HRESULT (__stdcall _ATL_MODULEFUNC)(DWORD_PTR dw);
-typedef LPCTSTR (__stdcall _ATL_DESCRIPTIONFUNC)();
-typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)();
-typedef void (__stdcall _ATL_TERMFUNC)(DWORD_PTR dw);
-
-struct _ATL_TERMFUNC_ELEM
-{
-	_ATL_TERMFUNC* pFunc;
-	DWORD_PTR dw;
-	_ATL_TERMFUNC_ELEM* pNext;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _ATL_OBJMAP_ENTRY30 
-{
-	const CLSID* pclsid;
-	HRESULT (__stdcall *pfnUpdateRegistry)(BOOL bRegister);
-	_ATL_CREATORFUNC* pfnGetClassObject;
-	_ATL_CREATORFUNC* pfnCreateInstance;
-	IUnknown* pCF;
-	DWORD dwRegister;
-	_ATL_DESCRIPTIONFUNC* pfnGetObjectDescription;
-	_ATL_CATMAPFUNC* pfnGetCategoryMap;
-	HRESULT __stdcall RevokeClassObject()
-	{
-		if (dwRegister == 0)
-			return ((HRESULT)0x00000000L);
-		return CoRevokeClassObject(dwRegister);
-	}
-	HRESULT __stdcall RegisterClassObject(DWORD dwClsContext, DWORD dwFlags)
-	{
-		IUnknown* p = 0;
-		if (pfnGetClassObject == 0)
-			return ((HRESULT)0x00000000L);
-		HRESULT hRes = pfnGetClassObject(pfnCreateInstance, __uuidof(IUnknown), (LPVOID*) &p);
-		if (((HRESULT)(hRes) >= 0))
-			hRes = CoRegisterClassObject(*pclsid, p, dwClsContext, dwFlags, &dwRegister);
-		if (p != 0)
-			p->Release();
-		return hRes;
-	}
-
-	void (__stdcall *pfnObjectMain)(bool bStarting);
-};
-
-typedef _ATL_OBJMAP_ENTRY30 _ATL_OBJMAP_ENTRY;
-
-
-
-
-
-#pragma section("ATL$__a", read, shared)
-#pragma section("ATL$__z", read, shared)
-#pragma section("ATL$__m", read, shared)
-extern "C"
-{
-__declspec(selectany) __declspec(allocate("ATL$__a")) _ATL_OBJMAP_ENTRY* __pobjMapEntryFirst = 0;
-__declspec(selectany) __declspec(allocate("ATL$__z")) _ATL_OBJMAP_ENTRY* __pobjMapEntryLast = 0;
-}
-
-
-#pragma comment(linker, "/merge:ATL=.rdata")
-
-
-
-
-
-
-
-
-
-
-
-
-struct _ATL_REGMAP_ENTRY
-{
-	LPCOLESTR     szKey;
-	LPCOLESTR     szData;
-};
-
-struct _AtlCreateWndData
-{
-	void* m_pThis;
-	DWORD m_dwThreadID;
-	_AtlCreateWndData* m_pNext;
-};
-
-
-
-typedef HRESULT (*_ATL_PERFREGFUNC)(HINSTANCE hDllInstance);
-typedef HRESULT (*_ATL_PERFUNREGFUNC)();
-__declspec(selectany) _ATL_PERFREGFUNC _pPerfRegFunc = 0;
-__declspec(selectany) _ATL_PERFUNREGFUNC _pPerfUnRegFunc = 0;
-
-
-
-
-template< class TLock >
-class CComCritSecLock
-{
-public:
-	CComCritSecLock( TLock& cs, bool bInitialLock = true );
-	~CComCritSecLock() throw();
-
-	HRESULT Lock() throw();
-	void Unlock() throw();
-
-
-private:
-	TLock& m_cs;
-	bool m_bLocked;
-
-
-	CComCritSecLock( const CComCritSecLock& ) throw();
-	CComCritSecLock& operator=( const CComCritSecLock& ) throw();
-};
-
-template< class TLock >
-inline CComCritSecLock< TLock >::CComCritSecLock( TLock& cs, bool bInitialLock ) :
-	m_cs( cs ),
-	m_bLocked( false )
-{
-	if( bInitialLock )
-	{
-		HRESULT hr;
-
-		hr = Lock();
-		if( ((HRESULT)(hr) < 0) )
-		{
-			ATL::AtlThrowImpl( hr );
-		}
-	}
-}
-
-template< class TLock >
-inline CComCritSecLock< TLock >::~CComCritSecLock() throw()
-{
-	if( m_bLocked )
-	{
-		Unlock();
-	}
-}
-
-template< class TLock >
-inline HRESULT CComCritSecLock< TLock >::Lock() throw()
-{
-	HRESULT hr;
-
-	(void) ((!!((!m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 342, 0, L"!m_bLocked")) || (__debugbreak(), 0));
-	hr = m_cs.Lock();
-	if( ((HRESULT)(hr) < 0) )
-	{
-		return( hr );
-	}
-	m_bLocked = true;
-
-	return( ((HRESULT)0x00000000L) );
-}
-
-template< class TLock >
-inline void CComCritSecLock< TLock >::Unlock() throw()
-{
-	do { (void) ((!!((m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 356, 0, L"m_bLocked")) || (__debugbreak(), 0)); ; } while(0);
-	m_cs.Unlock();
-	m_bLocked = false;
-}
-
-class CComMultiThreadModelNoCS
-{
-public:
-	static ULONG __stdcall Increment(LPLONG p) throw() {return InterlockedIncrement(p);}
-	static ULONG __stdcall Decrement(LPLONG p) throw() {return InterlockedDecrement(p);}
-	typedef CComFakeCriticalSection AutoCriticalSection;
-	typedef CComFakeCriticalSection AutoDeleteCriticalSection;
-	typedef CComFakeCriticalSection CriticalSection;
-	typedef CComMultiThreadModelNoCS ThreadModelNoCS;
-};
-
-class CComMultiThreadModel
-{
-public:
-	static ULONG __stdcall Increment(LPLONG p) throw() {return InterlockedIncrement(p);}
-	static ULONG __stdcall Decrement(LPLONG p) throw() {return InterlockedDecrement(p);}
-	typedef CComAutoCriticalSection AutoCriticalSection;
-	typedef CComAutoDeleteCriticalSection AutoDeleteCriticalSection;
-	typedef CComCriticalSection CriticalSection;
-	typedef CComMultiThreadModelNoCS ThreadModelNoCS;
-};
-
-class CComSingleThreadModel
-{
-public:
-	static ULONG __stdcall Increment(LPLONG p) throw() {return ++(*p);}
-	static ULONG __stdcall Decrement(LPLONG p) throw() {return --(*p);}
-	typedef CComFakeCriticalSection AutoCriticalSection;
-	typedef CComFakeCriticalSection AutoDeleteCriticalSection;
-	typedef CComFakeCriticalSection CriticalSection;
-	typedef CComSingleThreadModel ThreadModelNoCS;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	typedef CComSingleThreadModel CComObjectThreadModel;
-	typedef CComMultiThreadModel CComGlobalsThreadModel;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _ATL_COM_MODULE70
-{
-	UINT cbSize;
-	HINSTANCE m_hInstTypeLib;
-	_ATL_OBJMAP_ENTRY** m_ppAutoObjMapFirst;
-	_ATL_OBJMAP_ENTRY** m_ppAutoObjMapLast;
-	CComCriticalSection m_csObjMap;
-};
-typedef _ATL_COM_MODULE70 _ATL_COM_MODULE;
-
-
-
-struct _ATL_WIN_MODULE70
-{
-	UINT cbSize;
-	CComCriticalSection m_csWindowCreate;
-	_AtlCreateWndData* m_pCreateWndList;
-	CSimpleArray<ATOM> m_rgWindowClassAtoms;
-};
-typedef _ATL_WIN_MODULE70 _ATL_WIN_MODULE;
-
-
-struct _ATL_MODULE70
-{
-	UINT cbSize;
-	LONG m_nLockCnt;
-	_ATL_TERMFUNC_ELEM* m_pTermFuncs;
-	CComCriticalSection m_csStaticDataInitAndTypeInfo;
-};
-typedef _ATL_MODULE70 _ATL_MODULE;
-
-
-
-
-
-
-struct _ATL_INTMAP_ENTRY
-{
-	const IID* piid;       
-	DWORD_PTR dw;
-	_ATL_CREATORARGFUNC* pFunc; 
-};
-
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlInternalQueryInterface(void* pThis,
-	const _ATL_INTMAP_ENTRY* pEntries, const IID & iid, void** ppvObject);
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlFreeMarshalStream(IStream* pStream);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlMarshalPtrInProc(IUnknown* pUnk, const IID& iid, IStream** ppStream);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnmarshalPtr(IStream* pStream, const IID& iid, IUnknown** ppUnk);
-
-extern "C" __declspec(dllimport) BOOL __stdcall AtlWaitWithMessageLoop(HANDLE hEvent);
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw);
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlSetErrorInfo(const CLSID& clsid, LPCOLESTR lpszDesc,
-	DWORD dwHelpID, LPCOLESTR lpszHelpFile, const IID& iid, HRESULT hRes,
-	HINSTANCE hInst);
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRegisterClassObjects(_ATL_COM_MODULE* pComModule, DWORD dwClsContext, DWORD dwFlags);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRevokeClassObjects(_ATL_COM_MODULE* pComModule);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleGetClassObject(_ATL_COM_MODULE* pComModule, const IID & rclsid, const IID & riid, LPVOID* ppv);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRegisterServer(_ATL_COM_MODULE* pComModule, BOOL bRegTypeLib, const CLSID* pCLSID = 0);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleUnregisterServer(_ATL_COM_MODULE* pComModule, BOOL bUnRegTypeLib, const CLSID* pCLSID = 0);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlRegisterClassCategoriesHelper( const IID & clsid, const struct _ATL_CATMAP_ENTRY* pCatMap, BOOL bRegister );
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlUpdateRegistryFromResourceD(HINSTANCE hInst, LPCOLESTR lpszRes,
-	BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = 0);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlLoadTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib);
-
-extern "C" __declspec(dllimport) DWORD __stdcall AtlGetVersion(void* pReserved);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlModuleAddTermFunc(_ATL_MODULE* pModule, _ATL_TERMFUNC* pFunc, DWORD_PTR dw);
-extern "C" __declspec(dllimport) void __stdcall AtlCallTermFunc(_ATL_MODULE* pModule);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlWinModuleInit(_ATL_WIN_MODULE* pWinModule);
-extern "C" inline HRESULT __stdcall AtlWinModuleTerm(_ATL_WIN_MODULE* pWinModule, HINSTANCE hInst);
-
-extern "C" __declspec(dllimport) void __stdcall AtlWinModuleAddCreateWndData(_ATL_WIN_MODULE* pWinModule, _AtlCreateWndData* pData, void* pObject);
-extern "C" __declspec(dllimport) void* __stdcall AtlWinModuleExtractCreateWndData(_ATL_WIN_MODULE* pWinModule);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AtlCreateRegistrar(IRegistrar** ppReg);
-
-
-
-
-
-inline BOOL __stdcall InlineIsEqualUnknown(const GUID & rguid1)
-{
-   return (
-	  ((PLONG) &rguid1)[0] == 0 &&
-	  ((PLONG) &rguid1)[1] == 0 &&
-
-
-
-
-	  ((PLONG) &rguid1)[2] == 0x000000C0 &&
-	  ((PLONG) &rguid1)[3] == 0x46000000);
-
-}
-
-
-
-template <class T>
-LPCTSTR AtlDebugGetClassName(T*)
-{
-
-	const _ATL_INTMAP_ENTRY* pEntries = T::_GetEntries();
-	return (LPCTSTR)pEntries[-1].dw;
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(lib, "kernel32.lib")
-#pragma comment(lib, "user32.lib")
-#pragma comment(lib, "advapi32.lib")
-#pragma comment(lib, "ole32.lib")
-#pragma comment(lib, "shell32.lib")
-#pragma comment(lib, "oleaut32.lib")
-#pragma comment(lib, "uuid.lib")
-#pragma comment(lib, "shlwapi.lib")
-
-
-template< typename T >
-class CAutoVectorPtr
-{
-public:
-	CAutoVectorPtr() throw() :
-		m_p( 0 )
-	{
-	}
-	CAutoVectorPtr( CAutoVectorPtr< T >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	explicit CAutoVectorPtr( T* p ) throw() :
-		m_p( p )
-	{
-	}
-	~CAutoVectorPtr() throw()
-	{
-		Free();
-	}
-
-	operator T*() const throw()
-	{
-		return( m_p );
-	}
-
-	CAutoVectorPtr< T >& operator=( CAutoVectorPtr< T >& p ) throw()
-	{
-        if(*this==p)
-        {
-            if(this!=&p)
-            {
-                
-                
-                
-                (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 634, 0, L"0")) || (__debugbreak(), 0));
-
-                
-                
-                p.Detach();
-            }
-            else
-            {
-                
-                
-
-                
-            }
-        }
-        else
-        {
-		    Free();
-		    Attach( p.Detach() );  
-        }
-		return( *this );
-	}
-
-    
-    bool operator!=(CAutoVectorPtr<T>& p) const
-    {
-        return !operator==(p);
-    }
-
-    bool operator==(CAutoVectorPtr<T>& p) const
-    {
-        return m_p==p.m_p;
-    }
-
-	
-	bool Allocate( size_t nElements ) throw()
-	{
-		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 670, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_p = new T[nElements];} catch(...) {} __pragma(warning(pop));
-		if( m_p == 0 )
-		{
-			return( false );
-		}
-
-		return( true );
-	}
-	
-	void Attach( T* p ) throw()
-	{
-		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 682, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_p = p;
-	}
-	
-	T* Detach() throw()
-	{
-		T* p;
-
-		p = m_p;
-		m_p = 0;
-
-		return( p );
-	}
-	
-	void Free() throw()
-	{
-		delete[] m_p;
-		m_p = 0;
-	}
-
-public:
-	T* m_p;
-};
-
-template< typename T >
-class CAutoPtr
-{
-public:
-	CAutoPtr() throw() :
-		m_p( 0 )
-	{
-	}
-	template< typename TSrc >
-	CAutoPtr( CAutoPtr< TSrc >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	CAutoPtr( CAutoPtr< T >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	explicit CAutoPtr( T* p ) throw() :
-		m_p( p )
-	{
-	}
-	~CAutoPtr() throw()
-	{
-		Free();
-	}
-
-	
-	template< typename TSrc >
-	CAutoPtr< T >& operator=( CAutoPtr< TSrc >& p ) throw()
-	{
-        if(m_p==p.m_p)
-        {
-            
-            
-            (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 740, 0, L"0")) || (__debugbreak(), 0));
-        }
-        else
-        {
-		    Free();
-		    Attach( p.Detach() );  
-        }
-		return( *this );
-	}
-	CAutoPtr< T >& operator=( CAutoPtr< T >& p ) throw()
-	{
-        if(*this==p)
-        {
-            if(this!=&p)
-            {
-                
-                
-                
-
-
-
-
-                
-                
-                p.Detach();
-            }
-            else
-            {
-                
-                
-
-                
-            }
-        }
-        else
-        {
-		    Free();
-		    Attach( p.Detach() );  
-        }
-		return( *this );
-	}
-
-    
-    bool operator!=(CAutoPtr<T>& p) const
-    {
-        return !operator==(p);
-    }
-
-    bool operator==(CAutoPtr<T>& p) const
-    {
-        return m_p==p.m_p;
-    }
-
-	operator T*() const throw()
-	{
-		return( m_p );
-	}
-	T* operator->() const throw()
-	{
-		do { (void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 799, 0, L"m_p != 0")) || (__debugbreak(), 0)); ; } while(0);
-		return( m_p );
-	}
-
-	
-	void Attach( T* p ) throw()
-	{
-		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 806, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_p = p;
-	}
-	
-	T* Detach() throw()
-	{
-		T* p;
-
-		p = m_p;
-		m_p = 0;
-
-		return( p );
-	}
-	
-	void Free() throw()
-	{
-		delete m_p;
-		m_p = 0;
-	}
-
-public:
-	T* m_p;
-};
-
-
-template< typename T >
-class CAutoStackPtr
-{
-public:
-	CAutoStackPtr() throw() :
-		m_p( 0 )
-	{
-	}
-	template< typename TSrc >
-	CAutoStackPtr( CAutoStackPtr< TSrc >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	CAutoStackPtr( CAutoStackPtr< T >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	explicit CAutoStackPtr( T* p ) throw() :
-		m_p( p )
-	{
-	}
-	~CAutoStackPtr() throw()
-	{
-		Free();
-	}
-
-	
-	template< typename TSrc >
-	CAutoStackPtr< T >& operator=( CAutoStackPtr< TSrc >& p ) throw()
-	{
-		if(m_p==p.m_p)
-		{
-			
-			
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 865, 0, L"0")) || (__debugbreak(), 0));
-		}
-		else
-		{
-			Free();
-			Attach( p.Detach() );  
-		}
-		return( *this );
-	}
-	CAutoStackPtr< T >& operator=( CAutoStackPtr< T >& p ) throw()
-	{
-        if(*this==p)
-        {
-            if(this!=&p)
-            {
-                
-                
-                
-                (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 883, 0, L"0")) || (__debugbreak(), 0));
-
-                
-                
-                p.Detach();
-            }
-            else
-            {
-                
-                
-
-                
-            }
-        }
-        else
-        {
-		    Free();
-		    Attach( p.Detach() );  
-        }
-		return( *this );
-	}
-
-    
-    bool operator!=(CAutoStackPtr<T>& p) const
-    {
-        return !operator==(p);
-    }
-
-    bool operator==(CAutoStackPtr<T>& p) const
-    {
-        return m_p==p.m_p;
-    }
-
-	operator T*() const throw()
-	{
-		return( m_p );
-	}
-	T* operator->() const throw()
-	{
-		do { (void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 922, 0, L"m_p != 0")) || (__debugbreak(), 0)); ; } while(0);
-		return( m_p );
-	}
-
-	
-	void Attach( T* p ) throw()
-	{
-		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 929, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_p = p;
-	}
-	
-	T* Detach() throw()
-	{
-		T* p;
-
-		p = m_p;
-		m_p = 0;
-
-		return( p );
-	}
-	
-	void Free() throw()
-	{
-		
-
-
-
-
-
-		_freea(m_p);
-		m_p = 0;
-	}
-
-public:
-	T* m_p;
-};
-
-
-template< class Dest, class Src >
-Dest* static_cast_auto( const CAutoPtr< Src >& pSrc ) throw()
-{
-	return( static_cast< Dest* >( static_cast< Src* >( pSrc ) ) );
-}
-
-
-class CComAllocator 
-{
-public:
-	static void* Reallocate(void* p, size_t nBytes) throw()
-	{
-
-
-
-
-
-
-		return ::CoTaskMemRealloc(p, ULONG(nBytes));
-	}
-	static void* Allocate(size_t nBytes) throw()
-	{
-
-
-
-
-
-
-		return ::CoTaskMemAlloc(ULONG(nBytes));
-	}
-	static void Free(void* p) throw()
-	{
-		::CoTaskMemFree(p);
-	}
-};
-
-template <typename T>
-class CComHeapPtr :
-	public CHeapPtr<T, CComAllocator>
-{
-public:
-	CComHeapPtr() throw()
-	{
-	}
-
-	explicit CComHeapPtr(T* pData) throw() :
-		CHeapPtr<T, CComAllocator>(pData)
-	{
-	}
-};
-
-template <class T, class Reallocator>
-T* AtlSafeRealloc(T* pT, size_t cEls) throw()
-{
-	T* pTemp;
-
-	size_t nBytes=0;
-	if(((HRESULT)(::ATL::AtlMultiply(&nBytes, cEls, sizeof(T))) < 0))
-	{
-		return 0;
-	}
-	pTemp = static_cast<T*>(Reallocator::Reallocate(pT, nBytes));
-	if (pTemp == 0)
-	{
-		Reallocator::Free(pT);
-		return 0;
-	}
-	pT = pTemp;
-	return pTemp;
-}
-
-class CHandle
-{
-public:
-	CHandle() throw();
-	CHandle( CHandle& h ) throw();
-	explicit CHandle( HANDLE h ) throw();
-	~CHandle() throw();
-
-	CHandle& operator=( CHandle& h ) throw();
-
-	operator HANDLE() const throw();
-
-	
-	void Attach( HANDLE h ) throw();
-	
-	HANDLE Detach() throw();
-
-	
-	void Close() throw();
-
-public:
-	HANDLE m_h;
-};
-
-inline CHandle::CHandle() throw() :
-	m_h( 0 )
-{
-}
-
-inline CHandle::CHandle( CHandle& h ) throw() :
-	m_h( 0 )
-{
-	Attach( h.Detach() );
-}
-
-inline CHandle::CHandle( HANDLE h ) throw() :
-	m_h( h )
-{
-}
-
-inline CHandle::~CHandle() throw()
-{
-	if( m_h != 0 )
-	{
-		Close();
-	}
-}
-
-inline CHandle& CHandle::operator=( CHandle& h ) throw()
-{
-	if( this != &h )
-	{
-		if( m_h != 0 )
-		{
-			Close();
-		}
-		Attach( h.Detach() );
-	}
-
-	return( *this );
-}
-
-inline CHandle::operator HANDLE() const throw()
-{
-	return( m_h );
-}
-
-inline void CHandle::Attach( HANDLE h ) throw()
-{
-	do { (void) ((!!((m_h == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1100, 0, L"m_h == 0")) || (__debugbreak(), 0)); ; } while(0);
-	m_h = h;  
-}
-
-inline HANDLE CHandle::Detach() throw()
-{
-	HANDLE h;
-
-	h = m_h;  
-	m_h = 0;
-
-	return( h );
-}
-
-inline void CHandle::Close() throw()
-{
-	if( m_h != 0 )
-	{
-		::CloseHandle( m_h );
-		m_h = 0;
-	}
-}
-
-class CCritSecLock
-{
-public:
-	CCritSecLock( CRITICAL_SECTION& cs, bool bInitialLock = true );
-	~CCritSecLock() throw();
-
-	void Lock();
-	void Unlock() throw();
-
-
-private:
-	CRITICAL_SECTION& m_cs;
-	bool m_bLocked;
-
-
-	CCritSecLock( const CCritSecLock& ) throw();
-	CCritSecLock& operator=( const CCritSecLock& ) throw();
-};
-
-inline CCritSecLock::CCritSecLock( CRITICAL_SECTION& cs, bool bInitialLock ) :
-	m_cs( cs ),
-	m_bLocked( false )
-{
-	if( bInitialLock )
-	{
-		Lock();
-	}
-}
-
-inline CCritSecLock::~CCritSecLock() throw()
-{
-	if( m_bLocked )
-	{
-		Unlock();
-	}
-}
-
-inline void CCritSecLock::Lock()
-{
-	(void) ((!!((!m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1162, 0, L"!m_bLocked")) || (__debugbreak(), 0));
-	__try
-	{
-		::EnterCriticalSection( &m_cs );
-	}
-	__except( ((DWORD )0xC0000017L) == _exception_code() )
-	{
-		ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-	}
-	m_bLocked = true;
-}
-
-inline void CCritSecLock::Unlock() throw()
-{
-	do { (void) ((!!((m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1176, 0, L"m_bLocked")) || (__debugbreak(), 0)); ; } while(0);
-	::LeaveCriticalSection( &m_cs );
-	m_bLocked = false;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class CAtlComModule : public _ATL_COM_MODULE
-{
-public:
-
-	CAtlComModule() throw()
-	{
-        cbSize = 0;
-
-		m_hInstTypeLib = reinterpret_cast<HINSTANCE>(&__ImageBase);
-
-		m_ppAutoObjMapFirst = &__pobjMapEntryFirst + 1;
-		m_ppAutoObjMapLast = &__pobjMapEntryLast;
-
-		if (((HRESULT)(m_csObjMap.Init()) < 0))
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2302)(atlTraceCOM, 0, L"ERROR : Unable to initialize critical section in CAtlComModule\n");
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2303, 0, L"0")) || (__debugbreak(), 0));
-			CAtlBaseModule::m_bInitFailed = true;
-			return;
-		}
-		
-        cbSize = sizeof(_ATL_COM_MODULE);
-	}
-
-	~CAtlComModule()
-	{
-		Term();
-	}
-
-	
-	void Term()
-	{
-		if (cbSize == 0)
-			return;
-
-		for (_ATL_OBJMAP_ENTRY** ppEntry = m_ppAutoObjMapFirst; ppEntry < m_ppAutoObjMapLast; ppEntry++)
-		{
-			if (*ppEntry != 0)
-			{
-				_ATL_OBJMAP_ENTRY* pEntry = *ppEntry;
-				if (pEntry->pCF != 0)
-					pEntry->pCF->Release();
-				pEntry->pCF = 0;
-			}
-		}
-		m_csObjMap.Term();
-		
-		
-		
-		cbSize = 0;
-	}
-
-	
-	HRESULT RegisterTypeLib()
-	{
-		return AtlRegisterTypeLib(m_hInstTypeLib, 0);
-	}
-	HRESULT RegisterTypeLib(LPCTSTR lpszIndex)
-	{
-		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		LPCOLESTR pwszTemp = 0;
-		if( lpszIndex != 0 )
-		{
-			pwszTemp = T2COLE_EX(lpszIndex, 1024);
-
-
-
-
-		}
-		return AtlRegisterTypeLib(m_hInstTypeLib, pwszTemp);
-	}
-	HRESULT UnRegisterTypeLib()
-	{
-		return AtlUnRegisterTypeLib(m_hInstTypeLib, 0);
-	}
-	HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex)
-	{
-		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		LPCOLESTR pwszTemp = 0;
-		if( lpszIndex != 0 )
-		{
-			pwszTemp = T2COLE_EX(lpszIndex, 1024);
-
-
-
-
-		}
-		return AtlUnRegisterTypeLib(m_hInstTypeLib, pwszTemp);
-	}
-
-	
-	
-	
-	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0)
-	{
-		return AtlComModuleRegisterServer(this, bRegTypeLib, pCLSID);
-	}
-
-	
-	
-	
-	HRESULT UnregisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0)
-	{
-		return AtlComModuleUnregisterServer(this, bRegTypeLib, pCLSID);
-	}
-
-	
-
-	
-	void ExecuteObjectMain(bool bStarting)
-	{
-		for (_ATL_OBJMAP_ENTRY** ppEntry = m_ppAutoObjMapFirst; ppEntry < m_ppAutoObjMapLast; ppEntry++)
-		{
-			if (*ppEntry != 0)
-				(*ppEntry)->pfnObjectMain(bStarting);
-		}
-	}	
-};
-
-extern CAtlComModule _AtlComModule;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class CAtlWinModule : public _ATL_WIN_MODULE
-{
-public:
-	CAtlWinModule()
-	{
-		cbSize = sizeof(_ATL_WIN_MODULE);
-		HRESULT hr = AtlWinModuleInit(this);
-		if (((HRESULT)(hr) < 0))
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2629, 0, L"0")) || (__debugbreak(), 0));
-			CAtlBaseModule::m_bInitFailed = true;
-			cbSize = 0;
-			return;
-		}
-	}
-
-	~CAtlWinModule()
-	{
-		Term();
-	}
-
-	void Term()
-	{
-        AtlWinModuleTerm(this, _AtlBaseModule.GetModuleInstance());
-	}
-
-	void AddCreateWndData(_AtlCreateWndData* pData, void* pObject)
-	{
-		AtlWinModuleAddCreateWndData(this, pData, pObject);
-	}
-
-	void* ExtractCreateWndData()
-	{
-		return AtlWinModuleExtractCreateWndData(this);
-	}
-};
-
-extern CAtlWinModule _AtlWinModule;
-
-class CAtlModule;
-__declspec(selectany) CAtlModule* _pAtlModule = 0;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class __declspec(novtable) CAtlModule : public _ATL_MODULE
-{
-public :
-	static GUID m_libid;
-	IGlobalInterfaceTable* m_pGIT;
-
-	CAtlModule() throw()
-	{
-		
-		
-		(void) ((!!((_pAtlModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2706, 0, L"_pAtlModule == 0")) || (__debugbreak(), 0));
-		cbSize = 0;
-		m_pTermFuncs = 0;
-
-		m_nLockCnt = 0;
-		_pAtlModule = this;
-		m_pGIT = 0;
-
-		if (((HRESULT)(m_csStaticDataInitAndTypeInfo.Init()) < 0))
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2716)(atlTraceGeneral, 0, L"ERROR : Unable to initialize critical section in CAtlModule\n");
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2717, 0, L"0")) || (__debugbreak(), 0));
-			CAtlBaseModule::m_bInitFailed = true;
-			return;
-		}
-
-		
-		cbSize = sizeof(_ATL_MODULE);
-	}
-
-	void Term() throw()
-	{
-		
-		if (cbSize == 0)
-			return;
-
-		
-		if (m_pTermFuncs != 0)
-		{
-			AtlCallTermFunc(this);
-			m_pTermFuncs = 0;
-		}
-
-		if (m_pGIT != 0)
-			m_pGIT->Release();
-
-		m_csStaticDataInitAndTypeInfo.Term();
-
-		cbSize = 0;
-	}
-
-	virtual ~CAtlModule() throw()
-	{
-		Term();
-	}
-
-	virtual LONG Lock() throw()
-	{
-		return CComGlobalsThreadModel::Increment(&m_nLockCnt);
-	}
-
-	virtual LONG Unlock() throw()
-	{
-		return CComGlobalsThreadModel::Decrement(&m_nLockCnt);
-	}
-
-	virtual LONG GetLockCount() throw()
-	{
-		return m_nLockCnt;
-	}
-
-	HRESULT AddTermFunc(_ATL_TERMFUNC* pFunc, DWORD_PTR dw) throw()
-	{
-		return AtlModuleAddTermFunc(this, pFunc, dw);
-	}
-
-	virtual HRESULT GetGITPtr(IGlobalInterfaceTable** ppGIT) throw()
-	{
-		(void) ((!!((ppGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2774, 0, L"ppGIT != 0")) || (__debugbreak(), 0));
-
-		if (ppGIT == 0)
-			return ((HRESULT)0x80004003L);
-
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_pGIT == 0)
-		{
-			hr = ::CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER,
-				__uuidof(IGlobalInterfaceTable), (void**)&m_pGIT);
-		}
-
-		if (((HRESULT)(hr) >= 0))
-		{
-			do { (void) ((!!((m_pGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2788, 0, L"m_pGIT != 0")) || (__debugbreak(), 0)); ; } while(0);
-			*ppGIT = m_pGIT;
-			m_pGIT->AddRef();
-		}
-		return hr;
-	}
-
-	virtual HRESULT AddCommonRGSReplacements(IRegistrarBase* ) throw() = 0;
-
-	
-
-
-
-
-
-
-
-	HRESULT __stdcall UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-		if(lpszRes == 0)
-			return ((HRESULT)0x80070057L);
-		
-		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		LPCOLESTR pwszTemp = T2COLE_EX(lpszRes, 1024);
-
-		if(pwszTemp == 0) 
-			return ((HRESULT)0x8007000EL);
-
-		return UpdateRegistryFromResourceDHelper(pwszTemp, bRegister, pMapEntries);
-	}
-	HRESULT __stdcall UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-		return UpdateRegistryFromResourceDHelper((LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nResID)))), bRegister, pMapEntries);
-	}
-
-
-	
-
-	inline HRESULT __stdcall UpdateRegistryFromResourceDHelper(LPCOLESTR lpszRes, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-		CComPtr<IRegistrar> spRegistrar;
-		HRESULT hr = AtlCreateRegistrar(&spRegistrar);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		if (0 != pMapEntries)
-		{
-			while (0 != pMapEntries->szKey)
-			{
-				(void) ((!!((0 != pMapEntries->szData))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2840, 0, L"0 != pMapEntries->szData")) || (__debugbreak(), 0));
-				spRegistrar->AddReplacement(pMapEntries->szKey, pMapEntries->szData);
-				pMapEntries++;
-			}
-		}
-
-		hr = AddCommonRGSReplacements(spRegistrar);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		return AtlUpdateRegistryFromResourceD(_AtlBaseModule.GetModuleInstance(), lpszRes, bRegister,
-			0, spRegistrar);
-	}
-
-
-	static void EscapeSingleQuote(       LPOLESTR lpDest,     size_t destSizeInChars,        LPCOLESTR lp) throw()
-	{	
-		if (destSizeInChars == 0)
-		{
-			return;
-		}
-		UINT i = 0;
-		
-		for (i=0; i < destSizeInChars-1 && *lp; i++)		
-		{
-			*lpDest++ = *lp;
-			
-			if (*lp == '\'' && ++i < destSizeInChars-1) 
-				*lpDest++ = *lp;
-			lp++;
-		}
-		*lpDest = 0;
-	}
-
-	__declspec( deprecated("CAtlModule::EscapeSingleQuote(dest, src) is unsafe. Instead, use CAtlModule::EscapeSingleQuote(dest, size, src)") )
-	static void EscapeSingleQuote(LPOLESTR lpDest, LPCOLESTR lp) throw()
-	{
-		EscapeSingleQuote(lpDest, 0xffffffff/sizeof(OLECHAR), lp);
-	}
-
-	
-	static LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) throw()
-	{
-		while (p1 != 0 && *p1 != 0)
-		{
-			LPCTSTR p = p2;
-			while (p != 0 && *p != 0)
-			{
-				if (*p1 == *p)
-					return CharNextW(p1);
-				p = CharNextW(p);
-			}
-			p1 = CharNextW(p1);
-		}
-		return 0;
-	}
-#pragma warning(push)
-#pragma warning(disable : 4302)	
-
-	static int WordCmpI(LPCTSTR psz1, LPCTSTR psz2) throw()
-	{
-		TCHAR c1 = (TCHAR)CharUpperW((LPTSTR)*psz1);
-		TCHAR c2 = (TCHAR)CharUpperW((LPTSTR)*psz2);
-		while (c1 != 0 && c1 == c2 && c1 != ' ' && c1 != '\t')
-		{
-			psz1 = CharNextW(psz1);
-			psz2 = CharNextW(psz2);
-			c1 = (TCHAR)CharUpperW((LPTSTR)*psz1);
-			c2 = (TCHAR)CharUpperW((LPTSTR)*psz2);
-		}
-		if ((c1 == 0 || c1 == ' ' || c1 == '\t') && (c2 == 0 || c2 == ' ' || c2 == '\t'))
-			return 0;
-
-		return (c1 < c2) ? -1 : 1;
-	}
-
-#pragma warning (pop)	
-};
-
-__declspec(selectany) GUID CAtlModule::m_libid = {0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline HRESULT AtlGetGITPtr(IGlobalInterfaceTable** ppGIT) throw()
-{
-	if (ppGIT == 0)
-		return ((HRESULT)0x80004003L);
-
-	if (_pAtlModule == 0)
-	{
-		return CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER,
-			__uuidof(IGlobalInterfaceTable), (void**)ppGIT);
-	}
-	else
-	{
-		return _pAtlModule->GetGITPtr(ppGIT);
-	}
-}
-
-template <class T>
-class __declspec(novtable) CAtlModuleT : public CAtlModule
-{
-public :
-	CAtlModuleT() throw()
-	{
-		T::InitLibId();
-	}
-
-	static void InitLibId() throw()
-	{
-	}
-
-	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0) throw()
-	{
-		(pCLSID);
-		(bRegTypeLib);
-
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-
-
-		hr = _AtlComModule.RegisterServer(bRegTypeLib, pCLSID);
-
-
-
-
-
-
-		if (((HRESULT)(hr) >= 0) && _pPerfRegFunc != 0)
-			hr = (*_pPerfRegFunc)(_AtlBaseModule.m_hInst);
-
-
-
-		return hr;
-	}
-
-	HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = 0) throw()
-	{
-		(bUnRegTypeLib);
-		(pCLSID);
-
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-
-
-		if (_pPerfUnRegFunc != 0)
-			hr = (*_pPerfUnRegFunc)();
-
-
-
-
-
-		if (((HRESULT)(hr) >= 0))
-			hr = _AtlComModule.UnregisterServer(bUnRegTypeLib, pCLSID);
-
-
-
-		return hr;
-
-	}
-
-	static HRESULT __stdcall UpdateRegistryAppId(BOOL ) throw()
-	{
-		return ((HRESULT)0x00000000L);
-	}
-	HRESULT RegisterAppId() throw()
-	{
-		return T::UpdateRegistryAppId(1);
-	}
-
-	HRESULT UnregisterAppId() throw()
-	{
-		return T::UpdateRegistryAppId(0);
-	}
-
-	virtual HRESULT AddCommonRGSReplacements(IRegistrarBase* pRegistrar) throw()
-	{
-		return pRegistrar->AddReplacement(L"APPID", T::GetAppId());
-	}
-	static LPCOLESTR GetAppId() throw()
-	{
-		return L"";
-	}
-};
-
-
-
-
-
-
-
-
-
-
-
-
-template <class T>
-class __declspec(novtable) CAtlDllModuleT : public CAtlModuleT<T>
-{
-public :
-	CAtlDllModuleT() throw()
-	{
-		_AtlComModule.ExecuteObjectMain(true);
-
-
-
-
-
-
-
-
-
-	}
-
-	~CAtlDllModuleT() throw()
-	{
-
-
-
-
-
-
-
-
-		_AtlComModule.ExecuteObjectMain(false);
-	}
-
-    BOOL __stdcall DllMain(DWORD dwReason, LPVOID lpReserved) throw();
-
-	BOOL __stdcall _DllMain(DWORD dwReason, LPVOID ) throw()
-	{
-		if (dwReason == 1)
-		{
-			if (CAtlBaseModule::m_bInitFailed)
-			{
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3098, 0, L"0")) || (__debugbreak(), 0));
-				return 0;
-			}
-
-
-
-
-		}
-
-		else if (dwReason == 0)
-		{
-			
-			_AtlWinModule.Term();		
-		}
-
-		return 1;    
-	}
-
-	HRESULT DllCanUnloadNow() throw()
-	{
-		T* pT = static_cast<T*>(this);
-		return (pT->GetLockCount()==0) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-	}
-
-	HRESULT DllGetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
-	{
-		T* pT = static_cast<T*>(this);
-		return pT->GetClassObject(rclsid, riid, ppv);
-	}
-
-	HRESULT DllRegisterServer(BOOL bRegTypeLib = 1) throw()
-	{
-		LCID lcid = GetThreadLocale();
-		SetThreadLocale((((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x02)) << 10) | (WORD )(0x00))))))))));
-		
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = pT->RegisterAppId();
-		if (((HRESULT)(hr) >= 0))
-			hr = pT->RegisterServer(bRegTypeLib);
-		SetThreadLocale(lcid);
-		return hr;
-	}
-
-	HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = 1) throw()
-	{
-		LCID lcid = GetThreadLocale();
-		SetThreadLocale((((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x02)) << 10) | (WORD )(0x00))))))))));
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = pT->UnregisterServer(bUnRegTypeLib);
-		if (((HRESULT)(hr) >= 0))
-			hr = pT->UnregisterAppId();
-		SetThreadLocale(lcid);
-		return hr;
-	}
-
-	
-	HRESULT GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
-	{
-
-
-		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3158, 0, L"ppv != 0")) || (__debugbreak(), 0));
-
-
-		return AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
-	}
-};
-
-#pragma managed(push, off)
-
-template <class T>
-inline BOOL __stdcall CAtlDllModuleT<T>::DllMain(DWORD dwReason, LPVOID lpReserved) throw()
-{
-
-
-
-
-
-
-
-
-
-
-
-
-    return _DllMain(dwReason, lpReserved);
-
-}
-
-#pragma managed(pop)
-
-
-
-
-template <class T>
-class __declspec(novtable) CAtlExeModuleT : public CAtlModuleT<T>
-{
-public :
-
-
-	DWORD m_dwMainThreadID;
-	HANDLE m_hEventShutdown;
-	DWORD m_dwTimeOut;
-	DWORD m_dwPause;
-	bool m_bDelayShutdown;
-	bool m_bActivity;
-	bool m_bComInitialized;    
-
-
-
-	CAtlExeModuleT() throw()
-
-
-
-		: m_dwMainThreadID(::GetCurrentThreadId()),
-		m_dwTimeOut(5000),
-		m_dwPause(1000),
-		m_hEventShutdown(0),
-		m_bDelayShutdown(true),
-		m_bComInitialized(false)
-
-
-
-	{
-
-		HRESULT hr = T::InitializeCom();
-		if (((HRESULT)(hr) < 0))
-		{
-			
-			
-			if (hr != ((HRESULT)0x80010106L) || GetModuleHandleW(L"Mscoree.dll") == 0)
-			{
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3229, 0, L"0")) || (__debugbreak(), 0));
-				CAtlBaseModule::m_bInitFailed =	 true;
-				return;
-			}
-		}
-		else
-		{
-			m_bComInitialized = true;
-		}
-
-
-		_AtlComModule.ExecuteObjectMain(true);
-
-
-
-	}
-
-	~CAtlExeModuleT() throw()
-	{
-
-
-		_AtlComModule.ExecuteObjectMain(false);
-
-
-
-		
-		Term();
-
-
-
-		
-		_AtlComModule.Term();
-
-		if (m_bComInitialized)
-			T::UninitializeCom();
-
-	}
-
-	static HRESULT InitializeCom() throw()
-	{
-
-
-
-
-		return CoInitialize(0);
-
-	}
-
-	static void UninitializeCom() throw()
-	{
-		CoUninitialize();
-	}
-
-	LONG Unlock() throw()
-	{
-		LONG lRet = CComGlobalsThreadModel::Decrement(&m_nLockCnt);
-
-
-
-		if (lRet == 0)
-		{
-			if (m_bDelayShutdown)
-			{
-				m_bActivity = true;
-				::SetEvent(m_hEventShutdown); 
-			}
-			else
-			{
-				::PostThreadMessageW(m_dwMainThreadID, 0x0012, 0, 0);
-			}
-		}
-
-
-
-		return lRet;
-	}
-
-
-	void MonitorShutdown() throw()
-	{
-		while (1)
-		{
-			::WaitForSingleObject(m_hEventShutdown, 0xFFFFFFFF);
-			DWORD dwWait = 0;
-			do
-			{
-				m_bActivity = false;
-				dwWait = ::WaitForSingleObject(m_hEventShutdown, m_dwTimeOut);
-			} while (dwWait == ((((DWORD )0x00000000L) ) + 0 ));
-			
-			if (!m_bActivity && m_nLockCnt == 0) 
-			{
-
-
-
-
-					break;
-			}
-		}
-		::CloseHandle(m_hEventShutdown);
-		::PostThreadMessageW(m_dwMainThreadID, 0x0012, 0, 0);
-	}
-
-	HANDLE StartMonitor() throw()
-	{
-		m_hEventShutdown = ::CreateEventW(0, false, false, 0);
-		if (m_hEventShutdown == 0)
-        {
-			return 0;
-        }
-		DWORD dwThreadID;
-		HANDLE hThread = ::CreateThread(0, 0, MonitorProc, this, 0, &dwThreadID);
-        if(hThread==0)
-        {
-    		::CloseHandle(m_hEventShutdown);
-        }
-		return hThread;
-	}
-
-	static DWORD __stdcall MonitorProc(void* pv) throw()
-	{
-		CAtlExeModuleT<T>* p = static_cast<CAtlExeModuleT<T>*>(pv);
-		p->MonitorShutdown();
-		return 0;
-	}
-
-
-	int WinMain(int nShowCmd) throw()
-	{
-		if (CAtlBaseModule::m_bInitFailed)
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3360, 0, L"0")) || (__debugbreak(), 0));
-			return -1;
-		}
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-		LPTSTR lpCmdLine = GetCommandLineW(); 
-		if (pT->ParseCommandLine(lpCmdLine, &hr) == true)
-			hr = pT->Run(nShowCmd);
-
-
-		
-		_AtlWinModule.Term();		
-
-		return hr;
-	}
-
-	
-	
-
-	
-	bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw()
-	{
-		*pnRetCode = ((HRESULT)0x00000000L);
-
-		TCHAR szTokens[] = L"-/";
-
-		T* pT = static_cast<T*>(this);
-		LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
-		while (lpszToken != 0)
-		{
-			if (WordCmpI(lpszToken, L"UnregServer")==0)
-			{
-				*pnRetCode = pT->UnregisterServer(1);
-				if (((HRESULT)(*pnRetCode) >= 0))
-					*pnRetCode = pT->UnregisterAppId();
-				return false;
-			}
-
-			
-			if (WordCmpI(lpszToken, L"RegServer")==0)
-			{
-				*pnRetCode = pT->RegisterAppId();
-				if (((HRESULT)(*pnRetCode) >= 0))
-					*pnRetCode = pT->RegisterServer(1);
-				return false;
-			}
-
-			lpszToken = FindOneOf(lpszToken, szTokens);
-		}
-
-		return true;
-	}
-
-	HRESULT PreMessageLoop(int ) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		T* pT = static_cast<T*>(this);
-		pT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
-			REGCLS_MULTIPLEUSE);
-		if (hr == ((HRESULT)0x00000000L))
-		{
-			if (m_bDelayShutdown && !pT->StartMonitor())
-			{
-				hr = ((HRESULT)0x80004005L);
-			}
-		}
-		else
-		{
-			m_bDelayShutdown = false;
-		}
-
-
-
-
-
-
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3485, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		return hr;
-	}
-
-	HRESULT PostMessageLoop() throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-
-
-		T* pT = static_cast<T*>(this);
-		hr = pT->RevokeClassObjects();
-		if (m_bDelayShutdown)
-			Sleep(m_dwPause); 
-
-
-
-		return hr;
-	}
-
-	void RunMessageLoop() throw()
-	{
-		MSG msg;
-		while (GetMessageW(&msg, 0, 0, 0) > 0)
-		{
-			TranslateMessage(&msg);
-			DispatchMessageW(&msg);
-		}
-	}
-
-	HRESULT Run(int nShowCmd = 0) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-		T* pT = static_cast<T*>(this);
-		hr = pT->PreMessageLoop(nShowCmd);
-
-		
-		if (hr == ((HRESULT)0x00000000L))
-		{
-			pT->RunMessageLoop();
-		}
-
-		
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = pT->PostMessageLoop();
-		}
-
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3534, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		return hr;
-	}
-
-	
-	HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
-	{
-		return AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
-	}
-	HRESULT RevokeClassObjects() throw()
-	{
-		return AtlComModuleRevokeClassObjects(&_AtlComModule);
-	}
-};
-
-
-template <class T, UINT nServiceNameID>
-class __declspec(novtable) CAtlServiceModuleT : public CAtlExeModuleT<T>
-{
-public :
-
-	CAtlServiceModuleT() throw()
-	{
-		m_bService = 1;
-		LoadStringW(_AtlBaseModule.GetModuleInstance(), nServiceNameID, m_szServiceName, sizeof(m_szServiceName) / sizeof(TCHAR));
-
-		
-		m_hServiceStatus = 0;
-		m_status.dwServiceType = 0x00000010;
-		m_status.dwCurrentState = 0x00000001;
-		m_status.dwControlsAccepted = 0x00000001;
-		m_status.dwWin32ExitCode = 0;
-		m_status.dwServiceSpecificExitCode = 0;
-		m_status.dwCheckPoint = 0;
-		m_status.dwWaitHint = 0;
-	}
-
-	int WinMain(int nShowCmd) throw()
-	{
-		if (CAtlBaseModule::m_bInitFailed)
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3575, 0, L"0")) || (__debugbreak(), 0));
-			return -1;
-		}
-
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-		LPTSTR lpCmdLine = GetCommandLineW(); 
-		if (pT->ParseCommandLine(lpCmdLine, &hr) == true)
-			hr = pT->Start(nShowCmd);
-
-
-		
-		_AtlWinModule.Term();		
-
-		return hr;
-	}
-
-	HRESULT Start(int nShowCmd) throw()
-	{
-		T* pT = static_cast<T*>(this);
-		
-		CRegKey keyAppID;
-		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))));
-		if (lRes != 0L)
-		{
-			m_status.dwWin32ExitCode = lRes;
-			return m_status.dwWin32ExitCode;
-		}
-
-		CRegKey key;
-		lRes = key.Open(keyAppID, pT->GetAppIdT(), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))));
-		if (lRes != 0L)
-		{
-			m_status.dwWin32ExitCode = lRes;
-			return m_status.dwWin32ExitCode;
-		}
-
-		TCHAR szValue[260];
-		DWORD dwLen = 260;
-		lRes = key.QueryStringValue(L"LocalService", szValue, &dwLen);
-
-		m_bService = 0;
-		if (lRes == 0L)
-			m_bService = 1;
-
-		if (m_bService)
-		{
-			SERVICE_TABLE_ENTRY st[] =
-			{
-				{ m_szServiceName, _ServiceMain },
-				{ 0, 0 }
-			};
-			if (::StartServiceCtrlDispatcherW(st) == 0)
-				m_status.dwWin32ExitCode = GetLastError();
-			return m_status.dwWin32ExitCode;
-		}
-		
-		
-		m_status.dwWin32ExitCode = pT->Run(nShowCmd);
-		return m_status.dwWin32ExitCode;
-	}
-
-	inline HRESULT RegisterAppId(bool bService = false) throw()
-	{
-		if (!Uninstall())
-			return ((HRESULT)0x80004005L);
-
-		HRESULT hr = T::UpdateRegistryAppId(1);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		CRegKey keyAppID;
-		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRes != 0L)
-			return AtlHresultFromWin32(lRes);
-
-		CRegKey key;
-
-		lRes = key.Create(keyAppID, T::GetAppIdT());
-		if (lRes != 0L)
-			return AtlHresultFromWin32(lRes);
-
-		key.DeleteValue(L"LocalService");
-
-		if (!bService)
-			return ((HRESULT)0x00000000L);
-
-		key.SetStringValue(L"LocalService", m_szServiceName);
-
-		
-		if (!Install())
-			return ((HRESULT)0x80004005L);
-		return ((HRESULT)0x00000000L);
-	}
-
-	HRESULT UnregisterAppId() throw()
-	{
-		if (!Uninstall())
-			return ((HRESULT)0x80004005L);
-		
-		CRegKey keyAppID;
-		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRes != 0L)
-			return AtlHresultFromWin32(lRes);
-
-		CRegKey key;
-		lRes = key.Open(keyAppID, T::GetAppIdT(), ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRes != 0L)
-			return AtlHresultFromWin32(lRes);
-		key.DeleteValue(L"LocalService");
-
-		return T::UpdateRegistryAppId(0);
-	}
-
-	
-	bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw()
-	{
-		if (!CAtlExeModuleT<T>::ParseCommandLine(lpCmdLine, pnRetCode))
-			return false;
-
-		TCHAR szTokens[] = L"-/";
-		*pnRetCode = ((HRESULT)0x00000000L);
-
-		T* pT = static_cast<T*>(this);
-		LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
-		while (lpszToken != 0)
-		{
-			if (WordCmpI(lpszToken, L"Service")==0)
-			{
-				*pnRetCode = pT->RegisterAppId(true);
-				if (((HRESULT)(*pnRetCode) >= 0))
-					*pnRetCode = pT->RegisterServer(1);
-				return false;
-			}
-			lpszToken = FindOneOf(lpszToken, szTokens);
-		}
-		return true;
-	}
-
-	void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw()
-	{
-		lpszArgv;
-		dwArgc;
-		
-		m_status.dwCurrentState = 0x00000002;
-		m_hServiceStatus = RegisterServiceCtrlHandlerW(m_szServiceName, _Handler);
-		if (m_hServiceStatus == 0)
-		{
-			LogEvent(L"Handler not installed");
-			return;
-		}
-		SetServiceStatus(0x00000002);
-
-		m_status.dwWin32ExitCode = ((HRESULT)0x00000000L);
-		m_status.dwCheckPoint = 0;
-		m_status.dwWaitHint = 0;
-
-		T* pT = static_cast<T*>(this);
-
-
-		HRESULT hr = ((HRESULT)0x80004005L);
-		hr = T::InitializeCom();
-		if (((HRESULT)(hr) < 0))
-		{
-			
-			
-			if (hr != ((HRESULT)0x80010106L) || GetModuleHandleW(L"Mscoree.dll") == 0)
-			{
-				return;
-			}
-		}
-		else
-		{
-			m_bComInitialized = true;
-		}
-
-		m_bDelayShutdown = false;
-
-		
-		m_status.dwWin32ExitCode = pT->Run(0);
-
-
-		if (m_bService && m_bComInitialized)
-			T::UninitializeCom();
-
-
-		SetServiceStatus(0x00000001);
-		LogEvent(L"Service stopped");
-	}
-
-	HRESULT Run(int nShowCmd = 0) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		T* pT = static_cast<T*>(this);
-
-		hr = pT->PreMessageLoop(nShowCmd);
-
-		if (hr == ((HRESULT)0x00000000L))
-		{
-			if (m_bService)
-			{
-				LogEvent(L"Service started");
-				SetServiceStatus(0x00000004);
-			}
-
-			pT->RunMessageLoop();
-		}
-
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = pT->PostMessageLoop();
-		}
-
-		return hr;
-	}
-
-	HRESULT PreMessageLoop(int nShowCmd) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_bService)
-		{
-			m_dwThreadID = GetCurrentThreadId();
-
-			T* pT = static_cast<T*>(this);
-			hr = pT->InitializeSecurity();
-
-			if (((HRESULT)(hr) < 0))
-				return hr;
-		}
-
-		hr = CAtlExeModuleT<T>::PreMessageLoop(nShowCmd);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		return hr;
-	}
-
-	void OnStop() throw()
-	{
-		SetServiceStatus(0x00000003);
-		PostThreadMessageW(m_dwThreadID, 0x0012, 0, 0);
-	}
-
-	void OnPause() throw()
-	{
-	}
-
-	void OnContinue() throw()
-	{
-	}
-
-	void OnInterrogate() throw()
-	{
-	}
-
-	void OnShutdown() throw()
-	{
-	}
-
-	void OnUnknownRequest(DWORD ) throw()
-	{
-		LogEvent(L"Bad service request");	
-	}
-
-	void Handler(DWORD dwOpcode) throw()
-	{
-		T* pT = static_cast<T*>(this);
-
-		switch (dwOpcode)
-		{
-		case 0x00000001:
-			pT->OnStop();
-			break;
-		case 0x00000002:
-			pT->OnPause();
-			break;
-		case 0x00000003:
-			pT->OnContinue();
-			break;
-		case 0x00000004:
-			pT->OnInterrogate();
-			break;
-		case 0x00000005:
-			pT->OnShutdown();
-			break;
-		default:
-			pT->OnUnknownRequest(dwOpcode);
-		}
-	}
-
-	BOOL IsInstalled() throw()
-	{
-		BOOL bResult = 0;
-
-		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));
-
-		if (hSCM != 0)
-		{
-			SC_HANDLE hService = ::OpenServiceW(hSCM, m_szServiceName, 0x0001);
-			if (hService != 0)
-			{
-				bResult = 1;
-				::CloseServiceHandle(hService);
-			}
-			::CloseServiceHandle(hSCM);
-		}
-		return bResult;
-	}
-	BOOL Install() throw()
-	{
-		if (IsInstalled())
-			return 1;
-
-		
-		TCHAR szFilePath[260 + 2];
-		DWORD dwFLen = ::GetModuleFileNameW(0, szFilePath + 1, 260);
-		if( dwFLen == 0 || dwFLen == 260 )
-			return 0;
-
-		
-		szFilePath[0] = L'\"';
-		szFilePath[dwFLen + 1] = L'\"';
-		szFilePath[dwFLen + 2] = 0;
-        
-		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));
-		if (hSCM == 0)
-		{
-			TCHAR szBuf[1024];
-			if (AtlLoadString((0xD800 + 10), szBuf, 1024) == 0)
-
-				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open Service Manager");
-
-
-
-			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			return 0;
-		}
-
-		SC_HANDLE hService = ::CreateServiceW(
-			hSCM, m_szServiceName, m_szServiceName,
-			((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 | 0x0100), 0x00000010,
-			0x00000003, 0x00000001,
-			szFilePath, 0, 0, L"RPCSS\0", 0, 0);
-
-		if (hService == 0)
-		{
-			::CloseServiceHandle(hSCM);
-			TCHAR szBuf[1024];
-			if (AtlLoadString((0xD800 + 11), szBuf, 1024) == 0)
-
-				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not start service");
-
-
-
-			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			return 0;
-		}
-
-		::CloseServiceHandle(hService);
-		::CloseServiceHandle(hSCM);
-		return 1;
-	}
-
-	BOOL Uninstall() throw()
-	{
-		if (!IsInstalled())
-			return 1;
-
-		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));
-
-		if (hSCM == 0)
-		{
-			TCHAR szBuf[1024];
-			if (AtlLoadString((0xD800 + 10), szBuf, 1024) == 0)
-
-				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open Service Manager");
-
-
-
-			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			return 0;
-		}
-
-		SC_HANDLE hService = ::OpenServiceW(hSCM, m_szServiceName, 0x0020 | (0x00010000L));
-
-		if (hService == 0)
-		{
-			::CloseServiceHandle(hSCM);
-			TCHAR szBuf[1024];
-			if (AtlLoadString((0xD800 + 12), szBuf, 1024) == 0)
-
-				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open service");
-
-
-
-			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			return 0;
-		}
-		SERVICE_STATUS status;
-		BOOL bRet = ::ControlService(hService, 0x00000001, &status);
-		if (!bRet)
-		{
-			DWORD dwError = GetLastError();
-			if (!((dwError == 1062L) ||  (dwError == 1061L && status.dwCurrentState == 0x00000003)))
-			{
-				TCHAR szBuf[1024];
-				if (AtlLoadString((0xD800 + 14), szBuf, 1024) == 0)
-
-					Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not stop service");
-
-
-
-				MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			}
-		}
-
-
-		BOOL bDelete = ::DeleteService(hService);
-		::CloseServiceHandle(hService);
-		::CloseServiceHandle(hSCM);
-
-		if (bDelete)
-			return 1;
-
-		TCHAR szBuf[1024];
-		if (AtlLoadString((0xD800 + 13), szBuf, 1024) == 0)
-
-			Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not delete service");
-
-
-
-		MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-		return 0;
-	}
-
-	LONG Unlock() throw()
-	{
-		LONG lRet;
-		if (m_bService)
-		{
-			
-			
-			lRet = CAtlModuleT<T>::Unlock();
-		}
-		else
-		{
-			
-			lRet = CAtlExeModuleT<T>::Unlock();
-		}
-		return lRet;
-	}
-
-	void LogEventEx(int id, LPCTSTR pszMessage=0, WORD type = 0x0004) throw()
-	{
-		HANDLE hEventSource;
-		if (m_szServiceName)
-		{
-			
-			hEventSource = RegisterEventSourceW(0, m_szServiceName);
-			if (hEventSource != 0)
-			{
-				
-				ReportEventW(hEventSource, 
-							type,
-							(WORD)0,
-							id,
-							0,
-							(WORD)(pszMessage != 0 ? 1 : 0),
-							0,
-							pszMessage != 0 ? &pszMessage : 0,
-							0);
-				DeregisterEventSource(hEventSource);
-			}
-		}
-	}
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl LogEvent(LPCTSTR pszFormat, ...) throw()
-	{
-		const int LOG_EVENT_MSG_SIZE = 256;
-		
-		TCHAR chMsg[LOG_EVENT_MSG_SIZE];
-		HANDLE hEventSource;
-		LPTSTR lpszStrings[1];
-		va_list pArg;
-		
-		( pArg = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-
-		_vsnwprintf_s(chMsg, LOG_EVENT_MSG_SIZE, LOG_EVENT_MSG_SIZE-1, pszFormat, pArg);
-
-
-
-		( pArg = (va_list)0 );
-
-		chMsg[LOG_EVENT_MSG_SIZE - 1] = 0;
-		
-		lpszStrings[0] = chMsg;
-
-		if (!m_bService)
-		{
-			
-			
-			_putws(chMsg);
-		}
-
-		
-		hEventSource = RegisterEventSourceW(0, m_szServiceName);
-		if (hEventSource != 0)
-		{
-			
-			ReportEventW(hEventSource, 0x0004, 0, 0, 0, 1, 0, (LPCTSTR*) &lpszStrings[0], 0);
-			DeregisterEventSource(hEventSource);
-		}
-	}
-#pragma warning(pop)
-
-	void SetServiceStatus(DWORD dwState) throw()
-	{
-		m_status.dwCurrentState = dwState;
-		::SetServiceStatus(m_hServiceStatus, &m_status);
-	}
-
-
-protected:
-	static void __stdcall _ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw()
-	{
-		((T*)_pAtlModule)->ServiceMain(dwArgc, lpszArgv);
-	}
-	static void __stdcall _Handler(DWORD dwOpcode) throw()
-	{
-		((T*)_pAtlModule)->Handler(dwOpcode); 
-	}
-
-
-public:
-	TCHAR m_szServiceName[256];
-	SERVICE_STATUS_HANDLE m_hServiceStatus;
-	SERVICE_STATUS m_status;
-	BOOL m_bService;
-	DWORD m_dwThreadID;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class CComModule;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(selectany) CComModule* _pModule = 0;
-class CComModule : public CAtlModuleT<CComModule>
-{
-public :
-
-	CComModule()
-	{
-		
-		
-		(void) ((!!((_pModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4232, 0, L"_pModule == 0")) || (__debugbreak(), 0));
-		_pModule = this;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	}
-
-	~CComModule()
-	{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	}
-
-	__declspec(property(get = get_m_hInst)) HINSTANCE m_hInst;
-	HINSTANCE& get_m_hInst() const throw()
-	{
-		return _AtlBaseModule.m_hInst;
-	}
-
-	__declspec(property(get = get_m_hInstResource, put = put_m_hInstResource)) HINSTANCE m_hInstResource;
-	HINSTANCE& get_m_hInstResource() const throw()
-	{
-		return _AtlBaseModule.m_hInstResource;
-	}
-	void put_m_hInstResource(HINSTANCE h) throw()
-	{
-		_AtlBaseModule.SetResourceInstance(h);
-	}
-	HINSTANCE SetResourceInstance(HINSTANCE h) throw()
-	{
-		return _AtlBaseModule.SetResourceInstance(h);
-	}
-
-	HINSTANCE GetModuleInstance() throw()
-	{
-		return _AtlBaseModule.m_hInst;
-	}
-	HINSTANCE GetResourceInstance() throw()
-	{
-		return _AtlBaseModule.m_hInstResource;
-	}
-
-	__declspec(property(get = get_m_hInstTypeLib, put = put_m_hInstTypeLib)) HINSTANCE m_hInstTypeLib;
-	HINSTANCE& get_m_hInstTypeLib() const throw()
-	{
-		return _AtlComModule.m_hInstTypeLib;
-	}
-	void put_m_hInstTypeLib(HINSTANCE h) throw()
-	{
-		_AtlComModule.m_hInstTypeLib = h;
-	}
-
-	HINSTANCE GetTypeLibInstance() const throw()
-	{
-		return _AtlComModule.m_hInstTypeLib;
-	}
-
-	
-	_ATL_OBJMAP_ENTRY* m_pObjMap;
-
-	__declspec(property(get  = get_m_csWindowCreate)) CRITICAL_SECTION m_csWindowCreate;
-	CRITICAL_SECTION& get_m_csWindowCreate() throw();
-
-	__declspec(property(get  = get_m_csObjMap)) CRITICAL_SECTION m_csObjMap;
-	CRITICAL_SECTION& get_m_csObjMap() throw();
-
-	__declspec(property(get  = get_m_csStaticDataInit)) CRITICAL_SECTION m_csTypeInfoHolder;
-	__declspec(property(get  = get_m_csStaticDataInit)) CRITICAL_SECTION m_csStaticDataInit;
-	CRITICAL_SECTION& get_m_csStaticDataInit() throw();
-	void EnterStaticDataCriticalSection() throw()
-	{
-		EnterCriticalSection(&m_csStaticDataInit);
-	}
-
-	void LeaveStaticDataCriticalSection() throw()
-	{
-		LeaveCriticalSection(&m_csStaticDataInit);
-	}
-
-	__declspec(property(get  = get_dwAtlBuildVer)) DWORD dwAtlBuildVer;
-	DWORD& get_dwAtlBuildVer() throw()
-	{
-		return _AtlBaseModule.dwAtlBuildVer;
-	}
-
-	__declspec(property(get  = get_m_pCreateWndList, put = put_m_pCreateWndList)) _AtlCreateWndData* m_pCreateWndList;
-	_AtlCreateWndData*& get_m_pCreateWndList() throw();
-	void put_m_pCreateWndList(_AtlCreateWndData* p) throw();
-
-	__declspec(property(get  = get_pguidVer)) const GUID* pguidVer;
-	const GUID*& get_pguidVer() throw()
-	{
-		return _AtlBaseModule.pguidVer;
-	}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = 0) throw();
-	void Term() throw();
-
-	HRESULT GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw();
-	
-	HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw();
-	HRESULT RevokeClassObjects() throw();
-	
-	HRESULT RegisterTypeLib() throw();
-	HRESULT RegisterTypeLib(LPCTSTR lpszIndex) throw();
-	HRESULT UnRegisterTypeLib() throw();
-	HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex) throw();
-	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0) throw();
-	HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = 0) throw();
-	HRESULT UnregisterServer(const CLSID* pCLSID = 0) throw();
-
-	void AddCreateWndData(_AtlCreateWndData* pData, void* pObject) throw()
-	{
-		_AtlWinModule.AddCreateWndData(pData, pObject);
-	}
-
-	void* ExtractCreateWndData() throw()
-	{
-		return _AtlWinModule.ExtractCreateWndData();
-	}
-
-	
-	HRESULT CreateInstance(void* , const IID & , void** ) throw()	
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4400, 0, L"0")) || (__debugbreak(), 0));
-		do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4401)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"CComModule::CreateInstance"); return ((HRESULT)0x80004001L); } while(0);
-	}
-
-	HRESULT RegisterAppId(LPCTSTR pAppId);
-	HRESULT UnregisterAppId(LPCTSTR pAppId);
-
-	
-	virtual HRESULT __stdcall UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-
-
-
-
-
-
-		return CAtlModuleT<CComModule>::UpdateRegistryFromResourceD(lpszRes, bRegister, pMapEntries);		
-
-	}
-	virtual HRESULT __stdcall UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-
-
-
-
-
-
-		return CAtlModuleT<CComModule>::UpdateRegistryFromResourceD(nResID, bRegister, pMapEntries);
-
-	}
-
-
-	
-	virtual HRESULT __stdcall UpdateRegistryFromResourceS(LPCTSTR lpszRes, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-
-
-
-		(lpszRes);
-		(bRegister);
-		(pMapEntries);
-		return ((HRESULT)0x80004005L);
-
-	}
-	virtual HRESULT __stdcall UpdateRegistryFromResourceS(UINT nResID, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-
-
-
-		(nResID);
-		(bRegister);
-		(pMapEntries);
-		return ((HRESULT)0x80004005L);
-
-	}
-
-
-	
-
-	__declspec( deprecated("CComModule::RegisterProgID is no longer recommended. Instead, use an RGS file for registration.") )
-	static HRESULT RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc);
-	
-	__declspec( deprecated("CComModule::UpdateRegistryClass is no longer recommended. Instead, use an RGS file for registration.") )
-	HRESULT __stdcall UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister);
-	__declspec( deprecated("CComModule::UpdateRegistryClass is no longer recommended. Instead, use an RGS file for registration.") )
-	HRESULT __stdcall UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags, BOOL bRegister);
-	__declspec( deprecated("CComModule::RegisterClassHelper is no longer recommended. Instead, use an RGS file for registration.") )
-	HRESULT __stdcall RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags);
-	__declspec( deprecated("CComModule::UnregisterClassHelper is no longer recommended. Instead, use an RGS file for registration.") )
-	HRESULT __stdcall UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID);
-
-    BOOL __stdcall DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID , _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID);
-
-	BOOL __stdcall _DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID , _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID)
-	{
-		if (dwReason == 1)
-		{
-			if (CAtlBaseModule::m_bInitFailed)
-			{
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4483, 0, L"0")) || (__debugbreak(), 0));
-				return 0;
-			}
-
-			if (((HRESULT)(Init(pObjMap, hInstance, pLibID)) < 0))
-			{
-				Term();
-				return 0;
-			}
-
-
-
-		}
-		else if (dwReason == 0)
-			Term();
-		return 1;    
-	}
-
-	HRESULT DllCanUnloadNow()  throw()
-	{
-		return (GetLockCount()==0) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-	}
-	HRESULT DllGetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv)  throw()
-	{
-		return GetClassObject(rclsid, riid, ppv);
-	}
-
-	HRESULT DllRegisterServer(BOOL bRegTypeLib = 1)  throw()
-	{
-		
-		return RegisterServer(bRegTypeLib);
-	}
-
-	HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = 1)  throw()
-	{
-		return UnregisterServer(bUnRegTypeLib);
-	}
-
-};
-
-#pragma managed(push, off)
-inline BOOL __stdcall CComModule::DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved, _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID)
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-    return _DllMain(hInstance, dwReason, lpReserved, pObjMap, pLibID);
-
-}
-#pragma managed(pop)
-
-
-
-
-
-
-
-
-
-
-
-class CRTThreadTraits
-{
-public:
-	static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw()
-	{
-		(void) ((!!((sizeof(DWORD) == sizeof(unsigned int)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4559, 0, L"sizeof(DWORD) == sizeof(unsigned int)")) || (__debugbreak(), 0)); 
-
-		
-		return (HANDLE) _beginthreadex(lpsa, dwStackSize, (unsigned int (__stdcall *)(void *)) pfnThreadProc, pvParam, dwCreationFlags, (unsigned int *) pdwThreadId);
-	}
-};
-
-
-
-
-
-
-
-class Win32ThreadTraits
-{
-public:
-	static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw()
-	{
-		return ::CreateThread(lpsa, dwStackSize, pfnThreadProc, pvParam, dwCreationFlags, pdwThreadId);
-	}
-};
-
-
-	typedef CRTThreadTraits DefaultThreadTraits;
-
-
-
-
-template <typename T>
-HANDLE CreateThreadT(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, DWORD (__stdcall * pfn)(T *pparam), 
-					 T *pparam, DWORD dwCreationFlags, LPDWORD pdw)
-{
-	return DefaultThreadTraits::CreateThread(lpsa, 
-		dwStackSize, 
-		(LPTHREAD_START_ROUTINE)pfn, 
-		pparam, 
-		dwCreationFlags, 
-		pdw);
-}
-
-template <typename T>
-HANDLE AtlCreateThread(DWORD (__stdcall* pfn)(T *pparam), T *pparam)
-{
-	return CreateThreadT(0, 0, pfn, pparam, 0, 0);
-}
-
-
-
-
-class _AtlAptCreateObjData
-{
-public:
-	_ATL_CREATORFUNC* pfnCreateInstance;
-	const IID* piid;
-	HANDLE hEvent;
-	LPSTREAM pStream;
-	HRESULT hRes;
-};
-
-class CComApartment
-{
-public:
-	CComApartment()
-	{
-		m_nLockCnt = 0;
-		m_hThread = 0;
-	}
-	static UINT ATL_CREATE_OBJECT;
-	static DWORD __stdcall _Apartment(     void* pv)
-	{
-		do { int __atl_condVal=!!(pv != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4629, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		return ((CComApartment*)pv)->Apartment();
-	}
-	DWORD Apartment()
-	{
-		CoInitialize(0);
-		MSG msg;
-		while(GetMessageW(&msg, 0, 0, 0) > 0)
-		{
-			if (msg.message == ATL_CREATE_OBJECT)
-			{
-				_AtlAptCreateObjData* pdata = (_AtlAptCreateObjData*)msg.lParam;
-				IUnknown* pUnk = 0;
-				pdata->hRes = pdata->pfnCreateInstance(0, __uuidof(IUnknown), (void**)&pUnk);
-				if (((HRESULT)(pdata->hRes) >= 0))
-					pdata->hRes = CoMarshalInterThreadInterfaceInStream(*pdata->piid, pUnk, &pdata->pStream);
-				if (((HRESULT)(pdata->hRes) >= 0))
-				{
-					pUnk->Release();
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4648)(atlTraceCOM, 2, L"Object created on thread = %d\n", GetCurrentThreadId());
-				}
-
-				else
-				{
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4653)(atlTraceCOM, 2, L"Failed to create Object on thread = %d\n", GetCurrentThreadId());
-				}
-
-				SetEvent(pdata->hEvent);
-			}
-			DispatchMessageW(&msg);
-		}
-		CoUninitialize();
-
-		return 0;
-	}
-	LONG Lock() {return CComGlobalsThreadModel::Increment(&m_nLockCnt);}
-	LONG Unlock(){return CComGlobalsThreadModel::Decrement(&m_nLockCnt);
-	}
-	LONG GetLockCount() {return m_nLockCnt;}
-
-	DWORD m_dwThreadID;
-	HANDLE m_hThread;
-	LONG m_nLockCnt;
-};
-
-__declspec(selectany) UINT CComApartment::ATL_CREATE_OBJECT = 0;
-
-class CComSimpleThreadAllocator
-{
-public:
-	CComSimpleThreadAllocator()
-	{
-		m_nThread = 0;
-	}
-	int GetThread(CComApartment* , int nThreads)
-	{
-		if (++m_nThread == nThreads)
-			m_nThread = 0;
-		return m_nThread;
-	}
-	int m_nThread;
-};
-
-__interface IAtlAutoThreadModule
-{
-	virtual HRESULT CreateInstance(void* pfnCreateInstance, const IID & riid, void** ppvObj);
-};
-
-__declspec(selectany) IAtlAutoThreadModule* _pAtlAutoThreadModule;
-
-template <class T, class ThreadAllocator = CComSimpleThreadAllocator, DWORD dwWait = 0xFFFFFFFF>
-class __declspec(novtable) CAtlAutoThreadModuleT : public IAtlAutoThreadModule
-{
-
-
-
-public:
-	CAtlAutoThreadModuleT(int nThreads = T::GetDefaultThreads())
-	{
-		(void) ((!!((_pAtlAutoThreadModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4708, 0, L"_pAtlAutoThreadModule == 0")) || (__debugbreak(), 0));
-		_pAtlAutoThreadModule = this;
-		m_pApartments = 0;
-		m_nThreads= 0;
-
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_pApartments = new CComApartment[nThreads];} catch(...) {} __pragma(warning(pop));
-		(void) ((!!((m_pApartments != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4714, 0, L"m_pApartments != 0")) || (__debugbreak(), 0));
-		if(m_pApartments == 0)
-		{
-			CAtlBaseModule::m_bInitFailed = true;
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4718, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		}
-
-		memset(m_pApartments, 0, sizeof(CComApartment) * nThreads);
-
-		m_nThreads = nThreads;
-		for (int i = 0; i < nThreads; i++)
-		{
-
-
-			typedef unsigned ( __stdcall *pfnThread )( void * );
-			errno_t save_errno = Checked::get_errno();
-			Checked::set_errno(0);
-			m_pApartments[i].m_hThread = (HANDLE)_beginthreadex(0, 0, (pfnThread)CComApartment::_Apartment, &m_pApartments[i], 0, (UINT*)&m_pApartments[i].m_dwThreadID);
-			if (m_pApartments[i].m_hThread == 0)
-			{
-				HRESULT hr = ((HRESULT)0x80004005L);
-				
-				switch (Checked::get_errno())
-				{
-				case 11:
-					hr = ((HRESULT)(155L) <= 0 ? ((HRESULT)(155L)) : ((HRESULT) (((155L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-					break;
-				case 22:
-					hr = ((HRESULT)0x80070057L);
-					break;
-				}
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4745, 0, L"0")) || (__debugbreak(), 0));
-				CAtlBaseModule::m_bInitFailed = true;
-				break;
-			}
-			Checked::set_errno(save_errno);
-
-
-
-
-
-
-
-
-
-
-
-
-
-		}
-		if (!CAtlBaseModule::m_bInitFailed)
-			CComApartment::ATL_CREATE_OBJECT = RegisterWindowMessageW(L"ATL_CREATE_OBJECT");
-	}
-
-	virtual ~CAtlAutoThreadModuleT()
-	{
-		if (m_pApartments == 0)
-			return;
-
-		DWORD dwCurrentThreadId = GetCurrentThreadId();
-		int nCurrentThread = -1;
-		for (int i=0; i < m_nThreads; i++)
-		{
-			if (m_pApartments[i].m_hThread == 0)
-				continue;
-			if (m_pApartments[i].m_dwThreadID == dwCurrentThreadId)
-			{
-				nCurrentThread = i;
-				continue;
-			}
-			while (::PostThreadMessageW(m_pApartments[i].m_dwThreadID, 0x0012, 0, 0) == 0)
-			{
-				if (GetLastError() == 1444L)
-				{
-					(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4788, 0, L"0")) || (__debugbreak(), 0));
-					break;
-				}
-				::Sleep(100);
-			}
-			::WaitForSingleObject(m_pApartments[i].m_hThread, dwWait);
-			CloseHandle(m_pApartments[i].m_hThread);
-		}
-		if (nCurrentThread != -1)
-			CloseHandle(m_pApartments[nCurrentThread].m_hThread);
-
-		delete [] m_pApartments;
-		m_pApartments = 0;
-	}
-
-	HRESULT CreateInstance(void* pfnCreateInstance, const IID & riid, void** ppvObj)
-	{
-		(void) ((!!((ppvObj != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4805, 0, L"ppvObj != 0")) || (__debugbreak(), 0));
-		if (ppvObj == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObj = 0;
-
-		_ATL_CREATORFUNC* pFunc = (_ATL_CREATORFUNC*) pfnCreateInstance;
-		_AtlAptCreateObjData data;
-		data.pfnCreateInstance = pFunc;
-		data.piid = &riid;
-		data.hEvent = CreateEventW(0, 0, 0, 0);
-		data.hRes = ((HRESULT)0x00000000L);
-		int nThread = m_Allocator.GetThread(m_pApartments, m_nThreads);
-		int nIterations = 0;
-		while(::PostThreadMessageW(m_pApartments[nThread].m_dwThreadID, CComApartment::ATL_CREATE_OBJECT, 0, (LPARAM)&data) == 0 && ++nIterations < 100)
-		{
-			Sleep(100);
-		}
-		if (nIterations < 100)
-		{
-			AtlWaitWithMessageLoop(data.hEvent);
-		}
-		else
-		{
-			data.hRes = AtlHresultFromLastError();
-		}
-		CloseHandle(data.hEvent);
-		if (((HRESULT)(data.hRes) >= 0))
-			data.hRes = CoGetInterfaceAndReleaseStream(data.pStream, riid, ppvObj);
-		return data.hRes;
-	}
-	DWORD dwThreadID;
-	int m_nThreads;
-	CComApartment* m_pApartments;
-	ThreadAllocator m_Allocator;
-	static int GetDefaultThreads()
-	{
-		SYSTEM_INFO si;
-		GetSystemInfo(&si);
-		return si.dwNumberOfProcessors * 4;
-	}
-};
-
-class CAtlAutoThreadModule : public CAtlAutoThreadModuleT<CAtlAutoThreadModule>
-{
-public :
-};
-
-
-
-template <class ThreadAllocator = CComSimpleThreadAllocator, DWORD dwWait = 0xFFFFFFFF>
-class CComAutoThreadModule : 
-	public CComModule,
-	public CAtlAutoThreadModuleT<CComAutoThreadModule<ThreadAllocator,dwWait>, ThreadAllocator, dwWait>
-{
-public:
-	CComAutoThreadModule(int nThreads = GetDefaultThreads()) :
-		CAtlAutoThreadModuleT<CComAutoThreadModule<ThreadAllocator,dwWait>, ThreadAllocator, dwWait>(nThreads)
-	{
-	}
-	HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = 0, int nThreads = GetDefaultThreads())
-	{
-		nThreads;
-		(void) ((!!((nThreads == GetDefaultThreads() && L"Set number of threads through the constructor"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4867, 0, L"nThreads == GetDefaultThreads() && L\"Set number of threads through the constructor\"")) || (__debugbreak(), 0));
-		return CComModule::Init(p, h, plibid);
-	}
-};
-
-
-
-
-class Win32WaitTraits
-{
-public:
-	static DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwTimeout)
-	{
-		return ::WaitForSingleObject(hHandle, dwTimeout);
-	}
-};
-
-typedef Win32WaitTraits DefaultWaitTraits;
-
-
-
-
-template <class T>
-class CComGITPtr
-{
-public:
-	CComGITPtr() throw()
-	{
-		m_dwCookie = 0;
-	}
-	CComGITPtr(T* p)
-	{
-		m_dwCookie = 0;
-		HRESULT hr = Attach(p);
-
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-	}
-	CComGITPtr(const CComGITPtr& git)
-	{
-		m_dwCookie = 0;
-		CComPtr<T> spT;
-
-		HRESULT hr = git.CopyTo(&spT);
-		if (((HRESULT)(hr) >= 0))
-			hr = Attach(spT);
-
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-	}
-	explicit CComGITPtr(DWORD dwCookie) throw()
-	{
-		do { (void) ((!!((dwCookie != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4919, 0, L"dwCookie != 0")) || (__debugbreak(), 0)); ; } while(0);		
-		m_dwCookie = dwCookie;
-
-
-		CComPtr<T> spT;
-		HRESULT hr = CopyTo(&spT);
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4925, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-
-	}
-
-	~CComGITPtr() throw()
-	{
-		Revoke();
-	}
-	CComGITPtr<T>& operator=(const CComGITPtr<T>& git)
-	{
-        if(*this!=git)
-        {
-		    CComPtr<T> spT;
-
-		    HRESULT hr = git.CopyTo(&spT);
-		    if (((HRESULT)(hr) >= 0))
-            {
-			    hr = Attach(spT);
-            }
-
-		    if (((HRESULT)(hr) < 0))
-            {
-			    ATL::AtlThrowImpl(hr);
-            }
-        }
-		return *this;
-	}
-	CComGITPtr<T>& operator=(T* p)
-	{
-		HRESULT hr = Attach(p);
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-		return *this;
-	}
-	CComGITPtr<T>& operator=(DWORD dwCookie)
-	{
-        if(*this!=dwCookie)
-        {
-		    HRESULT hr = Attach(dwCookie);
-		    if (((HRESULT)(hr) < 0))
-            {
-			    ATL::AtlThrowImpl(hr);
-            }
-
-		    m_dwCookie = dwCookie;
-
-
-		    CComPtr<T> spT;
-		    hr = CopyTo(&spT);
-		    (void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4974, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-
-        }
-		return *this;
-	}
-
-    
-    bool operator!=(CComGITPtr<T>& git) const
-    {
-        return !operator==(git);
-    }
-
-    bool operator!=(DWORD dwCookie) const
-    {
-        return !operator==(dwCookie);
-    }
-
-    bool operator==(CComGITPtr<T>& git) const
-    {
-        return m_dwCookie==git.GetCookie();
-    }
-
-    bool operator==(DWORD dwCookie) const
-    {
-        return m_dwCookie==dwCookie;
-    }
-
-	
-	operator DWORD() const
-	{
-		return m_dwCookie;
-	}
-	
-	DWORD GetCookie() const
-	{
-		return m_dwCookie;
-	}
-	
-	HRESULT Attach(T* p) throw()
-	{
-		CComPtr<IGlobalInterfaceTable> spGIT;
-		HRESULT hr = ((HRESULT)0x80004005L);
-		hr = AtlGetGITPtr(&spGIT);
-		(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5017, 0, L"spGIT != 0")) || (__debugbreak(), 0));
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5018, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		if (m_dwCookie != 0)
-			hr = spGIT->RevokeInterfaceFromGlobal(m_dwCookie);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		return spGIT->RegisterInterfaceInGlobal(p, __uuidof(T), &m_dwCookie);
-	}
-
-	HRESULT Attach(DWORD dwCookie) throw()
-	{
-		(void) ((!!((dwCookie != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5032, 0, L"dwCookie != 0")) || (__debugbreak(), 0));
-		HRESULT hr = Revoke();
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		m_dwCookie = dwCookie;
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	DWORD Detach() throw()
-	{
-		DWORD dwCookie = m_dwCookie;
-		m_dwCookie = 0;
-		return dwCookie;
-	}
-
-	
-	HRESULT Revoke() throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_dwCookie != 0)
-		{
-			CComPtr<IGlobalInterfaceTable> spGIT;
-			HRESULT hr = ((HRESULT)0x80004005L);
-			hr = AtlGetGITPtr(&spGIT);
-
-			(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5058, 0, L"spGIT != 0")) || (__debugbreak(), 0));
-			(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5059, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-			if (((HRESULT)(hr) < 0))
-				return hr;
-
-			hr = spGIT->RevokeInterfaceFromGlobal(m_dwCookie);
-			if (((HRESULT)(hr) >= 0))
-				m_dwCookie = 0;
-		}
-		return hr;
-	}
-	
-	
-	HRESULT CopyTo(T** pp) const throw()
-	{
-		CComPtr<IGlobalInterfaceTable> spGIT;
-		HRESULT hr = ((HRESULT)0x80004005L);
-		hr = AtlGetGITPtr(&spGIT);
-
-		(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5077, 0, L"spGIT != 0")) || (__debugbreak(), 0));
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5078, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		do { (void) ((!!((m_dwCookie!=0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5082, 0, L"m_dwCookie!=0")) || (__debugbreak(), 0)); ; } while(0);
-		return spGIT->GetInterfaceFromGlobal(m_dwCookie, __uuidof(T), (void**)pp);
-	}
-	DWORD m_dwCookie;
-};
-
-
-
-
-class CRegKey
-{
-public:
-	CRegKey() throw();
-	CRegKey( CRegKey& key ) throw();
-	explicit CRegKey(HKEY hKey) throw();
-	~CRegKey() throw();
-
-	CRegKey& operator=( CRegKey& key ) throw();
-
-
-public:
-	operator HKEY() const throw();
-	HKEY m_hKey;
-
-
-public:
-	__declspec( deprecated("CRegKey::SetValue(DWORD, TCHAR *valueName) has been superseded by CRegKey::SetDWORDValue") )
-	LONG SetValue(DWORD dwValue, LPCTSTR lpszValueName);
-	__declspec( deprecated("CRegKey::SetValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::SetStringValue and CRegKey::SetMultiStringValue") )
-	LONG SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName = 0, bool bMulti = false, int nValueLen = -1);
-	LONG SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) throw();
-	LONG SetGUIDValue(LPCTSTR pszValueName, const GUID & guidValue) throw();
-	LONG SetBinaryValue(LPCTSTR pszValueName, const void* pValue, ULONG nBytes) throw();
-	LONG SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) throw();
-	LONG SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) throw();
-	LONG SetStringValue(LPCTSTR pszValueName, LPCTSTR pszValue, DWORD dwType = ( 1 )) throw();
-	LONG SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) throw();
-
-	__declspec( deprecated("CRegKey::QueryValue(DWORD, TCHAR *valueName) has been superseded by CRegKey::QueryDWORDValue") )
-	LONG QueryValue(     DWORD& dwValue,          LPCTSTR lpszValueName);
-	__declspec( deprecated("CRegKey::QueryValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::QueryStringValue and CRegKey::QueryMultiStringValue") )
-	LONG QueryValue(           LPTSTR szValue,          LPCTSTR lpszValueName,      DWORD* pdwCount);
-	LONG QueryValue(         LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) throw();
-	LONG QueryGUIDValue(         LPCTSTR pszValueName, GUID& guidValue) throw();
-	LONG QueryBinaryValue(         LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) throw();
-	LONG QueryDWORDValue(         LPCTSTR pszValueName, DWORD& dwValue) throw();
-	LONG QueryQWORDValue(         LPCTSTR pszValueName, ULONGLONG& qwValue) throw();
-	LONG QueryStringValue(         LPCTSTR pszValueName,                 LPTSTR pszValue,      ULONG* pnChars) throw();
-	LONG QueryMultiStringValue(         LPCTSTR pszValueName,                 LPTSTR pszValue,      ULONG* pnChars) throw();
-
-	
-	LONG GetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd, LPDWORD pnBytes) throw();
-	
-	LONG SetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd) throw();
-
-	LONG SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = 0) throw();
-	static LONG __stdcall SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName,
-		LPCTSTR lpszValue, LPCTSTR lpszValueName = 0);
-
-	
-	LONG Create(     HKEY hKeyParent,        LPCTSTR lpszKeyName,
-		       LPTSTR lpszClass = ( 0 ),      DWORD dwOptions = (0x00000000L),
-		     REGSAM samDesired = ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))),
-		       LPSECURITY_ATTRIBUTES lpSecAttr = 0,
-		       LPDWORD lpdwDisposition = 0) throw();
-	
-	LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName,
-		REGSAM samDesired = ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L)))) throw();
-	
-	LONG Close() throw();
-	
-	LONG Flush() throw();
-
-	
-	HKEY Detach() throw();
-	
-	void Attach(HKEY hKey) throw();
-
-	
-	LONG EnumKey(     DWORD iIndex,          LPTSTR pszName,      LPDWORD pnNameLength,        FILETIME* pftLastWriteTime = 0) throw();
-	LONG NotifyChangeKeyValue(BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL bAsync = 1) throw();
-
-	LONG DeleteSubKey(LPCTSTR lpszSubKey) throw();
-	LONG RecurseDeleteKey(LPCTSTR lpszKey) throw();
-	LONG DeleteValue(LPCTSTR lpszValue) throw();
-};
-
-inline CRegKey::CRegKey() throw() : 
-	m_hKey( 0 )
-{
-}
-
-inline CRegKey::CRegKey( CRegKey& key ) throw() :
-	m_hKey( 0 )
-{
-	Attach( key.Detach() );
-}
-
-inline CRegKey::CRegKey(HKEY hKey) throw() :
-	m_hKey(hKey)
-{
-}
-
-inline CRegKey::~CRegKey() throw()
-{Close();}
-
-inline CRegKey& CRegKey::operator=( CRegKey& key ) throw()
-{
-    if(m_hKey!=key.m_hKey)
-    {
-	    Close();
-	    Attach( key.Detach() );
-    }
-	return( *this );
-}
-
-inline CRegKey::operator HKEY() const throw()
-{return m_hKey;}
-
-inline HKEY CRegKey::Detach() throw()
-{
-	HKEY hKey = m_hKey;
-	m_hKey = 0;
-	return hKey;
-}
-
-inline void CRegKey::Attach(HKEY hKey) throw()
-{
-	do { (void) ((!!((m_hKey == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5210, 0, L"m_hKey == 0")) || (__debugbreak(), 0)); ; } while(0);
-	m_hKey = hKey;
-}
-
-inline LONG CRegKey::DeleteSubKey(LPCTSTR lpszSubKey) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5216, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return RegDeleteKeyW(m_hKey, lpszSubKey);
-}
-
-inline LONG CRegKey::DeleteValue(LPCTSTR lpszValue) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5222, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return RegDeleteValueW(m_hKey, (LPTSTR)lpszValue);
-}
-
-inline LONG CRegKey::Close() throw()
-{
-	LONG lRes = 0L;
-	if (m_hKey != 0)
-	{
-		lRes = RegCloseKey(m_hKey);
-		m_hKey = 0;
-	}
-	return lRes;
-}
-
-inline LONG CRegKey::Flush() throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5239, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	return ::RegFlushKey(m_hKey);
-}
-
-inline LONG CRegKey::EnumKey(     DWORD iIndex,          LPTSTR pszName,      LPDWORD pnNameLength,        FILETIME* pftLastWriteTime) throw()
-{
-	FILETIME ftLastWriteTime;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5248, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	if (pftLastWriteTime == 0)
-	{
-		pftLastWriteTime = &ftLastWriteTime;
-	}
-
-	return ::RegEnumKeyExW(m_hKey, iIndex, pszName, pnNameLength, 0, 0, 0, pftLastWriteTime);
-}
-
-inline LONG CRegKey::NotifyChangeKeyValue(BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL bAsync) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5259, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!(((hEvent != 0) || !bAsync))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5260, 0, L"(hEvent != 0) || !bAsync")) || (__debugbreak(), 0));
-
-	return ::RegNotifyChangeKeyValue(m_hKey, bWatchSubtree, dwNotifyFilter, hEvent, bAsync);
-}
-
-inline LONG CRegKey::Create(     HKEY hKeyParent,        LPCTSTR lpszKeyName,
-	       LPTSTR lpszClass,      DWORD dwOptions,      REGSAM samDesired,
-	       LPSECURITY_ATTRIBUTES lpSecAttr,        LPDWORD lpdwDisposition) throw()
-{
-	(void) ((!!((hKeyParent != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5269, 0, L"hKeyParent != 0")) || (__debugbreak(), 0));
-	DWORD dw;
-	HKEY hKey = 0;
-	LONG lRes = RegCreateKeyExW(hKeyParent, lpszKeyName, 0,
-		lpszClass, dwOptions, samDesired, lpSecAttr, &hKey, &dw);
-	if (lpdwDisposition != 0)
-		*lpdwDisposition = dw;
-	if (lRes == 0L)
-	{
-		lRes = Close();
-		m_hKey = hKey;
-	}
-	return lRes;
-}
-
-inline LONG CRegKey::Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired) throw()
-{
-	(void) ((!!((hKeyParent != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5286, 0, L"hKeyParent != 0")) || (__debugbreak(), 0));
-	HKEY hKey = 0;
-	LONG lRes = RegOpenKeyExW(hKeyParent, lpszKeyName, 0, samDesired, &hKey);
-	if (lRes == 0L)
-	{
-		lRes = Close();
-		(void) ((!!((lRes == 0L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5292, 0, L"lRes == 0L")) || (__debugbreak(), 0));
-		m_hKey = hKey;
-	}
-	return lRes;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 4996)
-inline LONG CRegKey::QueryValue(DWORD& dwValue, LPCTSTR lpszValueName)
-{
-	DWORD dwType = 0;
-	DWORD dwCount = sizeof(DWORD);
-	LONG lRes = RegQueryValueExW(m_hKey, lpszValueName, 0, &dwType,
-		(LPBYTE)&dwValue, &dwCount);
-	(void) ((!!(((lRes!=0L) || (dwType == ( 4 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5306, 0, L"(lRes!=0L) || (dwType == ( 4 ))")) || (__debugbreak(), 0));
-	(void) ((!!(((lRes!=0L) || (dwCount == sizeof(DWORD))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5307, 0, L"(lRes!=0L) || (dwCount == sizeof(DWORD))")) || (__debugbreak(), 0));
-	if (dwType != ( 4 ))
-		return 13L;
-	return lRes;
-}
-
-#pragma warning(disable: 6053)
-inline LONG CRegKey::QueryValue(           LPTSTR pszValue,          LPCTSTR lpszValueName,      DWORD* pdwCount)
-{
-	do { int __atl_condVal=!!(pdwCount != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5316, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-	DWORD dwType = 0;
-	LONG lRes = RegQueryValueExW(m_hKey, lpszValueName, 0, &dwType, (LPBYTE)pszValue, pdwCount);
-	(void) ((!!(((lRes!=0L) || (dwType == ( 1 )) || (dwType == ( 7 )) || (dwType == ( 2 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5320, 0, L"(lRes!=0L) || (dwType == ( 1 )) || (dwType == ( 7 )) || (dwType == ( 2 ))")) || (__debugbreak(), 0));
-	if (pszValue != 0)
-	{
-		if(*pdwCount>0)
-		{
-			switch(dwType)
-			{
-				case ( 1 ):
-				case ( 2 ):
-					if ((*pdwCount) % sizeof(TCHAR) != 0 || pszValue[(*pdwCount) / sizeof(TCHAR) - 1] != 0)
-					{
-						pszValue[0]=L'\0';
-		 				return 13L;
-					}
-					break;
-				case ( 7 ):
-					if ((*pdwCount) % sizeof(TCHAR) != 0 || (*pdwCount) / sizeof(TCHAR) < 1 || pszValue[(*pdwCount) / sizeof(TCHAR) -1] != 0 || (((*pdwCount) / sizeof(TCHAR))>1 && pszValue[(*pdwCount) / sizeof(TCHAR) - 2] != 0) )
-					{
-						pszValue[0]=L'\0';
-						return 13L;
-					}
-					break;
-				default:
-					
-					pszValue[0]=L'\0';
-					return 13L;
-			}
-		}
-		else
-		{
-			
-			
-			pszValue[0]=L'\0';
-		}
-	}
-	return lRes;
-}
-#pragma warning(pop)	
-
-inline LONG CRegKey::QueryValue(LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5361, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	return( ::RegQueryValueExW(m_hKey, pszValueName, 0, pdwType, static_cast< LPBYTE >( pData ), pnBytes) );
-}
-
-inline LONG CRegKey::QueryDWORDValue(LPCTSTR pszValueName, DWORD& dwValue) throw()
-{
-	LONG lRes;
-	ULONG nBytes;
-	DWORD dwType;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5372, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	nBytes = sizeof(DWORD);
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(&dwValue),
-		&nBytes);
-	if (lRes != 0L)
-		return lRes;
-	if (dwType != ( 4 ))
-		return 13L;
-
-	return 0L;
-}
-inline LONG CRegKey::QueryQWORDValue(LPCTSTR pszValueName, ULONGLONG& qwValue) throw()
-{
-	LONG lRes;
-	ULONG nBytes;
-	DWORD dwType;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5390, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	nBytes = sizeof(ULONGLONG);
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(&qwValue),
-		&nBytes);
-	if (lRes != 0L)
-		return lRes;
-	if (dwType != ( 11 ))
-		return 13L;
-
-	return 0L;
-}
-
-inline LONG CRegKey::QueryBinaryValue(LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) throw()
-{
-	LONG lRes;
-	DWORD dwType;
-
-	(void) ((!!((pnBytes != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5408, 0, L"pnBytes != 0")) || (__debugbreak(), 0));
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5409, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pValue),
-		pnBytes);
-	if (lRes != 0L)
-		return lRes;
-	if (dwType != ( 3 ))
-		return 13L;
-
-	return 0L;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 6053)
-
-inline LONG CRegKey::QueryStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) throw()
-{
-	LONG lRes;
-	DWORD dwType;
-	ULONG nBytes;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5430, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!((pnChars != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5431, 0, L"pnChars != 0")) || (__debugbreak(), 0));
-
-	nBytes = (*pnChars)*sizeof(TCHAR);
-	*pnChars = 0;
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pszValue),
-		&nBytes);
-	
-	if (lRes != 0L)
-	{
-		return lRes;
-	}
-
-	if(dwType != ( 1 ) && dwType != ( 2 ))
-	{
-		return 13L;
-	}
-
-	if (pszValue != 0)
-	{
-		if(nBytes!=0)
-		{
-			if ((nBytes % sizeof(TCHAR) != 0) || (pszValue[nBytes / sizeof(TCHAR) -1] != 0))
-			{
- 				return 13L;
-            }
-        }
-        else
-        {
-            pszValue[0]=L'\0';
-        }
-    }
-
- 	*pnChars = nBytes/sizeof(TCHAR);
-	
-	return 0L;
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable: 6053)
-
-inline LONG CRegKey::QueryMultiStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) throw()
-{
-	LONG lRes;
-	DWORD dwType;
-	ULONG nBytes;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5478, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!((pnChars != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5479, 0, L"pnChars != 0")) || (__debugbreak(), 0));
-
-	if (pszValue != 0 && *pnChars < 2)
-		return 122L;
-		
-	nBytes = (*pnChars)*sizeof(TCHAR);
-	*pnChars = 0;
-	
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pszValue),
-		&nBytes);
-	if (lRes != 0L)
-		return lRes;
-	if (dwType != ( 7 ))
-		return 13L;
-	if (pszValue != 0 && (nBytes % sizeof(TCHAR) != 0 || nBytes / sizeof(TCHAR) < 1 || pszValue[nBytes / sizeof(TCHAR) -1] != 0 || ((nBytes/sizeof(TCHAR))>1 && pszValue[nBytes / sizeof(TCHAR) - 2] != 0)))
-		return 13L;
-
-	*pnChars = nBytes/sizeof(TCHAR);
-
-	return 0L;
-}
-#pragma warning(pop)
-
-inline LONG CRegKey::QueryGUIDValue(LPCTSTR pszValueName, GUID& guidValue) throw()
-{
-	TCHAR szGUID[64];
-	LONG lRes;
-	ULONG nCount;
-	HRESULT hr;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5509, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	guidValue = GUID_NULL;
-
-	nCount = 64;
-	lRes = QueryStringValue(pszValueName, szGUID, &nCount);
-
-	if (lRes != 0L)
-		return lRes;
-
-	if(szGUID[0] != L'{')
-		return 13L;
-
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	LPOLESTR lpstr = T2OLE_EX(szGUID, 1024);
-
-
-
-
-		
-	hr = ::CLSIDFromString(lpstr, &guidValue);
-	if (((HRESULT)(hr) < 0))
-		return 13L;
-
-	return 0L;
-}
-
-inline LONG __stdcall CRegKey::SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName)
-{
-	(void) ((!!((lpszValue != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5538, 0, L"lpszValue != 0")) || (__debugbreak(), 0));
-	CRegKey key;
-	LONG lRes = key.Create(hKeyParent, lpszKeyName);
-	if (lRes == 0L)
-		lRes = key.SetStringValue(lpszValueName, lpszValue);
-	return lRes;
-}
-
-inline LONG CRegKey::SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName) throw()
-{
-	(void) ((!!((lpszValue != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5548, 0, L"lpszValue != 0")) || (__debugbreak(), 0));
-	CRegKey key;
-	LONG lRes = key.Create(m_hKey, lpszKeyName);
-	if (lRes == 0L)
-		lRes = key.SetStringValue(lpszValueName, lpszValue);
-	return lRes;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 4996)
-inline LONG CRegKey::SetValue(DWORD dwValue, LPCTSTR pszValueName)
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5560, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return SetDWORDValue(pszValueName, dwValue);
-}
-
-inline LONG CRegKey::SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName, bool bMulti, int nValueLen)
-{
-	do { int __atl_condVal=!!(lpszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5566, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5567, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	if (bMulti && nValueLen == -1)
-		return 87L;
-
-	if (nValueLen == -1)
-		nValueLen = lstrlenW(lpszValue) + 1;
-
-	DWORD dwType = bMulti ? ( 7 ) : ( 1 );
-
-	return ::RegSetValueExW(m_hKey, lpszValueName, 0, dwType,
-		reinterpret_cast<const BYTE*>(lpszValue), nValueLen*sizeof(TCHAR));
-}
-#pragma warning(pop)
-
-inline LONG CRegKey::SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5584, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, dwType, static_cast<const BYTE*>(pValue), nBytes);
-}
-
-inline LONG CRegKey::SetBinaryValue(LPCTSTR pszValueName, const void* pData, ULONG nBytes) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5590, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 3 ), reinterpret_cast<const BYTE*>(pData), nBytes);
-}
-
-inline LONG CRegKey::SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5596, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 4 ), reinterpret_cast<const BYTE*>(&dwValue), sizeof(DWORD));
-}
-
-inline LONG CRegKey::SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5602, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 11 ), reinterpret_cast<const BYTE*>(&qwValue), sizeof(ULONGLONG));
-}
-
-inline LONG CRegKey::SetStringValue(         LPCTSTR pszValueName,        LPCTSTR pszValue,      DWORD dwType) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5608, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	do { int __atl_condVal=!!(pszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5609, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-	(void) ((!!(((dwType == ( 1 )) || (dwType == ( 2 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5610, 0, L"(dwType == ( 1 )) || (dwType == ( 2 ))")) || (__debugbreak(), 0));
-
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, dwType, reinterpret_cast<const BYTE*>(pszValue), (lstrlenW(pszValue)+1)*sizeof(TCHAR));
-}
-
-inline LONG CRegKey::SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) throw()
-{
-	LPCTSTR pszTemp;
-	ULONG nBytes;
-	ULONG nLength;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5621, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	do { int __atl_condVal=!!(pszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5622, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	
-	
-	
-	nBytes = 0;
-	pszTemp = pszValue;
-	do
-	{
-		nLength = lstrlenW(pszTemp)+1;
-		pszTemp += nLength;
-		nBytes += nLength*sizeof(TCHAR);
-	} while (nLength != 1);
-
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 7 ), reinterpret_cast<const BYTE*>(pszValue),
-		nBytes);
-}
-
-inline LONG CRegKey::SetGUIDValue(LPCTSTR pszValueName, const GUID & guidValue) throw()
-{
-	OLECHAR szGUID[64];
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5644, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	::StringFromGUID2(guidValue, szGUID, 64);
-
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	LPCTSTR lpstr = OLE2CT_EX(szGUID, 1024);
-
-
-
-
-	return SetStringValue(pszValueName, lpstr);
-}
-
-inline LONG CRegKey::GetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd, LPDWORD pnBytes) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5659, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!((pnBytes != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5660, 0, L"pnBytes != 0")) || (__debugbreak(), 0));
-
-	return ::RegGetKeySecurity(m_hKey, si, psd, pnBytes);
-}
-
-inline LONG CRegKey::SetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5667, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!((psd != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5668, 0, L"psd != 0")) || (__debugbreak(), 0));
-
-	return ::RegSetKeySecurity(m_hKey, si, psd);
-}
-
-inline LONG CRegKey::RecurseDeleteKey(LPCTSTR lpszKey) throw()
-{
-	CRegKey key;
-	LONG lRes = key.Open(m_hKey, lpszKey, ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-	if (lRes != 0L)
-	{
-		if (lRes != 2L && lRes != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5681)(atlTraceCOM, 0, L"CRegKey::RecurseDeleteKey : Failed to Open Key %s(Error = %d)\n", lpszKey, lRes);
-		}
-		return lRes;
-	}
-	FILETIME time;
-	DWORD dwSize = 256;
-	TCHAR szBuffer[256];
-	while (RegEnumKeyExW(key.m_hKey, 0, szBuffer, &dwSize, 0, 0, 0,
-		&time)==0L)
-	{
-		lRes = key.RecurseDeleteKey(szBuffer);
-		if (lRes != 0L)
-			return lRes;
-		dwSize = 256;
-	}
-	key.Close();
-	return DeleteSubKey(lpszKey);
-}
-
-
-
-inline HRESULT CComModule::RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc)
-{
-	CRegKey keyProgID;
-	LONG lRes = keyProgID.Create((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), lpszProgID, ( 0 ), (0x00000000L), (0x0002));
-	if (lRes == 0L)
-	{
-		lRes = keyProgID.SetStringValue(0, lpszUserDesc);
-		if (lRes == 0L)
-		{
-			lRes = keyProgID.SetKeyValue(L"CLSID", lpszCLSID);
-			if (lRes == 0L)
-				return ((HRESULT)0x00000000L);
-		}
-	}
-	return AtlHresultFromWin32(lRes);
-}
-
-inline HRESULT CComModule::RegisterAppId(LPCTSTR pAppId)
-{
-	CRegKey keyAppID;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	LONG lRet;
-
-	if ( (lRet = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
-	{
-		TCHAR szModule1[260];
-		TCHAR szModule2[260];
-		TCHAR* pszFileName;
-
-		DWORD dwFLen = ::GetModuleFileNameW(GetModuleInstance(), szModule1, 260);
-		if ( dwFLen != 0 && dwFLen != 260 )
-		{
-			if (::GetFullPathNameW(szModule1, 260, szModule2, &pszFileName) != 0)
-			{
-				CRegKey keyAppIDEXE;
-				if ( (lRet = keyAppIDEXE.Create(keyAppID, pszFileName, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
-				{
-					lRet = keyAppIDEXE.SetStringValue(L"AppID", pAppId);
-					if (lRet != 0L) 
-					{
-						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5742)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to set app id string value\n");
-						hr = AtlHresultFromWin32(lRet);
-						return hr;
-					}
-				}
-				else
-				{
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5749)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to create file name key\n");
-					hr = AtlHresultFromWin32(lRet);
-					return hr;
-				}
-				if ( (lRet = keyAppIDEXE.Create(keyAppID, pAppId, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
-				{	
-					lRet = keyAppIDEXE.SetStringValue(0, pszFileName);
-					if (lRet != 0L)
-					{
-						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5758)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to set file name string value\n");
-						hr = AtlHresultFromWin32(lRet);
-						return hr;
-					}
-				}
-				else
-				{
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5765)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to create app id key\n");
-					hr = AtlHresultFromWin32(lRet);
-					return hr;
-				}
-			}
-			else
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5772)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to get full path name for file %s\n", szModule1);
-				hr = AtlHresultFromLastError();
-			}
-		}
-		else
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5778)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to get module name\n");
-			if( dwFLen == 0 )
-				hr = AtlHresultFromLastError();
-			else if( dwFLen == 260 )
-				hr =  ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-		}
-	}
-	else
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5787)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to open registry key\n");
-		hr = AtlHresultFromWin32(lRet);
-	}
-	return hr;
-}
-
-inline HRESULT CComModule::UnregisterAppId(LPCTSTR pAppId)
-{
-	CRegKey keyAppID;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	LONG lRet = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-
-	if (lRet == 0L)
-	{
-		TCHAR szModule1[260];
-		TCHAR szModule2[260];
-		TCHAR* pszFileName;
-
-		DWORD dwFLen = ::GetModuleFileNameW(GetModuleInstance(), szModule1, 260);
-		if ( dwFLen != 0 && dwFLen != 260 )
-		{
-			if (::GetFullPathNameW(szModule1, 260, szModule2, &pszFileName) != 0)
-			{
-				if ((lRet = keyAppID.RecurseDeleteKey(pAppId)) != 0L)
-				{
-					if (lRet != 2L) 
-						hr = AtlHresultFromWin32(lRet);
-				}
-				if ((lRet = keyAppID.RecurseDeleteKey(pszFileName)) != 0L)
-				{
-					if (lRet != 2L) 
-						hr = AtlHresultFromWin32(lRet);
-				}
-			}
-			else
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5823)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to get full path name for file %s\n", szModule1);
-				hr = AtlHresultFromLastError();
-			}
-		}
-		else
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5829)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to get module name\n");
-			if( dwFLen == 0 )
-				hr = AtlHresultFromLastError();
-			else if( dwFLen == 260 )
-				hr = ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-		}
-	}
-	else
-	{
-		if (lRet != 2L && lRet != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5840)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to open registry key\n");
-			hr = AtlHresultFromWin32(lRet);
-		}
-	}
-	return hr;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning( push )
-#pragma warning( disable: 4996 )  
-
-inline HRESULT __stdcall CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID,
-	LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister)
-{
-	if (bRegister)
-	{
-		TCHAR szDesc[256];
-		LoadStringW(m_hInst, nDescID, szDesc, 256);
-		return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, szDesc, dwFlags);
-	}
-	return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID);
-}
-
-inline HRESULT __stdcall CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID,
-	LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags, BOOL bRegister)
-{
-	if (bRegister)
-		return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, szDesc, dwFlags);
-	return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID);
-}
-
-inline HRESULT __stdcall CComModule::RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID,
-	LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags)
-{
-	static const TCHAR szProgID[] = L"ProgID";
-	static const TCHAR szVIProgID[] = L"VersionIndependentProgID";
-	static const TCHAR szLS32[] = L"LocalServer32";
-	static const TCHAR szIPS32[] = L"InprocServer32";
-	static const TCHAR szThreadingModel[] = L"ThreadingModel";
-	static const TCHAR szAUTPRX32[] = L"AUTPRX32.DLL";
-	static const TCHAR szApartment[] = L"Apartment";
-	static const TCHAR szBoth[] = L"both";
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	TCHAR szModule[260 + 2];
-
-	do { int __atl_condVal=!!(lpszProgID && lpszVerIndProgID || !lpszProgID && !lpszVerIndProgID); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6062, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	if (!szDesc)
-	{
-		szDesc = L"";
-	}
-
-	
-	
-	
-	
-	
-	
-	
-	DWORD dwLen = GetModuleFileNameW(m_hInst, szModule + 1, 260);
-	if (dwLen == 0)
-	{
-		return AtlHresultFromLastError();
-	}
-	else if( dwLen == 260 )
-	{
-		return ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-	}
-
-	LPOLESTR lpOleStr;
-	HRESULT hRes = StringFromCLSID(clsid, &lpOleStr);
-	if (((HRESULT)(hRes) < 0))
-		return hRes;
-
-	LPTSTR lpszCLSID = OLE2T_EX(lpOleStr, 1024);
-
-
-
-
-
-
-
-
-	hRes = lpszProgID ? RegisterProgID(lpszCLSID, lpszProgID, szDesc) : ((HRESULT)0x00000000L);
-	if (hRes == ((HRESULT)0x00000000L))
-		hRes = lpszVerIndProgID ? RegisterProgID(lpszCLSID, lpszVerIndProgID, szDesc) : ((HRESULT)0x00000000L);
-	LONG lRes = 0L;
-	if (hRes == ((HRESULT)0x00000000L))
-	{
-		CRegKey key;
-		lRes = key.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"CLSID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRes == 0L)
-		{
-			lRes = key.Create(key, lpszCLSID, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-			if (lRes == 0L)
-			{
-				lRes = key.SetStringValue(0, szDesc);
-				if (lRes == 0L)
-				{
-					lRes = lpszProgID ? key.SetKeyValue(szProgID, lpszProgID) : 0L;
-					if (lRes == 0L)
-					{
-						lRes = lpszVerIndProgID ? key.SetKeyValue(szVIProgID, lpszVerIndProgID) : 0L;
-						if (lRes == 0L)
-						{
-							if ((m_hInst == 0) || (m_hInst == GetModuleHandleW(0))) 
-							{
-								
-								
-								
-								szModule[0] = L'\"';
-								szModule[dwLen + 1] = L'\"';
-								szModule[dwLen + 2] = 0;
-
-								lRes = key.SetKeyValue(szLS32, szModule);
-							}
-							else
-							{
-								lRes = key.SetKeyValue(szIPS32, (dwFlags & 0x4) ? szAUTPRX32 : szModule + 1);
-								if (lRes == 0L)
-								{
-									LPCTSTR lpszModel = (dwFlags & 0x2) ? szBoth :
-										(dwFlags & 0x1) ? szApartment : 0;
-									if (lpszModel != 0)
-										lRes = key.SetKeyValue(szIPS32, lpszModel, szThreadingModel);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	CoTaskMemFree(lpOleStr);
-	if (lRes != 0L)
-		hRes = AtlHresultFromWin32(lRes);
-	return hRes;
-}
-
-inline HRESULT __stdcall CComModule::UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID,
-	LPCTSTR lpszVerIndProgID)
-{
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	CRegKey key;
-	LONG lRet;
-
-	key.Attach((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ));
-	if (lpszProgID != 0 && lpszProgID[0]!=L'\0')
-	{
-		lRet = key.RecurseDeleteKey(lpszProgID);
-		if (lRet != 0L && lRet != 2L && lRet != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6169)(atlTraceCOM, 0, L"Failed to Unregister ProgID : %s\n", lpszProgID);
-			key.Detach();
-			return AtlHresultFromWin32(lRet);
-		}
-	}
-	if (lpszVerIndProgID != 0 && lpszVerIndProgID[0]!=L'\0')
-	{
-		lRet = key.RecurseDeleteKey(lpszVerIndProgID);
-		if (lRet != 0L && lRet != 2L && lRet != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6179)(atlTraceCOM, 0, L"Failed to Unregister Version Independent ProgID : %s\n", lpszVerIndProgID);
-			key.Detach();
-			return AtlHresultFromWin32(lRet);
-		}
-	}
-	LPOLESTR lpOleStr;
-	HRESULT hr = StringFromCLSID(clsid, &lpOleStr);
-	if (((HRESULT)(hr) >= 0))
-	{
-		LPTSTR lpsz = OLE2T_EX(lpOleStr, 1024);
-
-
-
-
-
-
-
-
-		lRet = key.Open(key, L"CLSID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRet == 0L)
-			lRet = key.RecurseDeleteKey(lpsz);
-		if (lRet != 0L && lRet != 2L && lRet != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6202)(atlTraceCOM, 0, L"Failed to delete CLSID : %s\n", lpsz);
-			hr = AtlHresultFromWin32(lRet);
-		}
-		CoTaskMemFree(lpOleStr);
-	}
-	else
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6209)(atlTraceCOM, 0, L"Failed to delete CLSID : {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-			clsid.Data1, 
-			clsid.Data2, 
-			clsid.Data3, 
-			clsid.Data4[0],
-			clsid.Data4[1],
-			clsid.Data4[2],
-			clsid.Data4[3],
-			clsid.Data4[4],
-			clsid.Data4[5],
-			clsid.Data4[6],
-			clsid.Data4[7]
-			);
-	}
-	key.Detach();
-	return hr;
-}
-
-#pragma warning( pop ) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-}; 
- 
- 
-
-
-
-
-
-
-
-
-
- 
-namespace ATL
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- extern "C" inline HRESULT __stdcall
-AtlWinModuleTerm(_ATL_WIN_MODULE* pWinModule, HINSTANCE hInst)
-{
-	if (pWinModule == 0)
-		return ((HRESULT)0x80070057L);
-	if (pWinModule->cbSize == 0)
-		return ((HRESULT)0x00000000L);
-	if (pWinModule->cbSize != sizeof(_ATL_WIN_MODULE))
-		return ((HRESULT)0x80070057L);
-
-	for (int i = 0; i < pWinModule->m_rgWindowClassAtoms.GetSize(); i++)
-		UnregisterClassW((LPCTSTR)pWinModule->m_rgWindowClassAtoms[i], hInst);
-	pWinModule->m_rgWindowClassAtoms.RemoveAll();
-	pWinModule->m_csWindowCreate.Term();
-	pWinModule->cbSize = 0;
-	return ((HRESULT)0x00000000L);
-}
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable : 4191)	
-
-inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo)
-{
-	do { int __atl_condVal=!!(pDllVersionInfo != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6761, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	
-	DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion");
-
-	if(pfnDllGetVersion == 0)
-	{
-		return ((HRESULT)0x80004001L);
-	}
-
-	return (*pfnDllGetVersion)(pDllVersionInfo);
-}
-
-#pragma warning(pop)
-
-inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo)
-{
-	HINSTANCE hInstDLL = ::LoadLibraryW(lpstrDllName);
-	if(hInstDLL == 0)
-	{
-		return AtlHresultFromLastError();
-	}
-	HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo);
-	::FreeLibrary(hInstDLL);
-	return hRet;
-}
-
-
-
-
-
-
-
-inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
-{
-	do { int __atl_condVal=!!(( pdwMajor != 0 ) && ( pdwMinor != 0 )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6796, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	DLLVERSIONINFO dvi;
-	memset(&dvi, 0, sizeof(dvi));
-	dvi.cbSize = sizeof(dvi);
-
-	HRESULT hRet = AtlGetDllVersion(L"comctl32.dll", &dvi);
-
-	if(((HRESULT)(hRet) >= 0))
-	{
-		*pdwMajor = dvi.dwMajorVersion;
-		*pdwMinor = dvi.dwMinorVersion;
-	}
-	else if(hRet == ((HRESULT)0x80004001L))
-	{
-		
-		
-		*pdwMajor = 4;
-		*pdwMinor = 0;
-		hRet = ((HRESULT)0x00000000L);
-	}
-
-	return hRet;
-}
-
-
-
-
-
-
-
-inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
-{
-	do { int __atl_condVal=!!(( pdwMajor != 0) && ( pdwMinor != 0 )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6829, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	DLLVERSIONINFO dvi;
-	memset(&dvi, 0, sizeof(dvi));
-	dvi.cbSize = sizeof(dvi);
-	HRESULT hRet = AtlGetDllVersion(L"shell32.dll", &dvi);
-
-	if(((HRESULT)(hRet) >= 0))
-	{
-		*pdwMajor = dvi.dwMajorVersion;
-		*pdwMinor = dvi.dwMinorVersion;
-	}
-	else if(hRet == ((HRESULT)0x80004001L))
-	{
-		
-		
-		*pdwMajor = 4;
-		*pdwMinor = 0;
-		hRet = ((HRESULT)0x00000000L);
-	}
-
-	return hRet;
-}
-
-inline __declspec( deprecated("AtlModuleRegisterClassObjects has been replaced by AtlComModuleRegisterClassObjects") )
-HRESULT AtlModuleRegisterClassObjects(_ATL_MODULE* , DWORD dwClsContext, DWORD dwFlags)
-{
-	return AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
-}
-
-inline __declspec( deprecated("AtlModuleRevokeClassObjects has been replaced by AtlComModuleRevokeClassObjects") ) 
-HRESULT AtlModuleRevokeClassObjects(_ATL_MODULE* )
-{
-	return AtlComModuleRevokeClassObjects(&_AtlComModule);
-}
-
-inline __declspec( deprecated("AtlModuleGetClassObject has been replaced by AtlComModuleGetClassObject") ) 
-HRESULT AtlModuleGetClassObject(_ATL_MODULE* , const IID & rclsid, const IID & riid, LPVOID* ppv)
-{
-
-	(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6869, 0, L"ppv != 0")) || (__debugbreak(), 0));
-
-
-	return AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
-}
-
-inline __declspec( deprecated("AtlModuleRegisterServer has been replaced by AtlComModuleRegisterServer") ) 
-HRESULT AtlModuleRegisterServer(_ATL_MODULE* , BOOL bRegTypeLib, const CLSID* pCLSID = 0)
-{
-	return AtlComModuleRegisterServer(&_AtlComModule, bRegTypeLib, pCLSID);
-}
-
-inline __declspec( deprecated("AtlModuleUnregisterServer has been replaced by AtlComModuleUnregisterServer") ) 
-HRESULT AtlModuleUnregisterServer(_ATL_MODULE* , const CLSID* pCLSID = 0)
-{
-	return AtlComModuleUnregisterServer(&_AtlComModule, 0, pCLSID);
-}
-
-inline __declspec( deprecated("AtlModuleUnregisterServerEx has been replaced by AtlComModuleUnregisterServer") ) 
-HRESULT AtlModuleUnregisterServerEx(_ATL_MODULE* , BOOL bUnRegTypeLib, const CLSID* pCLSID = 0)
-{
-	return AtlComModuleUnregisterServer(&_AtlComModule, bUnRegTypeLib, pCLSID);
-}
-
-inline __declspec( deprecated("AtlModuleUpdateRegistryFromResourceD has been replaced by AtlUpdateRegistryFromResourceD") ) 
-HRESULT AtlModuleUpdateRegistryFromResourceD(_ATL_MODULE* , LPCOLESTR lpszRes,
-	BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = 0)
-{
-	return AtlUpdateRegistryFromResourceD(_AtlBaseModule.GetModuleInstance(), lpszRes, bRegister, pMapEntries, pReg);
-}
-
-inline __declspec( deprecated("AtlModuleRegisterTypeLib has been replaced by AtlRegisterTypeLib") ) 
-HRESULT AtlModuleRegisterTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex)
-{
-	return AtlRegisterTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex);
-}
-
-inline __declspec( deprecated("AtlModuleUnRegisterTypeLib has been replaced by AtlUnRegisterTypeLib") ) 
-HRESULT AtlModuleUnRegisterTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex)
-{
-	return AtlUnRegisterTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex);
-}
-
-inline __declspec( deprecated("AtlModuleLoadTypeLib has been replaced by AtlLoadTypeLib") ) 
-HRESULT AtlModuleLoadTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib)
-{
-	return AtlLoadTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex, pbstrPath, ppTypeLib);
-}
-
-inline __declspec( deprecated("AtlModuleInit is no longer required") ) 
-HRESULT AtlModuleInit(_ATL_MODULE* , _ATL_OBJMAP_ENTRY* , HINSTANCE )
-{
-	return ((HRESULT)0x00000000L);
-}
-
-inline __declspec( deprecated("AtlModuleTerm is no longer required") ) 
-HRESULT AtlModuleTerm(_ATL_MODULE* )
-{
-	return ((HRESULT)0x00000000L);
-}
-
-inline __declspec( deprecated("AtlModuleAddCreateWndData has been replaced by AtlWinModuleAddCreateWndData") ) 
-void AtlModuleAddCreateWndData(_ATL_MODULE* , _AtlCreateWndData* pData, void* pObject)
-{
-	AtlWinModuleAddCreateWndData(&_AtlWinModule, pData, pObject);
-}
-
-inline __declspec( deprecated("AtlModuleExtractCreateWndData has been replaced by AtlWinModuleExtractCreateWndData") ) 
-void* AtlModuleExtractCreateWndData(_ATL_MODULE* )
-{
-	return AtlWinModuleExtractCreateWndData(&_AtlWinModule);
-}
-
-
-
-inline CRITICAL_SECTION& CComModule::get_m_csWindowCreate() throw()
-{
-	return _AtlWinModule.m_csWindowCreate.m_sec;
-}
-
-inline CRITICAL_SECTION& CComModule::get_m_csObjMap() throw()
-{
-	return _AtlComModule.m_csObjMap.m_sec;
-}
-
-inline CRITICAL_SECTION& CComModule::get_m_csStaticDataInit() throw()
-{
-	return m_csStaticDataInitAndTypeInfo.m_sec;
-}
-
-inline _AtlCreateWndData*& CComModule::get_m_pCreateWndList()  throw()
-{
-	return _AtlWinModule.m_pCreateWndList;
-}
-inline void CComModule::put_m_pCreateWndList(_AtlCreateWndData* p) throw()
-{
-	_AtlWinModule.m_pCreateWndList = p;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline HRESULT CComModule::Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE , const GUID* plibid) throw()
-{
-	if (plibid != 0)
-		m_libid = *plibid;
-
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (p != (_ATL_OBJMAP_ENTRY*)-1)
-	{
-		m_pObjMap = p;
-		if (m_pObjMap != 0)
-		{
-			pEntry = m_pObjMap;
-			while (pEntry->pclsid != 0)
-			{
-				pEntry->pfnObjectMain(true); 
-				pEntry++;
-			}
-		}
-	}
-	for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
-	{
-		if (*ppEntry != 0)
-			(*ppEntry)->pfnObjectMain(true); 
-	}
-	return ((HRESULT)0x00000000L);
-}
-
-inline void CComModule::Term() throw()
-{
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (m_pObjMap != 0)
-	{
-		pEntry = m_pObjMap;
-		while (pEntry->pclsid != 0)
-		{
-			if (pEntry->pCF != 0)
-				pEntry->pCF->Release();
-			pEntry->pCF = 0;
-			pEntry->pfnObjectMain(false); 
-			pEntry++;
-		}
-	}
-
-	for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
-	{
-		if (*ppEntry != 0)
-			(*ppEntry)->pfnObjectMain(false); 
-	}
-
-	
-	_AtlWinModule.Term();		
-
-
-	CAtlModuleT<CComModule>::Term();
-}
-
-inline HRESULT CComModule::GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
-{
-	if (ppv == 0)
-		return ((HRESULT)0x80004003L);
-	HRESULT hr = ((HRESULT)0x00000000L);
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (m_pObjMap != 0)
-	{
-		pEntry = m_pObjMap;
-		while (pEntry->pclsid != 0)
-		{
-			if ((pEntry->pfnGetClassObject != 0) && InlineIsEqualGUID(rclsid, *pEntry->pclsid))
-			{
-				if (pEntry->pCF == 0)
-				{
-					CComCritSecLock<CComCriticalSection> lock(_AtlComModule.m_csObjMap, false);
-					hr = lock.Lock();
-					if (((HRESULT)(hr) < 0))
-					{
-						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 7088)(atlTraceCOM, 0, L"ERROR : Unable to lock critical section in CComModule::GetClassObject\n");
-						(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 7089, 0, L"0")) || (__debugbreak(), 0));
-						break;
-					}
-					if (pEntry->pCF == 0)
-						hr = pEntry->pfnGetClassObject(pEntry->pfnCreateInstance, __uuidof(IUnknown), (LPVOID*)&pEntry->pCF);
-				}
-				if (pEntry->pCF != 0)
-					hr = pEntry->pCF->QueryInterface(riid, ppv);
-				break;
-			}
-			pEntry++;
-		}
-	}
-	if (*ppv == 0 && hr == ((HRESULT)0x00000000L))
-		hr = AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
-	return hr;
-}
-
-
-inline HRESULT CComModule::RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (m_pObjMap != 0)
-	{
-		pEntry = m_pObjMap;
-		while (pEntry->pclsid != 0 && hr == ((HRESULT)0x00000000L))
-		{
-			hr = pEntry->RegisterClassObject(dwClsContext, dwFlags);
-			pEntry++;
-		}
-	}
-	if (hr == ((HRESULT)0x00000000L))
-		hr = AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
-	return hr;
-}
-inline HRESULT CComModule::RevokeClassObjects() throw()
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (m_pObjMap != 0)
-	{
-		pEntry = m_pObjMap;
-		while (pEntry->pclsid != 0 && hr == ((HRESULT)0x00000000L))
-		{
-			hr = pEntry->RevokeClassObject();
-			pEntry++;
-		}
-	}
-	if (hr == ((HRESULT)0x00000000L))
-		hr = AtlComModuleRevokeClassObjects(&_AtlComModule);
-	return hr;
-}
-
-
-inline HRESULT CComModule::RegisterTypeLib() throw()
-{
-	return _AtlComModule.RegisterTypeLib();
-}
-inline HRESULT CComModule::RegisterTypeLib(LPCTSTR lpszIndex) throw()
-{
-	return _AtlComModule.RegisterTypeLib(lpszIndex);
-}
-inline HRESULT CComModule::UnRegisterTypeLib() throw()
-{
-	return _AtlComModule.UnRegisterTypeLib();
-}
-inline HRESULT CComModule::UnRegisterTypeLib(LPCTSTR lpszIndex) throw()
-{
-	return _AtlComModule.UnRegisterTypeLib(lpszIndex);
-}
-
-inline HRESULT CComModule::RegisterServer(BOOL bRegTypeLib , const CLSID* pCLSID ) throw()
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	_ATL_OBJMAP_ENTRY* pEntry = m_pObjMap;
-	if (pEntry != 0)
-	{
-		for (;pEntry->pclsid != 0; pEntry++)
-		{
-			if (pCLSID != 0)
-			{
-				if (!IsEqualGUID(*pCLSID, *pEntry->pclsid))
-					continue;
-			}
-			hr = pEntry->pfnUpdateRegistry(1);
-			if (((HRESULT)(hr) < 0))
-				break;
-			hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid,
-				pEntry->pfnGetCategoryMap(), 1 );
-			if (((HRESULT)(hr) < 0))
-				break;
-		}
-	}
-	if (((HRESULT)(hr) >= 0))
-		hr = CAtlModuleT<CComModule>::RegisterServer(bRegTypeLib, pCLSID);
-	return hr;
-}
-
-inline HRESULT CComModule::UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID ) throw()
-{
-	HRESULT hr = ((HRESULT)0x00000000L);	
-	_ATL_OBJMAP_ENTRY* pEntry = m_pObjMap;
-	if (pEntry != 0)
-	{
-		for (;pEntry->pclsid != 0; pEntry++)
-		{
-			if (pCLSID != 0)
-			{
-				if (!IsEqualGUID(*pCLSID, *pEntry->pclsid))
-					continue;
-			}
-			hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid,
-				pEntry->pfnGetCategoryMap(), 0 );
-			if (((HRESULT)(hr) < 0))
-				break;
-			hr = pEntry->pfnUpdateRegistry(0); 
-			if (((HRESULT)(hr) < 0))
-				break;
-		}
-	}
-	if (((HRESULT)(hr) >= 0))
-		hr = CAtlModuleT<CComModule>::UnregisterServer(bUnRegTypeLib, pCLSID);
-	return hr;
-}
-
-inline HRESULT CComModule::UnregisterServer(const CLSID* pCLSID ) throw()
-{
-	return UnregisterServer(0, pCLSID);
-}
-
-
-
-}	
- 
-
-#pragma warning( pop )
-
-
-
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-#pragma warning (push)
-#pragma warning(disable: 4702) 
-#pragma warning(disable: 4355) 
-#pragma warning(disable: 4511) 
-#pragma warning(disable: 4512) 
-#pragma warning(disable : 4668)	
-#pragma warning(disable : 4820)	
-#pragma warning(disable : 4571) 
-
-
-
-
-
-#pragma warning(disable: 4127) 
-#pragma warning(disable: 4786) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
- 
-
- 
-namespace ATL
-{
-
-
-
-
-
-PVOID __stdcall __AllocStdCallThunk(void);
-void  __stdcall __FreeStdCallThunk(PVOID);
-
-#pragma pack(push,1)
-struct _stdcallthunk
-{
-	DWORD   m_mov;          
-	DWORD   m_this;         
-	BYTE    m_jmp;          
-	DWORD   m_relproc;      
-	BOOL Init(DWORD_PTR proc, void* pThis)
-	{
-		m_mov = 0x042444C7;  
-		m_this = ((ULONG)(ULONG_PTR) (pThis) );
-		m_jmp = 0xe9;
-		m_relproc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(_stdcallthunk)));
-		
-		
-		FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));
-		return 1;
-	}
-	
-	void* GetCodeAddress()
-	{
-		return this;
-	}
-	void* operator new(size_t)
-	{
-        return __AllocStdCallThunk();
-    }
-    void operator delete(void* pThunk)
-    {
-        __FreeStdCallThunk(pThunk);
-    }
-};
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-#pragma pack(push,8)
-class CDynamicStdCallThunk
-{
-public:
-	_stdcallthunk *pThunk;
-
-	CDynamicStdCallThunk()
-	{
-		pThunk = 0;
-	}
-
-	~CDynamicStdCallThunk()
-	{
-		if (pThunk)
-		{
-			delete pThunk;
-		}
-	}
-
-	BOOL Init(DWORD_PTR proc, void *pThis)
-	{
-		if (pThunk == 0) 
-		{
-			pThunk = new _stdcallthunk;
-			if (pThunk == 0)
-			{
-				return 0;
-			}
-		}
-		return pThunk->Init(proc, pThis);
-	}
-	
-
-	void* GetCodeAddress()
-	{
-		return pThunk->GetCodeAddress();
-	}
-};
-
-#pragma pack(pop)
-typedef CDynamicStdCallThunk CStdCallThunk;
-
-
-
-
-}   
- 
-
-
-
-
-
-#pragma pack(push, 8)
-
-extern "C" const IID IID_ITargetFrame;
-
-
-
-#pragma pack(push, 8)
-namespace ATL
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, UINT nID, const IID& iid = GUID_NULL,
-	HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
-{
-	return AtlSetErrorInfo(clsid, (LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nID)))), 0, 0, iid, hRes, hInst);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, UINT nID, DWORD dwHelpID,
-	LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0, 
-	HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
-{
-	return AtlSetErrorInfo(clsid, (LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nID)))), dwHelpID,
-		lpszHelpFile, iid, hRes, hInst);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCSTR lpszDesc,
-	DWORD dwHelpID, LPCSTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
-{
-	(void) ((!!((lpszDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 93, 0, L"lpszDesc != 0")) || (__debugbreak(), 0));
-	if (lpszDesc == 0)
-		return ((HRESULT)0x80004003L);
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	LPCOLESTR pwszDesc = ((LPCWSTR)( ((_lpa_ex = lpszDesc) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex))));
-	if(pwszDesc == 0)
-		return ((HRESULT)0x8007000EL);
-	
-	LPCWSTR pwzHelpFile = 0;
-	if(lpszHelpFile != 0)
-	{
-		pwzHelpFile = ((LPCWSTR)( ((_lpa_ex = lpszHelpFile) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex))));
-		if(pwzHelpFile == 0)
-			return ((HRESULT)0x8007000EL);
-	}
-		
-	return AtlSetErrorInfo(clsid, pwszDesc, dwHelpID, pwzHelpFile, iid, hRes, 0);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCSTR lpszDesc,
-	const IID& iid = GUID_NULL, HRESULT hRes = 0)
-{
-	return AtlReportError(clsid, lpszDesc, 0, 0, iid, hRes);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCOLESTR lpszDesc,
-	const IID& iid = GUID_NULL, HRESULT hRes = 0)
-{
-	return AtlSetErrorInfo(clsid, lpszDesc, 0, 0, iid, hRes, 0);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCOLESTR lpszDesc, DWORD dwHelpID,
-	LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
-{
-	return AtlSetErrorInfo(clsid, lpszDesc, dwHelpID, lpszHelpFile, iid, hRes, 0);
-}
-
-
-
-inline bool AtlGetApartmentType(DWORD* pApartmentType)
-{
-	HRESULT hr = CoInitialize(0);
- 	if (((HRESULT)(hr) >= 0))
-		CoUninitialize();
-
-	if (hr == ((HRESULT)0x00000001L))
-	{
-		*pApartmentType = COINIT_APARTMENTTHREADED;
-		return true;
-	}
-
-	else
-	if (hr == ((HRESULT)0x80010106L))
-	{	
-		*pApartmentType = COINIT_MULTITHREADED;
-		return true;
-	}
-
-	return false;
-}
-
-
-
-
-class CComTypeAttr
-{
-
-public:
-   CComTypeAttr( ITypeInfo* pTypeInfo ) throw() :
-	  m_pTypeAttr( 0 ),
-	  m_pTypeInfo( pTypeInfo )
-   {
-   }
-   ~CComTypeAttr() throw()
-   {
-	  Release();
-   }
-
-
-public:
-   TYPEATTR* operator->() throw()
-   {
-	  do { (void) ((!!((m_pTypeAttr != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 175, 0, L"m_pTypeAttr != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return m_pTypeAttr;
-   }
-   TYPEATTR** operator&() throw()
-   {
-	  do { (void) ((!!((m_pTypeAttr == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 181, 0, L"m_pTypeAttr == 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return &m_pTypeAttr;
-   }
-
-   operator const TYPEATTR*() const throw()
-   {
-	  return m_pTypeAttr;
-   }
-
-
-public:
-   void Release() throw()
-   {
-	  if( m_pTypeAttr != 0 )
-	  {
-		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 197, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
-		 m_pTypeInfo->ReleaseTypeAttr( m_pTypeAttr );
-		 m_pTypeAttr = 0;
-	  }
-   }
-
-public:
-   TYPEATTR* m_pTypeAttr;
-   CComPtr< ITypeInfo > m_pTypeInfo;
-};
-
-
-
-
-
-class CComVarDesc
-{
-
-public:
-   CComVarDesc( ITypeInfo* pTypeInfo ) throw() :
-	  m_pVarDesc( 0 ),
-	  m_pTypeInfo( pTypeInfo )
-   {
-   }
-   ~CComVarDesc() throw()
-   {
-	  Release();
-   }
-
-
-public:
-   VARDESC* operator->() throw()
-   {
-	  do { (void) ((!!((m_pVarDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 230, 0, L"m_pVarDesc != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return m_pVarDesc;
-   }
-   VARDESC** operator&() throw()
-   {
-	  do { (void) ((!!((m_pVarDesc == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 236, 0, L"m_pVarDesc == 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return &m_pVarDesc;
-   }
-
-   operator const VARDESC*() const throw()
-   {
-	  return m_pVarDesc;
-   }
-
-
-public:
-   void Release() throw()
-   {
-	  if( m_pVarDesc != 0 )
-	  {
-		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 252, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
-		 m_pTypeInfo->ReleaseVarDesc( m_pVarDesc );
-		 m_pVarDesc = 0;
-	  }
-   }
-
-public:
-   VARDESC* m_pVarDesc;
-   CComPtr< ITypeInfo > m_pTypeInfo;
-};
-
-
-
-
-
-class CComFuncDesc
-{
-
-public:
-   CComFuncDesc( ITypeInfo* pTypeInfo ) throw() :
-	  m_pFuncDesc( 0 ),
-	  m_pTypeInfo( pTypeInfo )
-   {
-   }
-   ~CComFuncDesc() throw()
-   {
-	  Release();
-   }
-
-
-public:
-   FUNCDESC* operator->() throw()
-   {
-	  do { (void) ((!!((m_pFuncDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 285, 0, L"m_pFuncDesc != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return m_pFuncDesc;
-   }
-   FUNCDESC** operator&() throw()
-   {
-	  do { (void) ((!!((m_pFuncDesc == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 291, 0, L"m_pFuncDesc == 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return &m_pFuncDesc;
-   }
-
-   operator const FUNCDESC*() const throw()
-   {
-	  return m_pFuncDesc;
-   }
-
-
-public:
-   void Release() throw()
-   {
-	  if( m_pFuncDesc != 0 )
-	  {
-		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 307, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
-		 m_pTypeInfo->ReleaseFuncDesc( m_pFuncDesc );
-		 m_pFuncDesc = 0;
-	  }
-   }
-
-public:
-   FUNCDESC* m_pFuncDesc;
-   CComPtr< ITypeInfo > m_pTypeInfo;
-};
-
-
-
-
-
-class CComExcepInfo :
-   public EXCEPINFO
-{
-
-public:
-   CComExcepInfo()
-   {
-	  memset( this, 0, sizeof( *this ) );
-   }
-   ~CComExcepInfo()
-   {
-	  Clear();
-   }
-
-
-public:
-   void Clear()
-   {
-      ::SysFreeString(bstrSource);
-      ::SysFreeString(bstrDescription);
-      ::SysFreeString(bstrHelpFile);
-
-	  memset(this, 0, sizeof(*this));
-   }
-};
-
-
-
-
-template <class T>
-class __declspec(novtable) IPersistImpl : public IPersist
-{
-public:
-	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 357)(atlTraceCOM, 2, L"IPersistImpl::GetClassID\n");
-		if (pClassID == 0)
-			return ((HRESULT)0x80004005L);
-		*pClassID = T::GetObjectCLSID();
-		return ((HRESULT)0x00000000L);
-	}
-};
-
-
-
-class CFakeFirePropNotifyEvent
-{
-public:
-	static HRESULT FireOnRequestEdit(IUnknown* , DISPID )
-	{
-		return ((HRESULT)0x00000000L);
-	}
-	static HRESULT FireOnChanged(IUnknown* , DISPID )
-	{
-		return ((HRESULT)0x00000000L);
-	}
-};
-typedef CFakeFirePropNotifyEvent _ATL_PROP_NOTIFY_EVENT_CLASS;
-
-
-
-
-
-struct ATL_PROPVALMAP_ENTRY
-{
-	DISPID dispid;
-	VARIANT val;
-	LPCOLESTR szDesc;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct ATL_PROPMAP_ENTRY
-{
-	LPCOLESTR szDesc;
-	DISPID dispid;
-	const CLSID* pclsidPropPage;
-	const IID* piidDispatch;
-	DWORD dwOffsetData;
-	DWORD dwSizeData;
-	VARTYPE vt;
-
-
-
-
-};
-
-
-template<VARTYPE V>
-struct AtlExpectedDispatchOrUnknown 
-{
-	
-	typedef int _assert[V == VT_DISPATCH || V == VT_UNKNOWN ? 1 : -1];
-
-	static const VARTYPE value = V;	
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma deprecated(PROP_ENTRY, PROP_ENTRY_EX)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistStreamInit_Load(LPSTREAM pStm, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistPropertyBag_Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistPropertyBag_Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
-
-
-
-template <class T>
-class __declspec(novtable) IPersistStreamInitImpl : public IPersistStreamInit
-{
-public:
-	
-	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 576)(atlTraceCOM, 2, L"IPersistStreamInitImpl::GetClassID\n");
-		if (pClassID == 0)
-			return ((HRESULT)0x80004003L);
-		*pClassID = T::GetObjectCLSID();
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	virtual HRESULT __stdcall IsDirty()
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 586)(atlTraceCOM, 2, L"IPersistStreamInitImpl::IsDirty\n");
-		T* pT = static_cast<T*>(this);
-		return (pT->m_bRequiresSave) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-	}
-	virtual HRESULT __stdcall Load(LPSTREAM pStm)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 592)(atlTraceCOM, 2, L"IPersistStreamInitImpl::Load\n");
-
-		T* pT = static_cast<T*>(this);
-		return pT->IPersistStreamInit_Load(pStm, T::GetPropertyMap());
-	}
-	virtual HRESULT __stdcall Save(LPSTREAM pStm, BOOL fClearDirty)
-	{
-		T* pT = static_cast<T*>(this);
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 600)(atlTraceCOM, 2, L"IPersistStreamInitImpl::Save\n");
-		return pT->IPersistStreamInit_Save(pStm, fClearDirty, T::GetPropertyMap());
-	}
-	virtual HRESULT __stdcall GetSizeMax(ULARGE_INTEGER* pcbSize)
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		T* pT = static_cast<T*>(this);
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 607)(atlTraceCOM, 2, L"IPersistStreamInitImpl::GetSizeMax\n");
-
-		if (pcbSize == 0)
-			return ((HRESULT)0x80004003L);
-
-		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
-		do { int __atl_condVal=!!(pMap != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 613, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-
-		
-		ULARGE_INTEGER nSize;
-		nSize.HighPart = 0;
-		nSize.LowPart = sizeof(DWORD);
-
-		CComPtr<IDispatch> pDispatch;
-		const IID* piidOld = 0;
-		for (int i = 0; pMap[i].pclsidPropPage != 0; i++)
-		{
-			if (pMap[i].szDesc == 0)
-				continue;
-
-			
-			if (pMap[i].dwSizeData != 0)
-			{
-				ULONG ulSize=0;				
-				
-				if (pMap[i].vt == VT_BSTR)
-				{
-					void* pData = (void*) (pMap[i].dwOffsetData + (DWORD_PTR)pT);
-					do { int __atl_condVal=!!(pData >= (void*)(DWORD_PTR)pMap[i].dwOffsetData && pData >= (void*)(DWORD_PTR)pT); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 636, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-					BSTR bstr=*reinterpret_cast<BSTR*>(pData);
-					ulSize=CComBSTR::GetStreamSize(bstr);
-				} else
-				{
-					ulSize = pMap[i].dwSizeData;
-				}
-				nSize.QuadPart += ulSize;
-				continue;
-			}
-
-			CComVariant var;
-			if (pMap[i].piidDispatch != piidOld)
-			{
-				pDispatch.Release();
-				do { int __atl_condVal=!!(pMap[i].piidDispatch); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 651, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-				if (((HRESULT)(pT->GetUnknown()->QueryInterface(*pMap[i].piidDispatch, (void**)&pDispatch)) < 0))
-				{
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 654)(atlTraceCOM, 0, L"Failed to get a dispatch pointer for property #%i\n", i);
-					hr = ((HRESULT)0x80004005L);
-					break;
-				}
-				piidOld = pMap[i].piidDispatch;
-			}
-
-			if (((HRESULT)(pDispatch.GetProperty(pMap[i].dispid, &var)) < 0))
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 663)(atlTraceCOM, 0, L"Invoked failed on DISPID %x\n", pMap[i].dispid);
-				hr = ((HRESULT)0x80004005L);
-				break;
-			}
-			nSize.QuadPart += var.GetSize();
-		}
-		*pcbSize = nSize;
-		return hr;
-	}
-
-	
-	virtual HRESULT __stdcall InitNew()
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 676)(atlTraceCOM, 2, L"IPersistStreamInitImpl::InitNew\n");
-		T* pT = static_cast<T*>(this);
-		pT->m_bRequiresSave = 1;
-		return ((HRESULT)0x00000000L);
-	}
-
-	HRESULT IPersistStreamInit_Load(LPSTREAM pStm, ATL_PROPMAP_ENTRY* pMap)
-	{
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = AtlIPersistStreamInit_Load(pStm, pMap, pT, pT->GetUnknown());
-		if (((HRESULT)(hr) >= 0))
-			pT->m_bRequiresSave = 0;
-		return hr;
-
-	}
-	HRESULT IPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty, ATL_PROPMAP_ENTRY* pMap)
-	{
-		T* pT = static_cast<T*>(this);
-		HRESULT hr;
-		hr = AtlIPersistStreamInit_Save(pStm, fClearDirty, pMap, pT, pT->GetUnknown());
-		if (fClearDirty && ((HRESULT)(hr) >= 0))
-		{
-			pT->m_bRequiresSave=0;
-		}
-		return hr;
-
-	}
-};
-
-
-
-template <class T>
-class __declspec(novtable) IPersistStorageImpl : public IPersistStorage
-{
-public:
-	
-	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 714)(atlTraceCOM, 2, L"IPersistStorageImpl::GetClassID\n");
-		if (pClassID == 0)
-			return ((HRESULT)0x80004003L);
-		*pClassID = T::GetObjectCLSID();
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	virtual HRESULT __stdcall IsDirty(void)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 724)(atlTraceCOM, 2, L"IPersistStorageImpl::IsDirty\n");
-		CComPtr<IPersistStreamInit> p;
-		p.p = IPSI_GetIPersistStreamInit();
-		return (p != 0) ? p->IsDirty() : ((HRESULT)0x80004005L);
-	}
-	virtual HRESULT __stdcall InitNew(IStorage*)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 731)(atlTraceCOM, 2, L"IPersistStorageImpl::InitNew\n");
-		CComPtr<IPersistStreamInit> p;
-		p.p = IPSI_GetIPersistStreamInit();
-		return (p != 0) ? p->InitNew() : ((HRESULT)0x80004005L);
-	}
-	virtual HRESULT __stdcall Load(IStorage* pStorage)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 738)(atlTraceCOM, 2, L"IPersistStorageImpl::Load\n");
-		if (pStorage == 0)
-			return ((HRESULT)0x80070057L);
-		CComPtr<IPersistStreamInit> p;
-		p.p = IPSI_GetIPersistStreamInit();
-		HRESULT hr = ((HRESULT)0x80004005L);
-		if (p != 0)
-		{
-			CComPtr<IStream> spStream;
-			hr = pStorage->OpenStream(L"Contents", 0,
-				0x00000000L | 0x00000010L, 0, &spStream);
-			if (((HRESULT)(hr) >= 0))
-				hr = p->Load(spStream);
-		}
-		return hr;
-	}
-	virtual HRESULT __stdcall Save(IStorage* pStorage, BOOL fSameAsLoad)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 756)(atlTraceCOM, 2, L"IPersistStorageImpl::Save\n");
-		if (pStorage == 0)
-			return ((HRESULT)0x80070057L);
-		CComPtr<IPersistStreamInit> p;
-		p.p = IPSI_GetIPersistStreamInit();
-		HRESULT hr = ((HRESULT)0x80004005L);
-		if (p != 0)
-		{
-			CComPtr<IStream> spStream;
-			static LPCOLESTR vszContents = L"Contents";
-			hr = pStorage->CreateStream(vszContents,
-				0x00000002L | 0x00000010L | 0x00001000L,
-				0, 0, &spStream);
-			if (((HRESULT)(hr) >= 0))
-				hr = p->Save(spStream, fSameAsLoad);
-		}
-		return hr;
-	}
-	virtual HRESULT __stdcall SaveCompleted(IStorage* )
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 776)(atlTraceCOM, 2, L"IPersistStorageImpl::SaveCompleted\n");
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall HandsOffStorage(void)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 781)(atlTraceCOM, 2, L"IPersistStorageImpl::HandsOffStorage\n");
-		return ((HRESULT)0x00000000L);
-	}
-private:
-	IPersistStreamInit* IPSI_GetIPersistStreamInit();
-};
-
-template <class T>
-IPersistStreamInit* IPersistStorageImpl<T>::IPSI_GetIPersistStreamInit()
-{
-	T* pT = static_cast<T*>(this);
-	IPersistStreamInit* p;
-	if (((HRESULT)(pT->GetUnknown()->QueryInterface(__uuidof(IPersistStreamInit), (void**)&p)) < 0))
-		pT->_InternalQueryInterface(__uuidof(IPersistStreamInit), (void**)&p);
-	return p;
-}
-
-
-
-
-template <class T>
-class __declspec(novtable) IPersistPropertyBagImpl : public IPersistPropertyBag
-{
-public:
-	
-	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 808)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::GetClassID\n");
-		if (pClassID == 0)
-			return ((HRESULT)0x80004003L);
-		*pClassID = T::GetObjectCLSID();
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	
-	virtual HRESULT __stdcall InitNew()
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 819)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::InitNew\n");
-		T* pT = static_cast<T*>(this);
-		pT->m_bRequiresSave = 1;
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 826)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::Load\n");
-		T* pT = static_cast<T*>(this);
-		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
-		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 829, 0, L"pMap != 0")) || (__debugbreak(), 0));
-		return pT->IPersistPropertyBag_Load(pPropBag, pErrorLog, pMap);
-	}
-	virtual HRESULT __stdcall Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 834)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::Save\n");
-		T* pT = static_cast<T*>(this);
-		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
-		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 837, 0, L"pMap != 0")) || (__debugbreak(), 0));
-		return pT->IPersistPropertyBag_Save(pPropBag, fClearDirty, fSaveAllProperties, pMap);
-	}
-	HRESULT IPersistPropertyBag_Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog, ATL_PROPMAP_ENTRY* pMap)
-	{
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = AtlIPersistPropertyBag_Load(pPropBag, pErrorLog, pMap, pT, pT->GetUnknown());
-		if (((HRESULT)(hr) >= 0))
-			pT->m_bRequiresSave = 0;
-		return hr;
-	}
-	HRESULT IPersistPropertyBag_Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap)
-	{
-		T* pT = static_cast<T*>(this);
-		HRESULT hr;
-		hr = AtlIPersistPropertyBag_Save(pPropBag, fClearDirty, fSaveAllProperties, pMap, pT, pT->GetUnknown());
-		if (fClearDirty && ((HRESULT)(hr) >= 0))
-		{
-			pT->m_bRequiresSave=0;
-		}
-		return hr;
-
-	}
-};
-
-
-
-__declspec( deprecated("CSecurityDescriptor has been replaced by CSID") ) class CSecurityDescriptor
-{
-public:
-	CSecurityDescriptor();
-	~CSecurityDescriptor();
-
-public:
-	HRESULT Attach(PSECURITY_DESCRIPTOR pSelfRelativeSD);
-	HRESULT AttachObject(HANDLE hObject);
-	HRESULT Initialize();
-	HRESULT InitializeFromProcessToken(BOOL bDefaulted = 0);
-	HRESULT InitializeFromThreadToken(BOOL bDefaulted = 0, BOOL bRevertToProcessToken = 1);
-	HRESULT SetOwner(PSID pOwnerSid, BOOL bDefaulted = 0);
-	HRESULT SetGroup(PSID pGroupSid, BOOL bDefaulted = 0);
-	HRESULT Allow(LPCTSTR pszPrincipal, DWORD dwAccessMask);
-	HRESULT Deny(LPCTSTR pszPrincipal, DWORD dwAccessMask);
-	HRESULT Revoke(LPCTSTR pszPrincipal);
-	HRESULT Allow(PSID pSid, DWORD dwAccessMask);
-	HRESULT Deny(PSID pSid, DWORD dwAccessMask);
-	HRESULT Revoke(PSID pSid);
-
-	
-	
-	static HRESULT SetPrivilege(LPCTSTR Privilege, BOOL bEnable = 1, HANDLE hToken = 0);
-	static HRESULT GetTokenSids(HANDLE hToken, PSID* ppUserSid, PSID* ppGroupSid);
-	static HRESULT GetProcessSids(PSID* ppUserSid, PSID* ppGroupSid = 0);
-	static HRESULT GetThreadSids(PSID* ppUserSid, PSID* ppGroupSid = 0, BOOL bOpenAsSelf = 0);
-	static HRESULT CopyACL(PACL pDest, PACL pSrc);
-	static HRESULT GetCurrentUserSID(PSID *ppSid);
-	static HRESULT GetPrincipalSID(LPCTSTR pszPrincipal, PSID *ppSid);
-	static HRESULT AddAccessAllowedACEToACL(PACL *Acl, PSID pSid, DWORD dwAccessMask);
-	static HRESULT AddAccessDeniedACEToACL(PACL *Acl, PSID pSid, DWORD dwAccessMask);
-	static HRESULT RemovePrincipalFromACL(PACL Acl, PSID pSid);
-	static HRESULT CloneSID(PSID *ppSIDDest, PSID pSIDSrc)
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (ppSIDDest == 0)
-			return ((HRESULT)0x80004003L);
-
-		if (*ppSIDDest != 0)
-			return ((HRESULT)0x80070057L);
-		*ppSIDDest = 0;
-			
-		if (!IsValidSid(pSIDSrc))
-			return ((HRESULT)0x80070057L);
-
-		DWORD dwSize = GetLengthSid(pSIDSrc);
-
-		*ppSIDDest = (PSID) malloc(dwSize);
-		if (*ppSIDDest == 0)
-			return ((HRESULT)0x8007000EL);
-		if (!CopySid(dwSize, *ppSIDDest, pSIDSrc))
-		{
-			hr = AtlHresultFromLastError();
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 918, 0, L"0")) || (__debugbreak(), 0));
-			free(*ppSIDDest);
-			*ppSIDDest = 0;
-		}
-		return hr;
-	}
-	operator PSECURITY_DESCRIPTOR()
-	{
-		return m_pSD;
-	}
-
-public:
-	PSECURITY_DESCRIPTOR m_pSD;
-	PSID m_pOwner;
-	PSID m_pGroup;
-	PACL m_pDACL;
-	PACL m_pSACL;
-};
-
-inline CSecurityDescriptor::CSecurityDescriptor()
-{
-	m_pSD = 0;
-	m_pOwner = 0;
-	m_pGroup = 0;
-	m_pDACL = 0;
-	m_pSACL= 0;
-}
-
-inline CSecurityDescriptor::~CSecurityDescriptor()
-{
-	delete m_pSD;
-	free(m_pOwner);
-	free(m_pGroup);
-	free(m_pDACL);
-	free(m_pSACL);
-}
-
-inline HRESULT CSecurityDescriptor::Initialize()
-{
-	delete m_pSD;
-	m_pSD = 0;
-
-	free(m_pOwner);
-	m_pOwner = 0;
-
-	free(m_pGroup);
-	m_pGroup = 0;
-
-	free(m_pDACL);
-	m_pDACL = 0;
-
-	free(m_pSACL);
-	m_pSACL = 0;
-
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_pSD = new SECURITY_DESCRIPTOR;} catch(...) {} __pragma(warning(pop));
-	if (m_pSD != 0)
-	{
-		if (InitializeSecurityDescriptor(m_pSD, (1)))
-			return ((HRESULT)0x00000000L);
-
-		HRESULT hr = AtlHresultFromLastError();
-		delete m_pSD;
-		m_pSD = 0;
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 981, 0, L"0")) || (__debugbreak(), 0));
-		return hr;
-	}
-
-	return ((HRESULT)0x8007000EL);
-}
-
-inline HRESULT CSecurityDescriptor::InitializeFromProcessToken(BOOL bDefaulted)
-{
-	HRESULT hr = Initialize();
-	if (((HRESULT)(hr) >= 0))
-	{
-		PSID pUserSid = 0;
-		PSID pGroupSid = 0;
-		hr = GetProcessSids(&pUserSid, &pGroupSid);
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = SetOwner(pUserSid, bDefaulted);
-			if (((HRESULT)(hr) >= 0))
-			{
-				hr = SetGroup(pGroupSid, bDefaulted);
-			}			
-			free(pUserSid);
-			free(pGroupSid);
-			
-			if (((HRESULT)(hr) < 0))
-				Initialize();
-		}
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::InitializeFromThreadToken(BOOL bDefaulted, BOOL bRevertToProcessToken)
-{
-	HRESULT hr = Initialize();
-	if (((HRESULT)(hr) >= 0))
-	{
-		PSID pUserSid = 0;
-		PSID pGroupSid = 0;
-	
-		hr = GetThreadSids(&pUserSid, &pGroupSid);
-		if (((hr) & 0xFFFF) == 1008L && bRevertToProcessToken)
-			hr = GetProcessSids(&pUserSid, &pGroupSid);
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = SetOwner(pUserSid, bDefaulted);
-			if (((HRESULT)(hr) >= 0))
-				hr = SetGroup(pGroupSid, bDefaulted);
-			free(pUserSid);
-			free(pGroupSid);
-			
-			if (((HRESULT)(hr) < 0))
-				Initialize();
-		}
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::SetOwner(PSID pOwnerSid, BOOL bDefaulted)
-{
-	do { (void) ((!!((m_pSD))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1041, 0, L"m_pSD")) || (__debugbreak(), 0)); ; } while(0);
-	HRESULT hr = ((HRESULT)0x00000000L);
-
-	
-	if (SetSecurityDescriptorOwner(m_pSD, 0, bDefaulted))
-	{
-		free(m_pOwner);
-		m_pOwner = 0;
-
-		
-		if (pOwnerSid == 0)
-			return ((HRESULT)0x00000000L);
-
-		
-		hr = CloneSID(&m_pOwner, pOwnerSid);
-		if (((HRESULT)(hr) >= 0))
-		{
-			(void) ((!!((IsValidSid(m_pOwner)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1058, 0, L"IsValidSid(m_pOwner)")) || (__debugbreak(), 0));
-
-			if (!SetSecurityDescriptorOwner(m_pSD, m_pOwner, bDefaulted))
-			{
-				hr = AtlHresultFromLastError();
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1063, 0, L"0")) || (__debugbreak(), 0));
-				free(m_pOwner);
-				m_pOwner = 0;
-			}
-		}
-	}
-	else
-	{
-		hr = AtlHresultFromLastError();
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1072, 0, L"0")) || (__debugbreak(), 0));
-	}
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::SetGroup(PSID pGroupSid, BOOL bDefaulted)
-{
-	do { (void) ((!!((m_pSD))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1080, 0, L"m_pSD")) || (__debugbreak(), 0)); ; } while(0);
-	HRESULT hr = ((HRESULT)0x00000000L);
-
-	
-	if (SetSecurityDescriptorGroup(m_pSD, 0, bDefaulted))
-	{
-		free(m_pGroup);
-		m_pGroup = 0;
-
-		
-		if (pGroupSid == 0)
-			return ((HRESULT)0x00000000L);
-
-		
-		hr = CloneSID(&m_pGroup, pGroupSid);
-		if (((HRESULT)(hr) >= 0))
-		{
-			(void) ((!!((IsValidSid(m_pGroup)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1097, 0, L"IsValidSid(m_pGroup)")) || (__debugbreak(), 0));
-
-			if (!SetSecurityDescriptorGroup(m_pSD, m_pGroup, bDefaulted))
-			{
-				hr = AtlHresultFromLastError();
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1102, 0, L"0")) || (__debugbreak(), 0));
-				free(m_pGroup);
-				m_pGroup = 0;
-			}
-		}
-	}
-	else
-	{
-		hr = AtlHresultFromLastError();
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1111, 0, L"0")) || (__debugbreak(), 0));
-	}
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Allow(LPCTSTR pszPrincipal, DWORD dwAccessMask)
-{
-	PSID pSid;
-	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
-	if (((HRESULT)(hr) >= 0))
-	{
-		hr = Allow(pSid, dwAccessMask);
-		free(pSid);
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Deny(LPCTSTR pszPrincipal, DWORD dwAccessMask)
-{
-	PSID pSid;
-	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
-	if (((HRESULT)(hr) >= 0))
-	{
-		hr = Deny(pSid, dwAccessMask);
-		free(pSid);
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Revoke(LPCTSTR pszPrincipal)
-{
-	PSID pSid;
-	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
-	if (((HRESULT)(hr) >= 0))
-	{
-		hr = Revoke(pSid);
-		free(pSid);
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Allow(PSID pSid, DWORD dwAccessMask)
-{
-	HRESULT hr = AddAccessAllowedACEToACL(&m_pDACL, pSid, dwAccessMask);
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
-			hr = AtlHresultFromLastError();
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Deny(PSID pSid, DWORD dwAccessMask)
-{
-	HRESULT hr = AddAccessDeniedACEToACL(&m_pDACL, pSid, dwAccessMask);
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
-			hr = AtlHresultFromLastError();
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Revoke(PSID pSid)
-{
-	HRESULT hr = RemovePrincipalFromACL(m_pDACL, pSid);
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
-			hr = AtlHresultFromLastError();
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::GetProcessSids(PSID* ppUserSid, PSID* ppGroupSid)
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	HANDLE hToken = 0;
-	if (ppUserSid)
-		*ppUserSid = 0;
-	if (ppGroupSid)
-		*ppGroupSid = 0;
-	if (OpenProcessToken(GetCurrentProcess(), (0x0008), &hToken))
-	{
-		hr = GetTokenSids(hToken, ppUserSid, ppGroupSid);
-		CloseHandle(hToken);
-	}
-	else
-	{
-		
-		hr = AtlHresultFromLastError();
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1203, 0, L"0")) || (__debugbreak(), 0));
-	}
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::GetThreadSids(PSID* ppUserSid, PSID* ppGroupSid, BOOL bOpenAsSelf)
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	HANDLE hToken = 0;
-	if (ppUserSid)
-		*ppUserSid = 0;
-	if (ppGroupSid)
-		*ppGroupSid = 0;
-	if(OpenThreadToken(GetCurrentThread(), (0x0008), bOpenAsSelf, &hToken))
-	{
-		hr = GetTokenSids(hToken, ppUserSid, ppGroupSid);
-		CloseHandle(hToken);
-	} 
-	else
-		
-		hr = AtlHresultFromLastError();
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::GetTokenSids(HANDLE hToken, PSID* ppUserSid, PSID* ppGroupSid)
-{
-	DWORD dwSize = 0;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	if (ppUserSid != 0)
-		*ppUserSid = 0;
-	if (ppGroupSid != 0)
-		*ppGroupSid = 0;
-
-	if (ppUserSid != 0)
-	{
-		PTOKEN_USER ptkUser = 0;
-
-		
-		GetTokenInformation(hToken, TokenUser, 0, 0, &dwSize);
-		
-		DWORD dwError = GetLastError();
-		if (dwError == 122L)
-		{
-			ptkUser = (TOKEN_USER*) malloc(dwSize);
-			if (ptkUser != 0)
-			{
-				
-				if (GetTokenInformation(hToken, TokenUser, ptkUser, dwSize, &dwSize))
-				{
-					
-					hr = CloneSID(ppUserSid, ptkUser->User.Sid);
-
-
-					if (((HRESULT)(hr) >= 0))
-					{
-						(void) ((!!((IsValidSid(*ppUserSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1260, 0, L"IsValidSid(*ppUserSid)")) || (__debugbreak(), 0));
-					}
-
-				}
-				else
-					
-					hr = AtlHresultFromLastError();
-
-				free(ptkUser);
-				ptkUser = 0;
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		else
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1276, 0, L"0")) || (__debugbreak(), 0));
-			hr = AtlHresultFromWin32(dwError);
-		}
-	}
-	if (((HRESULT)(hr) >= 0) && ppGroupSid != 0)
-	{
-		PTOKEN_PRIMARY_GROUP ptkGroup = 0;
-
-		
-		GetTokenInformation(hToken, TokenPrimaryGroup, 0, 0, &dwSize);
-		DWORD dwError = GetLastError();
-		
-		if (dwError == 122L)
-		{
-			ptkGroup = (TOKEN_PRIMARY_GROUP*) malloc(dwSize);
-			if (ptkGroup != 0)
-			{
-				
-				if (GetTokenInformation(hToken, TokenPrimaryGroup, ptkGroup, dwSize, &dwSize))
-				{
-					
-					hr = CloneSID(ppGroupSid, ptkGroup->PrimaryGroup);
-
-
-					if (((HRESULT)(hr) >= 0))
-					{
-						(void) ((!!((IsValidSid(*ppGroupSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1302, 0, L"IsValidSid(*ppGroupSid)")) || (__debugbreak(), 0));
-					}
-
-				}
-				else
-					
-					hr = AtlHresultFromLastError();
-
-				free(ptkGroup);
-				ptkGroup = 0;
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		else
-			hr = AtlHresultFromWin32(dwError);
-	}
-	if (((HRESULT)(hr) < 0))
-	{
-		if (ppUserSid != 0)
-		{
-			free (*ppUserSid);
-			*ppUserSid = 0;
-		}
-		if (ppGroupSid != 0)
-		{
-			free (*ppGroupSid);
-			*ppGroupSid = 0;
-		}
-	}
-
-	return hr;
-}
-
-
-inline HRESULT CSecurityDescriptor::GetCurrentUserSID(PSID *ppSid)
-{
-	if (ppSid == 0)
-		return ((HRESULT)0x80004003L);
-	*ppSid = 0;
-
-	HANDLE tkHandle;
-	HRESULT hr = ((HRESULT)0x00000000L);
-
-	if (OpenProcessToken(GetCurrentProcess(), (0x0008), &tkHandle))
-	{
-		TOKEN_USER *tkUser = 0;
-		DWORD tkSize;
-
-		
-		GetTokenInformation(tkHandle, TokenUser, 0, 0, &tkSize);
-		DWORD dwError = GetLastError();
-		
-		if (dwError == 122L)
-		{
-			tkUser = (TOKEN_USER *) malloc(tkSize);
-			if (tkUser != 0)
-			{
-				
-				if (GetTokenInformation(tkHandle, TokenUser, tkUser, tkSize, &tkSize))
-				{
-					hr = CloneSID(ppSid, tkUser->User.Sid);
-
-
-					if (((HRESULT)(hr) >= 0))
-					{
-						(void) ((!!((IsValidSid(*ppSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1368, 0, L"IsValidSid(*ppSid)")) || (__debugbreak(), 0));
-					}
-
-				}
-				else
-					hr = AtlHresultFromLastError();
-
-				free (tkUser);
-				tkUser = 0;
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		else
-		{
-			hr = AtlHresultFromWin32(dwError);
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1384, 0, L"0")) || (__debugbreak(), 0));
-		}
-		CloseHandle(tkHandle);
-	}
-	else
-		hr = AtlHresultFromLastError();
-
-	return hr;
-}
-
-
-inline HRESULT CSecurityDescriptor::GetPrincipalSID(LPCTSTR pszPrincipal, PSID *ppSid)
-{
-	if (ppSid == 0)
-		return ((HRESULT)0x80004003L);
-	if (pszPrincipal == 0)
-		return ((HRESULT)0x80070057L);
-	*ppSid = 0;
-
-	HRESULT hr;
-	LPTSTR pszRefDomain = 0;
-	DWORD dwDomainSize = 0;
-	DWORD dwSidSize = 0;
-	SID_NAME_USE snu;
-	DWORD dwError;
-
-	
-	LookupAccountNameW(0, pszPrincipal, 0, &dwSidSize, 0, &dwDomainSize, &snu);
-
-	dwError = GetLastError();
-	if (dwError == 122L)
-	{
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pszRefDomain = new TCHAR[dwDomainSize];} catch(...) {} __pragma(warning(pop));
-		if (pszRefDomain != 0)
-		{
-			*ppSid = (PSID) malloc(dwSidSize);
-			if (*ppSid != 0)
-			{
-				if (LookupAccountNameW(0, pszPrincipal, *ppSid, &dwSidSize, pszRefDomain, &dwDomainSize, &snu))
-				{
-					hr = ((HRESULT)0x00000000L);
-				}
-				else
-				{
-					hr = AtlHresultFromLastError();
-					free(*ppSid);
-					*ppSid = 0;
-				}
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-			delete[] pszRefDomain;
-		}
-		else
-			hr = ((HRESULT)0x8007000EL);
-	}
-	else
-		hr = AtlHresultFromWin32(dwError);
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Attach(PSECURITY_DESCRIPTOR pSelfRelativeSD)
-{
-	PACL    pDACL = 0;
-	PACL    pSACL = 0;
-	BOOL    bDACLPresent, bSACLPresent;
-	BOOL    bDefaulted;
-	HRESULT hr;
-	PSID    pUserSid;
-	PSID    pGroupSid;
-	
-	if (pSelfRelativeSD == 0 || !IsValidSecurityDescriptor(pSelfRelativeSD))
-		return ((HRESULT)0x80070057L);
-	
-	hr = Initialize();
-	if(((HRESULT)(hr) < 0))
-		return hr;
-
-	
-	if (GetSecurityDescriptorDacl(pSelfRelativeSD, &bDACLPresent, &pDACL, &bDefaulted))
-	{
-		if (bDACLPresent)
-		{
-			
-			do { int __atl_condVal=!!(pDACL != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1469, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-			
-			m_pDACL = (PACL) malloc(pDACL->AclSize);
-			if (m_pDACL != 0)
-			{
-				
-				if (InitializeAcl(m_pDACL, pDACL->AclSize, (2)))
-				{
-					
-					hr = CopyACL(m_pDACL, pDACL);
-					if (((HRESULT)(hr) >= 0) && !IsValidAcl(m_pDACL))
-						hr = ((HRESULT)0x80004005L);
-				}
-				else
-					hr = AtlHresultFromLastError();
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		
-		if (((HRESULT)(hr) >= 0) && !SetSecurityDescriptorDacl(m_pSD, bDACLPresent, m_pDACL, bDefaulted))
-			hr = AtlHresultFromLastError();
-	}
-	else
-		hr = AtlHresultFromLastError();
-
-	
-	if (((HRESULT)(hr) >= 0) && GetSecurityDescriptorSacl(pSelfRelativeSD, &bSACLPresent, &pSACL, &bDefaulted))
-	{
-		if (bSACLPresent)
-		{
-			
-			do { int __atl_condVal=!!(pSACL != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1501, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-			
-			m_pSACL = (PACL) malloc(pSACL->AclSize);
-			if (m_pSACL != 0)
-			{
-				
-				if (InitializeAcl(m_pSACL, pSACL->AclSize, (2)))
-				{
-					
-					hr = CopyACL(m_pSACL, pSACL);
-					if (((HRESULT)(hr) >= 0) && !IsValidAcl(m_pSACL))
-						hr = ((HRESULT)0x80004005L);
-				}
-				else
-					hr = AtlHresultFromLastError();
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		
-		if (((HRESULT)(hr) >= 0) && !SetSecurityDescriptorSacl(m_pSD, bSACLPresent, m_pSACL, bDefaulted))
-			hr = AtlHresultFromLastError();
-	}
-	else if (((HRESULT)(hr) >= 0))
-		hr = AtlHresultFromLastError();
-	
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (GetSecurityDescriptorOwner(pSelfRelativeSD, &pUserSid, &bDefaulted))
-		{
-			if (((HRESULT)(hr = SetOwner(pUserSid, bDefaulted)) >= 0))
-			{
-				if (GetSecurityDescriptorGroup(pSelfRelativeSD, &pGroupSid, &bDefaulted))
-				{
-					if (((HRESULT)(hr = SetGroup(pGroupSid, bDefaulted)) >= 0))
-					{
-						if (!IsValidSecurityDescriptor(m_pSD))
-							hr = ((HRESULT)0x80004005L);
-					}
-				}
-				else
-					hr = AtlHresultFromLastError();
-			}
-		}
-		else
-			hr = AtlHresultFromLastError();
-	}
-
-	if (((HRESULT)(hr) < 0))
-	{
-		free(m_pDACL);
-		m_pDACL = 0;
-
-		free(m_pSACL);
-		m_pSACL = 0;
-
-		delete m_pSD;
-	 	m_pSD = 0;
-	}
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::AttachObject(HANDLE hObject)
-{
-	HRESULT hr;
-	DWORD dwError;
-	DWORD dwSize = 0;
-	PSECURITY_DESCRIPTOR pSD = 0;
-
-#pragma warning(push)
-#pragma warning(disable: 6309 6387)
-	
-	GetKernelObjectSecurity(hObject, (0x00000001L) | (0x00000002L) | (0x00000004L), 0, 0, &dwSize);
-#pragma warning(pop)
-
-	dwError = GetLastError();
-	if (dwError != 122L)
-		return AtlHresultFromWin32(dwError);
-
-	pSD = (PSECURITY_DESCRIPTOR) malloc(dwSize);
-	if (pSD != 0)
-	{
-		if (GetKernelObjectSecurity(hObject, (0x00000001L) | (0x00000002L) |
-			(0x00000004L), pSD, dwSize, &dwSize))
-
-			hr = Attach(pSD);
-		else
-			hr = AtlHresultFromLastError();
-		free(pSD);
-	}
-	else
-		hr = ((HRESULT)0x8007000EL);
-
-	return hr;
-}
-
-
-inline HRESULT CSecurityDescriptor::CopyACL(PACL pDest, PACL pSrc)
-{
-	ACL_SIZE_INFORMATION aclSizeInfo;
-	LPVOID pAce;
-	ACE_HEADER *aceHeader;
-
-	if (pDest == 0)
-		return ((HRESULT)0x80004003L);
-
-	if (pSrc == 0)
-		return ((HRESULT)0x00000000L);
-
-	if (!GetAclInformation(pSrc, (LPVOID) &aclSizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
-		return AtlHresultFromLastError();
-
-	
-	for (UINT i = 0; i < aclSizeInfo.AceCount; i++)
-	{
-		if (!GetAce(pSrc, i, &pAce))
-			return AtlHresultFromLastError();
-
-		aceHeader = (ACE_HEADER *) pAce;
-
-		if (!AddAce(pDest, (2), 0xffffffff, pAce, aceHeader->AceSize))
-			return AtlHresultFromLastError();
-	}
-
-	return ((HRESULT)0x00000000L);
-}
-
-inline HRESULT CSecurityDescriptor::AddAccessDeniedACEToACL(PACL *ppAcl, PSID pSid, DWORD dwAccessMask)
-{
-	ACL_SIZE_INFORMATION aclSizeInfo;
-	int aclSize;
-	PACL oldACL, newACL = 0;
-	HRESULT hr = ((HRESULT)0x00000000L);
-
-	if (ppAcl == 0)
-		return ((HRESULT)0x80004003L);
-
-	oldACL = *ppAcl;
-	
-	if (pSid == 0 || !IsValidSid(pSid))
-		return ((HRESULT)0x80070057L);
-
-	aclSizeInfo.AclBytesInUse = 0;
-	if (*ppAcl != 0 && !GetAclInformation(oldACL, (LPVOID) &aclSizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
-		hr = AtlHresultFromLastError();
-
-	if (((HRESULT)(hr) >= 0))
-	{
-		aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) + sizeof(ACCESS_DENIED_ACE) + GetLengthSid(pSid) - sizeof(DWORD);
-		newACL = (PACL) malloc(aclSize);
-		if (newACL != 0)
-		{
-			if (InitializeAcl(newACL, aclSize, (2)))
-			{
-				
-				if (AddAccessDeniedAce(newACL, (2), dwAccessMask, pSid))
-				{
-					
-					hr = CopyACL(newACL, oldACL);
-					if (((HRESULT)(hr) >= 0))
-					{
-						*ppAcl = newACL;
-						free(oldACL);
-					}
-				}
-				else
-					hr = AtlHresultFromLastError();
-			}
-			else
-				hr = AtlHresultFromLastError();
-
-			if (((HRESULT)(hr) < 0))
-				free(newACL);
-		}
-		else
-			hr = ((HRESULT)0x8007000EL);
-	}
-	return hr;
-}
-
-
-inline HRESULT CSecurityDescriptor::AddAccessAllowedACEToACL(PACL *ppAcl, PSID pSid, DWORD dwAccessMask)
-{
-	ACL_SIZE_INFORMATION aclSizeInfo;
-	int aclSize;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	PACL oldACL, newACL = 0;
-
-	if (ppAcl == 0)
-		return ((HRESULT)0x80004003L);
-
-	oldACL = *ppAcl;
-	
-	if (pSid == 0 || !IsValidSid(pSid))
-		return ((HRESULT)0x80070057L);
-
-	aclSizeInfo.AclBytesInUse = 0;
-	if (*ppAcl != 0 && !GetAclInformation(oldACL, (LPVOID) &aclSizeInfo, (DWORD) sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
-		hr = AtlHresultFromLastError();
-
-	if (((HRESULT)(hr) >= 0))
-	{
-		aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(pSid) - sizeof(DWORD);
-		newACL = (PACL) malloc(aclSize);
-		if (newACL != 0)
-		{
-			if (InitializeAcl(newACL, aclSize, (2)))
-			{
-				
-				hr = CopyACL(newACL, oldACL);
-				if (((HRESULT)(hr) >= 0))
-				{
-					
-					if (AddAccessAllowedAce(newACL, (2), dwAccessMask, pSid))
-					{
-						*ppAcl = newACL;
-						free(oldACL);
-					}
-					else
-						hr = AtlHresultFromLastError();
-				}
-			}
-			else
-				hr = AtlHresultFromLastError();
-
-			if (((HRESULT)(hr) < 0))
-				free(newACL);
-		}
-		else
-			hr = ((HRESULT)0x8007000EL);
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::RemovePrincipalFromACL(PACL pAcl, PSID principalSID)
-{
-	if (pAcl == 0 || principalSID == 0 || !IsValidSid(principalSID))
-		return ((HRESULT)0x80070057L);
-
-	HRESULT hr = ((HRESULT)0x00000000L);
-	ACL_SIZE_INFORMATION aclSizeInfo;
-	if (!GetAclInformation(pAcl, (LPVOID) &aclSizeInfo, (DWORD) sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
-	{
-		hr = AtlHresultFromLastError();
-		aclSizeInfo.AceCount = 0;
-	}
-		
-	for (ULONG i = aclSizeInfo.AceCount; i > 0; i--)
-	{
-		ULONG uIndex = i - 1;
-		LPVOID ace;	
-		if (!GetAce(pAcl, uIndex, &ace))
-		{
-			hr = AtlHresultFromLastError();
-			break;
-		}
-
-		ACE_HEADER *aceHeader = (ACE_HEADER *) ace;
-
-		if (aceHeader->AceType == (0x0))
-		{
-			ACCESS_ALLOWED_ACE *accessAllowedAce = (ACCESS_ALLOWED_ACE *) ace;
-			if (EqualSid(principalSID, (PSID) &accessAllowedAce->SidStart))
-			{
-				DeleteAce(pAcl, uIndex);
-			}
-		} 
-		else if (aceHeader->AceType == (0x1))
-		{
-			ACCESS_DENIED_ACE *accessDeniedAce = (ACCESS_DENIED_ACE *) ace;
-			if (EqualSid(principalSID, (PSID) &accessDeniedAce->SidStart))
-			{
-				DeleteAce(pAcl, uIndex);
-			}
-		} 
-		else if (aceHeader->AceType == (0x2))
-		{
-			SYSTEM_AUDIT_ACE *systemAuditAce = (SYSTEM_AUDIT_ACE *) ace;
-			if (EqualSid(principalSID, (PSID) &systemAuditAce->SidStart))
-			{
-				DeleteAce(pAcl, uIndex);
-			}
-		}
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::SetPrivilege(LPCTSTR privilege, BOOL bEnable, HANDLE hToken)
-{
-	TOKEN_PRIVILEGES tpPrevious;
-	TOKEN_PRIVILEGES tp;
-	DWORD  cbPrevious = sizeof(TOKEN_PRIVILEGES);
-	LUID   luid;
-	HANDLE hTokenUsed;
-
-	if (!LookupPrivilegeValueW(0, privilege, &luid ))
-		goto _Error;
-
-	
-	if (hToken != 0)
-		hTokenUsed = hToken;
-	else
-		if (!OpenProcessToken(GetCurrentProcess(), (0x0020) | (0x0008), &hTokenUsed))
-			goto _Error;
-
-	tp.PrivilegeCount = 1;
-	tp.Privileges[0].Luid = luid;
-	tp.Privileges[0].Attributes = 0;
-
-	memset(&tpPrevious, 0, sizeof(tpPrevious));
-
-	if (!AdjustTokenPrivileges(hTokenUsed, 0, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious))
-		goto _Error_CloseHandle;
-
-	tpPrevious.PrivilegeCount = 1;
-	tpPrevious.Privileges[0].Luid = luid;
-
-	if (bEnable)
-		tpPrevious.Privileges[0].Attributes |= (0x00000002L);
-	else
-		tpPrevious.Privileges[0].Attributes &= ~(0x00000002L);
-
-	if (!AdjustTokenPrivileges(hTokenUsed, 0, &tpPrevious, cbPrevious, 0, 0))
-		goto _Error_CloseHandle;
-
-	if(hToken == 0)
-		CloseHandle(hTokenUsed);
-
-	return ((HRESULT)0x00000000L);
-
-	HRESULT hr;
-
-_Error:
-	hr = AtlHresultFromLastError();
-	return hr;
-
-_Error_CloseHandle:
-	hr = AtlHresultFromLastError();
-	if (hToken == 0)
-		CloseHandle(hTokenUsed);
-	return hr;
-}
-
-
-
-
-
-
-
-
-template <class T1>
-class CComCreator
-{
-public:
-	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
-	{
-		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1858, 0, L"ppv != 0")) || (__debugbreak(), 0));
-		if (ppv == 0)
-			return ((HRESULT)0x80004003L);
-		*ppv = 0;
-
-		HRESULT hRes = ((HRESULT)0x8007000EL);
-		T1* p = 0;
-#pragma warning(push)
-#pragma warning(disable: 6014)
-		
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new T1(pv);} catch(...) {} __pragma(warning(pop))
-#pragma warning(pop)
-		if (p != 0)
-		{
-			p->SetVoid(pv);
-			p->InternalFinalConstructAddRef();
-			hRes = p->_AtlInitialConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->FinalConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->_AtlFinalConstruct();
-			p->InternalFinalConstructRelease();
-			if (hRes == ((HRESULT)0x00000000L))
-				hRes = p->QueryInterface(riid, ppv);
-			if (hRes != ((HRESULT)0x00000000L))
-				delete p;
-		}
-		return hRes;
-	}
-};
-
-template <class T1>
-class CComInternalCreator
-{
-public:
-	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
-	{
-		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1895, 0, L"ppv != 0")) || (__debugbreak(), 0));
-		if (ppv == 0)
-			return ((HRESULT)0x80004003L);
-		*ppv = 0;
-
-		HRESULT hRes = ((HRESULT)0x8007000EL);
-		T1* p = 0;
-#pragma warning(push)
-#pragma warning(disable: 6014)
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new T1(pv);} catch(...) {} __pragma(warning(pop))
-#pragma warning(pop)
-		if (p != 0)
-		{
-			p->SetVoid(pv);
-			p->InternalFinalConstructAddRef();
-			hRes = p->_AtlInitialConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->FinalConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->_AtlFinalConstruct();
-			p->InternalFinalConstructRelease();
-			if (hRes == ((HRESULT)0x00000000L))
-				hRes = p->_InternalQueryInterface(riid, ppv);
-			if (hRes != ((HRESULT)0x00000000L))
-				delete p;
-		}
-		return hRes;
-	}
-};
-
-template <HRESULT hr>
-class CComFailCreator
-{
-public:
-	static HRESULT __stdcall CreateInstance(void*, const IID &, LPVOID* ppv)
-	{
-		if (ppv == 0)
-			return ((HRESULT)0x80004003L);
-		*ppv = 0;
-
-		return hr;
-	}
-};
-
-template <class T1, class T2>
-class CComCreator2
-{
-public:
-	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
-	{
-		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1945, 0, L"ppv != 0")) || (__debugbreak(), 0));
-
-		return (pv == 0) ? 
-			T1::CreateInstance(0, riid, ppv) : 
-			T2::CreateInstance(pv, riid, ppv);
-	}
-};
-
-
-
-
-
-
-
-
-
-
-struct _ATL_CREATORDATA
-{
-	_ATL_CREATORFUNC* pFunc;
-};
-
-template <class Creator>
-class _CComCreatorData
-{
-public:
-	static _ATL_CREATORDATA data;
-};
-
-template <class Creator>
-_ATL_CREATORDATA _CComCreatorData<Creator>::data = {Creator::CreateInstance};
-
-struct _ATL_CACHEDATA
-{
-	DWORD dwOffsetVar;
-	_ATL_CREATORFUNC* pFunc;
-};
-
-template <class Creator, DWORD dwVar>
-class _CComCacheData
-{
-public:
-	static _ATL_CACHEDATA data;
-};
-
-template <class Creator, DWORD dwVar>
-_ATL_CACHEDATA _CComCacheData<Creator, dwVar>::data = {dwVar, Creator::CreateInstance};
-
-struct _ATL_CHAINDATA
-{
-	DWORD_PTR dwOffset;
-	const _ATL_INTMAP_ENTRY* (__stdcall *pFunc)();
-};
-
-template <class base, class derived>
-class _CComChainData
-{
-public:
-	static _ATL_CHAINDATA data;
-};
-
-template <class base, class derived>
-_ATL_CHAINDATA _CComChainData<base, derived>::data =
-	{((DWORD_PTR)(static_cast<base*>((derived*)8))-8), base::_GetEntries};
-
-template <class T, const CLSID* pclsid>
-class CComAggregateCreator
-{
-public:
-	static HRESULT __stdcall CreateInstance(void* pv, const IID &, LPVOID* ppv) throw()
-	{
-		
-		(void) ((!!((ppv != 0 && *ppv == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2017, 0, L"ppv != 0 && *ppv == 0")) || (__debugbreak(), 0));
-
-		(void) ((!!((pv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2019, 0, L"pv != 0")) || (__debugbreak(), 0));
-		if (pv == 0)
-			return ((HRESULT)0x80070057L);
-
-		T* p = (T*) pv;
-		
-		
-		
-		return CoCreateInstance(*pclsid, p->GetControllingUnknown(), (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER), __uuidof(IUnknown), ppv);
-	}
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class CComObjectRootBase
-{
-public:
-	CComObjectRootBase()
-	{
-		m_dwRef = 0L;
-	}
-	~CComObjectRootBase()
-	{
-	}
-	HRESULT FinalConstruct()
-	{
-		return ((HRESULT)0x00000000L);
-	}
-	
-	HRESULT _AtlFinalConstruct()
-	{
-		return ((HRESULT)0x00000000L);
-	}
-	void FinalRelease() {}
-	void _AtlFinalRelease() {}		
-
-	void _HRPass(HRESULT hr)		
-	{
-		(hr);
-	}
-
-	void _HRFail(HRESULT hr)		
-	{
-		(hr);
-	}
-
-
-	
-	static void __stdcall ObjectMain(bool );
-
-	static const struct _ATL_CATMAP_ENTRY* GetCategoryMap() {return 0;};
-	static HRESULT __stdcall InternalQueryInterface(void* pThis,
-		const _ATL_INTMAP_ENTRY* pEntries, const IID & iid, void** ppvObject)
-	{
-		
-
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2286, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-
-		(void) ((!!((pThis != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2288, 0, L"pThis != 0")) || (__debugbreak(), 0));
-		
-		(void) ((!!((pEntries->pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2290, 0, L"pEntries->pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0));
-	
-
-
-		HRESULT hRes = AtlInternalQueryInterface(pThis, pEntries, iid, ppvObject);
-	
-
-
-		return hRes;
-	}
-
-
-	ULONG OuterAddRef()
-	{
-		return m_pOuterUnknown->AddRef();
-	}
-	ULONG OuterRelease()
-	{
-		return m_pOuterUnknown->Release();
-	}
-	HRESULT OuterQueryInterface(const IID & iid, void ** ppvObject)
-	{
-		return m_pOuterUnknown->QueryInterface(iid, ppvObject);
-	}
-
-	void SetVoid(void*) {}
-	void InternalFinalConstructAddRef() {}
-	void InternalFinalConstructRelease()
-	{
-		do { (void) ((!!((m_dwRef == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2319, 0, L"m_dwRef == 0")) || (__debugbreak(), 0)); ; } while(0);
-	}
-	
-	
-
-
-	static HRESULT __stdcall _Break(void* , const IID & iid, void** , DWORD_PTR )
-	{
-		(iid);
-		((HRESULT)0x00000000L);
-		DebugBreak();
-		return ((HRESULT)0x00000001L);
-	}
-	static HRESULT __stdcall _NoInterface(void* , const IID & , void** , DWORD_PTR )
-	{
-		return ((HRESULT)0x80004002L);
-	}
-	static HRESULT __stdcall _Creator(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		_ATL_CREATORDATA* pcd = (_ATL_CREATORDATA*)dw;
-		return pcd->pFunc(pv, iid, ppvObject);
-	}
-	static HRESULT __stdcall _Delegate(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		HRESULT hRes = ((HRESULT)0x80004002L);
-		IUnknown* p = *(IUnknown**)((DWORD_PTR)pv + dw);
-		if (p != 0)
-			hRes = p->QueryInterface(iid, ppvObject);
-		return hRes;
-	}
-	static HRESULT __stdcall _Chain(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		_ATL_CHAINDATA* pcd = (_ATL_CHAINDATA*)dw;
-		void* p = (void*)((DWORD_PTR)pv + pcd->dwOffset);
-		return InternalQueryInterface(p, pcd->pFunc(), iid, ppvObject);
-	}
-	static HRESULT __stdcall _ChainAttr(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		const _ATL_INTMAP_ENTRY* (__stdcall *pFunc)() = (const _ATL_INTMAP_ENTRY* (__stdcall *)())dw;
-		const _ATL_INTMAP_ENTRY *pEntries = pFunc();
-		if (pEntries == 0)
-			return ((HRESULT)0x00000000L);
-		return InternalQueryInterface(pv, pEntries, iid, ppvObject);
-	}
-	static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		HRESULT hRes = ((HRESULT)0x80004002L);
-		_ATL_CACHEDATA* pcd = (_ATL_CACHEDATA*)dw;
-		IUnknown** pp = (IUnknown**)((DWORD_PTR)pv + pcd->dwOffsetVar);
-		if (*pp == 0)
-			hRes = pcd->pFunc(pv, __uuidof(IUnknown), (void**)pp);
-		if (*pp != 0)
-			hRes = (*pp)->QueryInterface(iid, ppvObject);
-		return hRes;
-	}
-
-	union
-	{
-		long m_dwRef;
-		IUnknown* m_pOuterUnknown;
-	};
-};
-
-#pragma managed(push, off)
-inline void __stdcall CComObjectRootBase::ObjectMain(bool )
-{
-}
-#pragma managed(pop)
-
-
-
-template <class ThreadModel>
-class CComObjectRootEx;
-
-template <class ThreadModel>
-class CComObjectLockT
-{
-public:
-	CComObjectLockT(CComObjectRootEx<ThreadModel>* p)
-	{
-		if (p)
-			p->Lock();
-		m_p = p;
-	}
-
-	~CComObjectLockT()
-	{
-		if (m_p)
-			m_p->Unlock();
-	}
-	CComObjectRootEx<ThreadModel>* m_p;
-};
-
-template <> class CComObjectLockT<CComSingleThreadModel>;
-
-template <class ThreadModel>
-class CComObjectRootEx : public CComObjectRootBase
-{
-public:
-	typedef ThreadModel _ThreadModel;
-	typedef typename _ThreadModel::AutoCriticalSection _CritSec;
-	typedef typename _ThreadModel::AutoDeleteCriticalSection _AutoDelCritSec;
-	typedef CComObjectLockT<_ThreadModel> ObjectLock;
-
-	~CComObjectRootEx() {}
-
-	ULONG InternalAddRef()
-	{
-		do { (void) ((!!((m_dwRef != -1L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2427, 0, L"m_dwRef != -1L")) || (__debugbreak(), 0)); ; } while(0);
-		return _ThreadModel::Increment(&m_dwRef);
-	}
-	ULONG InternalRelease()
-	{
-
-		LONG nRef = _ThreadModel::Decrement(&m_dwRef);
-		if (nRef < -(2147483647L / 2))
-		{
-			(void) ((!!((0 && L"Release called on a pointer that has already been released"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2436, 0, L"0 && L\"Release called on a pointer that has already been released\"")) || (__debugbreak(), 0));
-		}
-		return nRef;
-
-
-
-	}
-
-	HRESULT _AtlInitialConstruct()
-	{
-		return m_critsec.Init();
-	}
-	void Lock() {m_critsec.Lock();}
-	void Unlock() {m_critsec.Unlock();}
-private:
-	_AutoDelCritSec m_critsec;
-};
-
-template <>
-class CComObjectRootEx<CComSingleThreadModel> : public CComObjectRootBase
-{
-public:
-	typedef CComSingleThreadModel _ThreadModel;
-	typedef _ThreadModel::AutoCriticalSection _CritSec;
-	typedef _ThreadModel::AutoDeleteCriticalSection _AutoDelCritSec;
-	typedef CComObjectLockT<_ThreadModel> ObjectLock;
-
-	~CComObjectRootEx() {}
-
-	ULONG InternalAddRef()
-	{
-		do { (void) ((!!((m_dwRef != -1L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2467, 0, L"m_dwRef != -1L")) || (__debugbreak(), 0)); ; } while(0);
-		return _ThreadModel::Increment(&m_dwRef);
-	}
-	ULONG InternalRelease()
-	{
-
-		long nRef = _ThreadModel::Decrement(&m_dwRef);
-		if (nRef < -(2147483647L / 2))
-		{
-			(void) ((!!((0 && L"Release called on a pointer that has already been released"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2476, 0, L"0 && L\"Release called on a pointer that has already been released\"")) || (__debugbreak(), 0));
-		}
-		return nRef;
-
-
-
-	}
-
-	HRESULT _AtlInitialConstruct()
-	{
-		return ((HRESULT)0x00000000L);
-	}
-
-	void Lock() {}
-	void Unlock() {}
-};
-
-template <>
-class CComObjectLockT<CComSingleThreadModel>
-{
-public:
-	CComObjectLockT(CComObjectRootEx<CComSingleThreadModel>*) {}
-	~CComObjectLockT() {}
-};
-
-typedef CComObjectRootEx<CComObjectThreadModel> CComObjectRoot;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template<class Base> class CComObject; 
-
-template <class Owner, class ThreadModel = CComObjectThreadModel>
-class CComTearOffObjectBase : public CComObjectRootEx<ThreadModel>
-{
-public:
-	typedef Owner _OwnerClass;
-	Owner* m_pOwner;
-	CComTearOffObjectBase() {m_pOwner = 0;}
-};
-
-
-
-template <class Base>
-class CComObject : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObject(void* = 0) throw()
-	{
-		_pAtlModule->Lock();
-	}
-	
-	
-	virtual ~CComObject() throw()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-		_pAtlModule->Unlock();
-	}
-	
-	
-	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
-	virtual ULONG __stdcall Release()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{return _InternalQueryInterface(iid, ppvObject);}
-	template <class Q>
-	HRESULT __stdcall QueryInterface(Q** pp) throw()
-	{
-		return QueryInterface(__uuidof(Q), (void**)pp);
-	}
-
-	static HRESULT __stdcall CreateInstance(CComObject<Base>** pp) throw();
-};
-
-template <class Base>
-HRESULT __stdcall CComObject<Base>::CreateInstance(CComObject<Base>** pp) throw()
-{
-	(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2674, 0, L"pp != 0")) || (__debugbreak(), 0));
-	if (pp == 0)
-		return ((HRESULT)0x80004003L);
-	*pp = 0;
-
-	HRESULT hRes = ((HRESULT)0x8007000EL);
-	CComObject<Base>* p = 0;
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComObject<Base>();} catch(...) {} __pragma(warning(pop))
-	if (p != 0)
-	{
-		p->SetVoid(0);
-		p->InternalFinalConstructAddRef();
-		hRes = p->_AtlInitialConstruct();
-		if (((HRESULT)(hRes) >= 0))
-			hRes = p->FinalConstruct();
-		if (((HRESULT)(hRes) >= 0))
-			hRes = p->_AtlFinalConstruct();
-		p->InternalFinalConstructRelease();
-		if (hRes != ((HRESULT)0x00000000L))
-		{
-			delete p;
-			p = 0;
-		}
-	}
-	*pp = p;
-	return hRes;
-}
-
-
-
-
-
-template <class Base>
-class CComObjectCached : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObjectCached(void* = 0){}
-	
-	
-	
-	 ~CComObjectCached()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-	}
-	
-	
-	virtual ULONG __stdcall AddRef() throw()
-	{
-		ULONG l = InternalAddRef();
-		if (l == 2)
-			_pAtlModule->Lock();
-		return l;
-	}
-	virtual ULONG __stdcall Release() throw()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		else if (l == 1)
-			_pAtlModule->Unlock();
-		return l;
-	}
-	
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{return _InternalQueryInterface(iid, ppvObject);}
-	static HRESULT __stdcall CreateInstance(CComObjectCached<Base>** pp) throw();
-};
-
-template <class Base>
-HRESULT __stdcall CComObjectCached<Base>::CreateInstance(CComObjectCached<Base>** pp) throw()
-{
-	(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2750, 0, L"pp != 0")) || (__debugbreak(), 0));
-	if (pp == 0)
-		return ((HRESULT)0x80004003L);
-	*pp = 0;
-
-	HRESULT hRes = ((HRESULT)0x8007000EL);
-	CComObjectCached<Base>* p = 0;
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComObjectCached<Base>();} catch(...) {} __pragma(warning(pop))
-	if (p != 0)
-	{
-		p->SetVoid(0);
-		p->InternalFinalConstructAddRef();
-		hRes = p->_AtlInitialConstruct();
-		if (((HRESULT)(hRes) >= 0))
-			hRes = p->FinalConstruct();
-		if (((HRESULT)(hRes) >= 0))
-			hRes = p->_AtlFinalConstruct();
-		p->InternalFinalConstructRelease();
-		if (hRes != ((HRESULT)0x00000000L))
-		{
-			delete p;
-			p = 0;
-		}
-	}
-	*pp = p;
-	return hRes;
-}
-
-
-
-
-template <class Base>
-class CComObjectNoLock : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObjectNoLock(void* = 0){}
-	
-	
-
-	
-	 ~CComObjectNoLock()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-	}
-
-	
-	
-	virtual ULONG __stdcall AddRef() throw() {return InternalAddRef();}
-	virtual ULONG __stdcall Release() throw()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{return _InternalQueryInterface(iid, ppvObject);}
-};
-
-
-
-
-template <class Base>
-class CComObjectGlobal : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObjectGlobal(void* = 0)
-	{
-		m_hResFinalConstruct = ((HRESULT)0x00000000L);
-		__if_exists(FinalConstruct)
-		{
-			__if_exists(InternalFinalConstructAddRef)
-			{
-				InternalFinalConstructAddRef();
-			}
-			m_hResFinalConstruct = _AtlInitialConstruct();
-			if (((HRESULT)(m_hResFinalConstruct) >= 0))
-				m_hResFinalConstruct = FinalConstruct();
-			__if_exists(InternalFinalConstructRelease)
-			{
-				InternalFinalConstructRelease();
-			}
-		}
-	}
-	virtual ~CComObjectGlobal()
-	{
-		__if_exists(FinalRelease)
-		{
-			FinalRelease();
-		}
-
-
-
-	}
-
-	virtual ULONG __stdcall AddRef() throw()
-	{
-		return _pAtlModule->Lock();
-	}
-	virtual ULONG __stdcall Release() throw()
-	{
-		return _pAtlModule->Unlock();
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{
-		return _InternalQueryInterface(iid, ppvObject);
-	}
-	HRESULT m_hResFinalConstruct;
-};
-
-
-
-template <class Base>
-class CComObjectStack : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObjectStack(void* = 0)
-	{
-		m_hResFinalConstruct = _AtlInitialConstruct();
-		if (((HRESULT)(m_hResFinalConstruct) >= 0))
-			m_hResFinalConstruct = FinalConstruct();
-	}
-	virtual ~CComObjectStack()
-	{
-		FinalRelease();
-
-
-
-	}
-
-
-	virtual ULONG __stdcall AddRef() throw() {(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2889, 0, L"0")) || (__debugbreak(), 0));return 0;}
-	virtual ULONG __stdcall Release() throw() {(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2890, 0, L"0")) || (__debugbreak(), 0));return 0;}
-	virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw()
-	{(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2892, 0, L"0")) || (__debugbreak(), 0));return ((HRESULT)0x80004002L);}
-	HRESULT m_hResFinalConstruct;
-};
-
-
-template <class Base>
-class CComObjectStackEx : public Base
-{
-public:
-	typedef Base _BaseClass;
-
-	CComObjectStackEx(void* = 0) 
-	{ 
-
-		m_dwRef = 0;
-
-		m_hResFinalConstruct = _AtlInitialConstruct();
-		if (((HRESULT)(m_hResFinalConstruct) >= 0))
-			m_hResFinalConstruct = FinalConstruct(); 
-	}
-
-	virtual ~CComObjectStackEx()
-	{
-		
-		
-		
-		
-		
-		
-		do { (void) ((!!((m_dwRef == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2921, 0, L"m_dwRef == 0")) || (__debugbreak(), 0)); ; } while(0);
-		FinalRelease();
-
-
-
-	}
-
-	virtual ULONG __stdcall AddRef() throw()
-	{
-
-		return InternalAddRef();
-
-
-
-	}
-
-	virtual ULONG __stdcall Release() throw()
-	{
-
-		return InternalRelease();
-
-
-
-	}
-
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{
-		return _InternalQueryInterface(iid, ppvObject);
-	}
-
-	HRESULT m_hResFinalConstruct;
-};
-
-template <class Base> 
-class CComContainedObject : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComContainedObject(void* pv) {m_pOuterUnknown = (IUnknown*)pv;}
-
-
-
-
-
-
-
-
-	virtual ULONG __stdcall AddRef() throw() {return OuterAddRef();}
-	virtual ULONG __stdcall Release() throw() {return OuterRelease();}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{
-		return OuterQueryInterface(iid, ppvObject);
-	}
-	template <class Q>
-	HRESULT __stdcall QueryInterface(Q** pp)
-	{
-		return QueryInterface(__uuidof(Q), (void**)pp);
-	}
-	
-	
-	IUnknown* GetControllingUnknown() throw()
-	{
-
-
-
-
-
-		return m_pOuterUnknown;
-
-	}
-};
-
-
-
-template <class contained>
-class CComAggObject :
-	public IUnknown,
-	public CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >
-{
-public:
-	typedef contained _BaseClass;
-	CComAggObject(void* pv) : m_contained(pv)
-	{
-		_pAtlModule->Lock();
-	}
-	HRESULT _AtlInitialConstruct()
-	{
-		HRESULT hr = m_contained._AtlInitialConstruct();
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
-		}
-		return hr;
-	}
-	
-	
-	HRESULT FinalConstruct()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
-		return m_contained.FinalConstruct();
-	}
-	void FinalRelease()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
-		m_contained.FinalRelease();
-	}
-	
-	
-	virtual ~CComAggObject()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-		_pAtlModule->Unlock();
-	}
-
-	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
-	virtual ULONG __stdcall Release()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
-	{
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3049, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		HRESULT hRes = ((HRESULT)0x00000000L);
-		if (InlineIsEqualUnknown(iid))
-		{
-			*ppvObject = (void*)(IUnknown*)this;
-			AddRef();
-
-
-
-		}
-		else
-			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
-		return hRes;
-	}
-	template <class Q>
-	HRESULT __stdcall QueryInterface(Q** pp)
-	{
-		return QueryInterface(__uuidof(Q), (void**)pp);
-	}
-	static HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, CComAggObject<contained>** pp)
-	{
-		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3074, 0, L"pp != 0")) || (__debugbreak(), 0));
-		if (pp == 0)
-			return ((HRESULT)0x80004003L);
-		*pp = 0;
-
-		HRESULT hRes = ((HRESULT)0x8007000EL);
-		CComAggObject<contained>* p = 0;
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComAggObject<contained>(pUnkOuter);} catch(...) {} __pragma(warning(pop))
-		if (p != 0)
-		{
-			p->SetVoid(0);
-			p->InternalFinalConstructAddRef();
-			hRes = p->_AtlInitialConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->FinalConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->_AtlFinalConstruct();
-			p->InternalFinalConstructRelease();
-			if (hRes != ((HRESULT)0x00000000L))
-			{
-				delete p;
-				p = 0;
-			}
-		}
-		*pp = p;
-		return hRes;
-	}
-
-	CComContainedObject<contained> m_contained;
-};
-
-
-
-
-template <class contained>
-class CComPolyObject :
-	public IUnknown,
-	public CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >
-{
-public:
-	typedef contained _BaseClass;
-	CComPolyObject(void* pv) : m_contained(pv ? pv : this)
-	{
-		_pAtlModule->Lock();
-	}
-	HRESULT _AtlInitialConstruct()
-	{
-		HRESULT hr = m_contained._AtlInitialConstruct();
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
-		}
-		return hr;
-	}
-	
-	
-	HRESULT FinalConstruct()
-	{
-		InternalAddRef();
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
-		HRESULT hr = m_contained.FinalConstruct();
-		InternalRelease();
-		return hr;
-	}
-	void FinalRelease()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
-		m_contained.FinalRelease();
-	}
-	
-	
-	virtual ~CComPolyObject()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-		_pAtlModule->Unlock();
-	}
-
-	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
-	virtual ULONG __stdcall Release()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
-	{
-
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3166, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		HRESULT hRes = ((HRESULT)0x00000000L);
-		if (InlineIsEqualUnknown(iid))
-		{
-			*ppvObject = (void*)(IUnknown*)this;
-			AddRef();
-
-
-
-		}
-		else
-			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
-		return hRes;
-	}
-	template <class Q>
-	HRESULT __stdcall QueryInterface(Q** pp)
-	{
-		return QueryInterface(__uuidof(Q), (void**)pp);
-	}
-	static HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, CComPolyObject<contained>** pp)
-	{
-		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3192, 0, L"pp != 0")) || (__debugbreak(), 0));
-		if (pp == 0)
-			return ((HRESULT)0x80004003L);
-		*pp = 0;
-
-
-		HRESULT hRes = ((HRESULT)0x8007000EL);
-		CComPolyObject<contained>* p = 0;
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComPolyObject<contained>(pUnkOuter);} catch(...) {} __pragma(warning(pop))
-		if (p != 0)
-		{
-			p->SetVoid(0);
-			p->InternalFinalConstructAddRef();
-			hRes = p->_AtlInitialConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->FinalConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->_AtlFinalConstruct();
-			p->InternalFinalConstructRelease();
-			if (hRes != ((HRESULT)0x00000000L))
-			{
-				delete p;
-				p = 0;
-			}
-		}
-		*pp = p;
-		return hRes;
-	}
-
-	CComContainedObject<contained> m_contained;
-};
-
-template <class Base>
-class CComTearOffObject : public Base
-{
-public:
-	CComTearOffObject(void* pv)
-	{
-		do { (void) ((!!((m_pOwner == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3230, 0, L"m_pOwner == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_pOwner = reinterpret_cast<Base::_OwnerClass*>(pv);
-		m_pOwner->AddRef();
-	}
-	
-	
-	~CComTearOffObject()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-		m_pOwner->Release();
-	}
-
-	virtual ULONG __stdcall AddRef() throw() {return InternalAddRef();}
-	virtual ULONG __stdcall Release() throw()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{
-		return m_pOwner->QueryInterface(iid, ppvObject);
-	}
-};
-
-template <class contained>
-class CComCachedTearOffObject :
-	public IUnknown,
-	public CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>
-{
-public:
-	typedef contained _BaseClass;
-	CComCachedTearOffObject(void* pv) :
-		m_contained(((contained::_OwnerClass*)pv)->GetControllingUnknown())
-	{
-		do { (void) ((!!((m_contained.m_pOwner == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3270, 0, L"m_contained.m_pOwner == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_contained.m_pOwner = reinterpret_cast<contained::_OwnerClass*>(pv);
-	}
-	HRESULT _AtlInitialConstruct()
-	{
-		HRESULT hr = m_contained._AtlInitialConstruct();
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
-		}
-		return hr;
-	}
-	
-	
-	HRESULT FinalConstruct()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
-		return m_contained.FinalConstruct();
-	}
-	void FinalRelease()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
-		m_contained.FinalRelease();
-	}
-	
-	
-	~CComCachedTearOffObject()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-	}
-
-
-	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
-	virtual ULONG __stdcall Release()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
-	{
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3316, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		HRESULT hRes = ((HRESULT)0x00000000L);
-		if (InlineIsEqualUnknown(iid))
-		{
-			*ppvObject = (void*)(IUnknown*)this;
-			AddRef();
-
-
-
-		}
-		else
-			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
-		return hRes;
-	}
-	CComContainedObject<contained> m_contained;
-};
-
-
-class CComClassFactory :
-	public IClassFactory,
-	public CComObjectRootEx<CComGlobalsThreadModel>
-{
-public:
-	public: typedef CComClassFactory _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3343, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactory", (ATL::_ATL_CREATORARGFUNC*)0},
-		{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-
-	
-	 ~CComClassFactory()
-	{
-	}
-	
-	
-	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, const IID & riid, void** ppvObj)
-	{
-		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3355, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (ppvObj != 0)
-		{
-			*ppvObj = 0;
-			
-
-			if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3364)(atlTraceCOM, 0, L"CComClassFactory: asked for non IUnknown interface while creating an aggregated object");
-				hRes = ((HRESULT)0x80040110L);
-			}
-			else
-				hRes = m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
-		}
-		return hRes;
-	}
-
-	virtual HRESULT __stdcall LockServer(BOOL fLock)
-	{
-		if (fLock)
-			_pAtlModule->Lock();
-		else
-			_pAtlModule->Unlock();
-		return ((HRESULT)0x00000000L);
-	}
-	
-	void SetVoid(void* pv)
-	{
-		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
-	}
-	_ATL_CREATORFUNC* m_pfnCreateInstance;
-};
-
-template <class license>
-class CComClassFactory2 : 
-	public IClassFactory2,
-	public CComObjectRootEx<CComGlobalsThreadModel>,
-	public license
-{
-public:
-	typedef license _LicenseClass;
-	typedef CComClassFactory2<license> _ComMapClass;
-public: typedef CComClassFactory2<license> _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3398, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactory2<license>", (ATL::_ATL_CREATORARGFUNC*)0},
-	{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	{&__uuidof(IClassFactory2), ((DWORD_PTR)(static_cast<IClassFactory2*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-	
-	virtual HRESULT __stdcall LockServer(BOOL fLock)
-	{
-		if (fLock)
-			_pAtlModule->Lock();
-		else
-			_pAtlModule->Unlock();
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter,
-		const IID & riid, void** ppvObj)
-	{
-		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3414, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
-		if (ppvObj == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObj = 0;
-		if (!IsLicenseValid())
-			return ((HRESULT)0x80040112L);
-
-		if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
-			return ((HRESULT)0x80040110L);
-		else
-			return m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
-	}
-	
-	virtual HRESULT __stdcall CreateInstanceLic(IUnknown* pUnkOuter, 
-	  IUnknown* , const IID & riid, BSTR bstrKey, 
-	  void** ppvObject)
-	{
-		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3431, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-		if ( ((bstrKey != 0) && !VerifyLicenseKey(bstrKey)) ||
-			 ((bstrKey == 0) && !IsLicenseValid()) )
-			return ((HRESULT)0x80040112L);
-		if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
-			return ((HRESULT)0x80040110L);
-		else
-			return m_pfnCreateInstance(pUnkOuter, riid, ppvObject);
-	}
-	virtual HRESULT __stdcall RequestLicKey(DWORD dwReserved, BSTR* pbstrKey)
-	{
-		if (pbstrKey == 0)
-			return ((HRESULT)0x80004003L);
-		*pbstrKey = 0;
-
-		if (!IsLicenseValid())
-			return ((HRESULT)0x80040112L);
-		return GetLicenseKey(dwReserved,pbstrKey) ? ((HRESULT)0x00000000L) : ((HRESULT)0x80004005L);
-	}
-	virtual HRESULT __stdcall GetLicInfo(LICINFO* pLicInfo)
-	{
-		if (pLicInfo == 0)
-			return ((HRESULT)0x80004003L);
-		pLicInfo->cbLicInfo = sizeof(LICINFO);
-		pLicInfo->fLicVerified = IsLicenseValid();
-		BSTR bstr = 0;
-		pLicInfo->fRuntimeKeyAvail = GetLicenseKey(0,&bstr);
-		::SysFreeString(bstr);
-		return ((HRESULT)0x00000000L);
-	}
-	void SetVoid(void* pv)
-	{
-		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
-	}
-	_ATL_CREATORFUNC* m_pfnCreateInstance;
-};
-
-
-
-class CComClassFactoryAutoThread :
-	public IClassFactory,
-	public CComObjectRootEx<CComGlobalsThreadModel>
-{
-public:
-	public: typedef CComClassFactoryAutoThread _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3478, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactoryAutoThread", (ATL::_ATL_CREATORARGFUNC*)0},
-		{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-
-	
-	 ~CComClassFactoryAutoThread()
-	{
-	}
-	
-	
-	void SetVoid(void* pv)
-	{
-		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
-	}
-	HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter,
-		const IID & riid, void** ppvObj)
-	{
-		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3495, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (ppvObj != 0)
-		{
-			*ppvObj = 0;
-			
-			(void) ((!!((pUnkOuter == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3501, 0, L"pUnkOuter == 0")) || (__debugbreak(), 0));
-			if (pUnkOuter != 0)
-				hRes = ((HRESULT)0x80040110L);
-			else
-			{
-				(void) ((!!((_pAtlAutoThreadModule && L"Global instance of CAtlAutoThreadModule not declared"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3506, 0, L"_pAtlAutoThreadModule && L\"Global instance of CAtlAutoThreadModule not declared\"")) || (__debugbreak(), 0));
-				if (_pAtlAutoThreadModule == 0)
-					return ((HRESULT)0x80004005L);
-
-				hRes = _pAtlAutoThreadModule->CreateInstance(m_pfnCreateInstance, riid, ppvObj);
-			}
-		}
-		return hRes;
-	}
-	HRESULT __stdcall LockServer(BOOL fLock)
-	{
-		if (fLock)
-			_pAtlModule->Lock();
-		else
-			_pAtlModule->Unlock();
-		return ((HRESULT)0x00000000L);
-	}
-	_ATL_CREATORFUNC* m_pfnCreateInstance;
-};
-
-
-
-
-template <class T>
-class CComClassFactorySingleton : public CComClassFactory
-{
-public:
-	CComClassFactorySingleton() : m_hrCreate(((HRESULT)0x00000000L))
-	{
-	}
-	
-	 ~CComClassFactorySingleton()
-	{
-	}
-	
-	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, const IID & riid, void** ppvObj)
-	{
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (ppvObj != 0)
-		{
-			*ppvObj = 0;
-			
-			(void) ((!!((pUnkOuter == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3548, 0, L"pUnkOuter == 0")) || (__debugbreak(), 0));
-			if (pUnkOuter != 0)
-				hRes = ((HRESULT)0x80040110L);
-			else
-			{
-				if (m_hrCreate == ((HRESULT)0x00000000L) && m_spObj == 0)
-				{
-					__try
-					{
-						Lock();
-						
-						if (m_hrCreate == ((HRESULT)0x00000000L) && m_spObj == 0)
-						{
-							CComObjectCached<T> *p;
-							m_hrCreate = CComObjectCached<T>::CreateInstance(&p);
-							if (((HRESULT)(m_hrCreate) >= 0))
-							{
-								m_hrCreate = p->QueryInterface(IID_IUnknown, (void**)&m_spObj);
-								if (((HRESULT)(m_hrCreate) < 0))
-								{
-									delete p;
-								}
-							}
-						}
-					}
-					__finally
-					{
-						Unlock();
-					}
-				}
-				if (m_hrCreate == ((HRESULT)0x00000000L))
-				{
-					hRes = m_spObj->QueryInterface(riid, ppvObj);
-				}
-				else
-				{
-					hRes = m_hrCreate;
-				}
-			}
-		}
-		return hRes;
-	}
-	HRESULT m_hrCreate;
-	CComPtr<IUnknown> m_spObj;
-};
-
-
-template <class T, const CLSID* pclsid = &GUID_NULL>
-class CComCoClass
-{
-public:
-	typedef ATL::CComCreator< ATL::CComObjectCached< ATL::CComClassFactory > > _ClassFactoryCreatorClass;
-	public: typedef ATL::CComCreator2< ATL::CComCreator< ATL::CComObject< T > >, ATL::CComCreator< ATL::CComAggObject< T > > > _CreatorClass;
-	typedef T _CoClass;
-	static const CLSID& __stdcall GetObjectCLSID() {return *pclsid;}
-	static LPCTSTR __stdcall GetObjectDescription() {return 0;}
-	static HRESULT __stdcall Error(LPCOLESTR lpszDesc,
-		const IID& iid = GUID_NULL, HRESULT hRes = 0)
-	{
-		return AtlReportError(GetObjectCLSID(), lpszDesc, iid, hRes);
-	}
-	static HRESULT __stdcall Error(LPCOLESTR lpszDesc, DWORD dwHelpID,
-		LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
-	{
-		return AtlReportError(GetObjectCLSID(), lpszDesc, dwHelpID, lpszHelpFile,
-			iid, hRes);
-	}
-	static HRESULT __stdcall Error(UINT nID, const IID& iid = GUID_NULL,
-		HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
-	{
-		return AtlReportError(GetObjectCLSID(), nID, iid, hRes, hInst);
-	}
-	static HRESULT __stdcall Error(UINT nID, DWORD dwHelpID,
-		LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL,
-		HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
-	{
-		return AtlReportError(GetObjectCLSID(), nID, dwHelpID, lpszHelpFile,
-			iid, hRes, hInst);
-	}
-	static HRESULT __stdcall Error(LPCSTR lpszDesc,
-		const IID& iid = GUID_NULL, HRESULT hRes = 0)
-	{
-		return AtlReportError(GetObjectCLSID(), lpszDesc, iid, hRes);
-	}
-	static HRESULT __stdcall Error(LPCSTR lpszDesc, DWORD dwHelpID,
-		LPCSTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
-	{
-		return AtlReportError(GetObjectCLSID(), lpszDesc, dwHelpID,
-			lpszHelpFile, iid, hRes);
-	}
-	template <class Q>
-	static HRESULT CreateInstance(IUnknown* punkOuter, Q** pp)
-	{
-		return T::_CreatorClass::CreateInstance(punkOuter, __uuidof(Q), (void**) pp);
-	}
-	template <class Q>
-	static HRESULT CreateInstance(Q** pp)
-	{
-		return T::_CreatorClass::CreateInstance(0, __uuidof(Q), (void**) pp);
-	}
-};
-
-
-
-class CComTypeInfoHolder
-{
-
-public:
-	const GUID* m_pguid;
-	const GUID* m_plibid;
-	WORD m_wMajor;
-	WORD m_wMinor;
-
-	ITypeInfo* m_pInfo;
-	long m_dwRef;
-	struct stringdispid
-	{
-		CComBSTR bstr;
-		int nLen;
-		DISPID id;
-		stringdispid() : nLen(0), id(( -1 )){}
-	};
-	stringdispid* m_pMap;
-	int m_nCount;
-
-public:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
-	{
-		(void) ((!!((ppInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3694, 0, L"ppInfo != 0")) || (__debugbreak(), 0));
-		if (ppInfo == 0)
-			return ((HRESULT)0x80004003L);
-
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_pInfo == 0)
-			hr = GetTI(lcid);
-		*ppInfo = m_pInfo;
-		if (m_pInfo != 0)
-		{
-			m_pInfo->AddRef();
-			hr = ((HRESULT)0x00000000L);
-		}
-		return hr;
-	}
-	HRESULT GetTI(LCID lcid);
-	HRESULT EnsureTI(LCID lcid)
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_pInfo == 0 || m_pMap == 0)
-			hr = GetTI(lcid);
-		return hr;
-	}
-
-	
-	
-	static void __stdcall Cleanup(DWORD_PTR dw);
-
-	HRESULT GetTypeInfo(UINT , LCID lcid, ITypeInfo** pptinfo)
-	{
-		return GetTI(lcid, pptinfo);
-	}
-	HRESULT GetIDsOfNames(const IID & , LPOLESTR* rgszNames, UINT cNames,
-		LCID lcid, DISPID* rgdispid)
-	{
-		HRESULT hRes = EnsureTI(lcid);
-		if (m_pInfo != 0)
-		{
-			hRes = ((HRESULT)0x80004005L);
-			
-			
-			
-			if (m_pMap != 0 && cNames == 1)
-			{
-				int n = int( ocslen(rgszNames[0]) );
-				for (int j=m_nCount-1; j>=0; j--)
-				{
-					if ((n == m_pMap[j].nLen) &&
-						(memcmp(m_pMap[j].bstr, rgszNames[0], m_pMap[j].nLen * sizeof(OLECHAR)) == 0))
-					{
-						rgdispid[0] = m_pMap[j].id;
-						hRes = ((HRESULT)0x00000000L);
-						break;
-					}
-				}
-			}
-			
-			
-			if (((HRESULT)(hRes) < 0))
-			{
-				hRes = m_pInfo->GetIDsOfNames(rgszNames, cNames, rgdispid);
-			}
-		}
-		return hRes;
-	}
-
-	HRESULT Invoke(IDispatch* p, DISPID dispidMember, const IID & ,
-		LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
-		EXCEPINFO* pexcepinfo, UINT* puArgErr)
-	{
-		HRESULT hRes = EnsureTI(lcid);
-		if (m_pInfo != 0)
-			hRes = m_pInfo->Invoke(p, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
-		return hRes;
-	}
-	 HRESULT LoadNameCache(ITypeInfo* pTypeInfo)
-	{
-		TYPEATTR* pta;
-		HRESULT hr = pTypeInfo->GetTypeAttr(&pta);
-		if (((HRESULT)(hr) >= 0))
-		{
-			stringdispid* pMap = 0;
-			m_nCount = pta->cFuncs;
-			m_pMap = 0;
-			if (m_nCount != 0)
-			{
-				__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pMap = new stringdispid[m_nCount];} catch(...) {} __pragma(warning(pop));
-				if (pMap == 0)
-				{
-					pTypeInfo->ReleaseTypeAttr(pta);
-					return ((HRESULT)0x8007000EL);
-				}
-			}
-			for (int i=0; i<m_nCount; i++)
-			{
-				FUNCDESC* pfd;
-				if (((HRESULT)(pTypeInfo->GetFuncDesc(i, &pfd)) >= 0))
-				{
-					CComBSTR bstrName;
-					if (((HRESULT)(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, 0, 0, 0)) >= 0))
-					{
-						pMap[i].bstr.Attach(bstrName.Detach());
-						pMap[i].nLen = SysStringLen(pMap[i].bstr);
-						pMap[i].id = pfd->memid;
-					}
-					pTypeInfo->ReleaseFuncDesc(pfd);
-				}
-			}
-			m_pMap = pMap;
-			pTypeInfo->ReleaseTypeAttr(pta);
-		}
-		return ((HRESULT)0x00000000L);
-	}
-};
-
-    inline void __stdcall CComTypeInfoHolder::Cleanup(DWORD_PTR dw)
-	{
-		(void) ((!!((dw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3811, 0, L"dw != 0")) || (__debugbreak(), 0));
-		if (dw == 0)
-			return;
-			
-		CComTypeInfoHolder* p = (CComTypeInfoHolder*) dw;
-		if (p->m_pInfo != 0)
-			p->m_pInfo->Release();
-		p->m_pInfo = 0;
-		delete [] p->m_pMap;
-		p->m_pMap = 0;
-	}
-
-inline HRESULT CComTypeInfoHolder::GetTI(LCID lcid)
-{
-	
-	do { (void) ((!!((m_plibid != 0 && m_pguid != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3826, 0, L"m_plibid != 0 && m_pguid != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	if (m_pInfo != 0 && m_pMap != 0)
-		return ((HRESULT)0x00000000L);
-
-	CComCritSecLock<CComCriticalSection> lock(_pAtlModule->m_csStaticDataInitAndTypeInfo, false);
-	HRESULT hRes = lock.Lock();
-	if (((HRESULT)(hRes) < 0))
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3835)(atlTraceCOM, 0, L"ERROR : Unable to lock critical section in CComTypeInfoHolder::GetTI\n");
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3836, 0, L"0")) || (__debugbreak(), 0));
-		return hRes;
-	}
-	hRes = ((HRESULT)0x80004005L);
-	if (m_pInfo == 0)
-	{
-		ITypeLib* pTypeLib = 0;
-		if (InlineIsEqualGUID(CAtlModule::m_libid, *m_plibid) && m_wMajor == 0xFFFF && m_wMinor == 0xFFFF)
-		{
-			TCHAR szFilePath[260];
-			DWORD dwFLen = ::GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), szFilePath, 260);
-			if( dwFLen != 0 && dwFLen != 260 )
-			{
-				int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-				LPOLESTR pszFile = T2OLE_EX(szFilePath, 1024);
-
-
-
-
-				hRes = LoadTypeLib(pszFile, &pTypeLib);
-			}
-		}
-		else
-		{
-			do { (void) ((!!((!InlineIsEqualGUID(*m_plibid, GUID_NULL) && "Module LIBID not initialized. See DECLARE_LIBID documentation."))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3860, 0, L"!InlineIsEqualGUID(*m_plibid, GUID_NULL) && \"Module LIBID not initialized. See DECLARE_LIBID documentation.\"")) || (__debugbreak(), 0)); ; } while(0);
-			hRes = LoadRegTypeLib(*m_plibid, m_wMajor, m_wMinor, lcid, &pTypeLib);
-
-			if (((HRESULT)(hRes) >= 0))
-			{
-				
-				
-				
-				
-				
-				
-				
-				
-				
-				TCHAR szFilePath[260];
-				DWORD dwFLen = ::GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), szFilePath, 260);
-				if( dwFLen != 0 && dwFLen != 260 )
-				{
-					int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-					CComPtr<ITypeLib> spTypeLibModule;
-					HRESULT hRes2 = ((HRESULT)0x00000000L);
-					LPOLESTR pszFile = T2OLE_EX(szFilePath, 1024);
-					if (pszFile == 0)
-						hRes2 = ((HRESULT)0x8007000EL);
-					else
-						hRes2 = LoadTypeLib(pszFile, &spTypeLibModule);
-					if (((HRESULT)(hRes2) >= 0))
-					{
-						TLIBATTR* pLibAttr;
-						hRes2 = spTypeLibModule->GetLibAttr(&pLibAttr);
-						if (((HRESULT)(hRes2) >= 0))
-						{
-							if (InlineIsEqualGUID(pLibAttr->guid, *m_plibid) &&
-								(pLibAttr->wMajorVerNum != m_wMajor ||
-								pLibAttr->wMinorVerNum != m_wMinor))
-							{
-								ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3896)(atlTraceCOM, 0, L"Warning : CComTypeInfoHolder::GetTI : Loaded typelib does not match the typelib in the module : %s\n", szFilePath);
-								ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3897)(atlTraceCOM, 0, L"\tSee IDispatchImpl overview help topic for more information\n", szFilePath);							
-							}
-							spTypeLibModule->ReleaseTLibAttr(pLibAttr);
-						}
-					}
-				}
-			}
-			else
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3906)(atlTraceCOM, 0, L"ERROR : Unable to load Typelibrary. (HRESULT = 0x%x)\n", hRes);
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3907)(atlTraceCOM, 0, L"\tVerify TypelibID and major version specified with\n");
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3908)(atlTraceCOM, 0, L"\tIDispatchImpl, CStockPropImpl, IProvideClassInfoImpl or IProvideCLassInfo2Impl\n");
-			}
-
-		}
-		if (((HRESULT)(hRes) >= 0))
-		{
-			CComPtr<ITypeInfo> spTypeInfo;
-			hRes = pTypeLib->GetTypeInfoOfGuid(*m_pguid, &spTypeInfo);
-			if (((HRESULT)(hRes) >= 0))
-			{
-				CComPtr<ITypeInfo> spInfo(spTypeInfo);
-				CComPtr<ITypeInfo2> spTypeInfo2;
-				if (((HRESULT)(spTypeInfo->QueryInterface(&spTypeInfo2)) >= 0))
-					spInfo = spTypeInfo2;
-
-				m_pInfo = spInfo.Detach();
-
-				_pAtlModule->AddTermFunc(Cleanup, (DWORD_PTR)this);
-
-			}
-			pTypeLib->Release();
-		}
-	}
-	else
-	{
-		
-		hRes = ((HRESULT)0x00000000L);
-	}
-
-	if (m_pInfo != 0 && m_pMap == 0)
-	{
-		hRes=LoadNameCache(m_pInfo);
-	}
-
-	return hRes;
-}
-
-
-
-
-
-template <class T>
-class __declspec(novtable) IObjectWithSiteImpl : public IObjectWithSite
-{
-public:
-	virtual ~IObjectWithSiteImpl()
-	{
-	}
-	
-	virtual HRESULT __stdcall SetSite(IUnknown *pUnkSite)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3959)(atlTraceCOM, 2, L"IObjectWithSiteImpl::SetSite\n");
-		T* pT = static_cast<T*>(this);
-		pT->m_spUnkSite = pUnkSite;
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall GetSite(const IID & riid, void **ppvSite)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3966)(atlTraceCOM, 2, L"IObjectWithSiteImpl::GetSite\n");
-		T* pT = static_cast<T*>(this);
-		(void) ((!!((ppvSite))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3968, 0, L"ppvSite")) || (__debugbreak(), 0));
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (ppvSite != 0)
-		{
-			if (pT->m_spUnkSite)
-				hRes = pT->m_spUnkSite->QueryInterface(riid, ppvSite);
-			else
-			{
-				*ppvSite = 0;
-				hRes = ((HRESULT)0x80004005L);
-			}
-		}
-		return hRes;
-	}
-
-	HRESULT SetChildSite(IUnknown* punkChild)
-	{
-		if (punkChild == 0)
-			return ((HRESULT)0x80004003L);
-
-		HRESULT hr;
-		CComPtr<IObjectWithSite> spChildSite;
-		hr = punkChild->QueryInterface(__uuidof(IObjectWithSite), (void**)&spChildSite);
-		if (((HRESULT)(hr) >= 0))
-			hr = spChildSite->SetSite((IUnknown*)this);
-
-		return hr;
-	}
-
-	static HRESULT SetChildSite(IUnknown* punkChild, IUnknown* punkParent)
-	{
-		return AtlSetChildSite(punkChild, punkParent);
-	}
-
-	CComPtr<IUnknown> m_spUnkSite;
-};
-
-
-
-
-template <class T>
-class __declspec(novtable) IServiceProviderImpl : public IServiceProvider
-{
-public:
-	virtual HRESULT __stdcall QueryService(const GUID & guidService, const IID & riid, void** ppvObject)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4014)(atlTraceCOM, 2, L"IServiceProviderImpl::QueryService\n");
-
-		T* pT = static_cast<T*>(this);
-		return pT->_InternalQueryService(guidService, riid, ppvObject);
-	}
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlGetObjectSourceInterface(IUnknown* punkObj, GUID* plibid, IID* piid, unsigned short* pdwMajor, unsigned short* pdwMinor);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C"
-{
-void __stdcall CComStdCallThunkHelper();
-}
-
-template <class T>
-class CComStdCallThunk
-{
-public:
-	typedef void (__stdcall T::*TMFP)();
-	void *pVTable;								
-	void *pThis;								
-	TMFP pfn;									
-	void (__stdcall *pfnHelper)();				
-												
-
-	void Init(TMFP pf, void *p)
-	{
-		pfnHelper = CComStdCallThunkHelper;
-		pVTable = &pfnHelper;
-		pThis = p;
-		pfn = pf;
-	}
-};
-
-
-
-
-
-
-
-
-struct _ATL_FUNC_INFO
-{
-	CALLCONV cc;
-	VARTYPE vtReturn;
-	SHORT nParams;
-	VARTYPE pVarTypes[8];
-};
-
-class __declspec(novtable) _IDispEvent
-{
-public:
-	_IDispEvent() : m_libid(GUID_NULL), m_iid(GUID_NULL), m_wMajorVerNum(0), m_wMinorVerNum(0), m_dwEventCookie(0xFEFEFEFE) { }
-	
-	virtual HRESULT __stdcall _LocDEQueryInterface(const IID & riid, void ** ppvObject) = 0;
-	virtual ULONG __stdcall AddRef(void) = 0;
-	virtual ULONG __stdcall Release(void) = 0;
-	GUID m_libid; 
-	IID m_iid; 
-	unsigned short m_wMajorVerNum;    
-	unsigned short m_wMinorVerNum;    
-	DWORD m_dwEventCookie;
-	HRESULT DispEventAdvise(IUnknown* pUnk, const IID* piid)
-	{
-		do { int __atl_condVal=!!(m_dwEventCookie == 0xFEFEFEFE); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4127, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		return AtlAdvise(pUnk, (IUnknown*)this, *piid, &m_dwEventCookie);
-	}
-	HRESULT DispEventUnadvise(IUnknown* pUnk, const IID* piid)
-	{
-		HRESULT hr = AtlUnadvise(pUnk, *piid, m_dwEventCookie);
-		m_dwEventCookie = 0xFEFEFEFE;
-		return hr;
-	}
-	
-	HRESULT Advise(IUnknown *punk) 
-	{ 
-		HRESULT hr = AtlGetObjectSourceInterface(punk, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		return DispEventAdvise(punk, &m_iid);
-	}
-	HRESULT Unadvise(IUnknown *punk) 
-	{ 
-		HRESULT hr = AtlGetObjectSourceInterface(punk, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		return DispEventUnadvise(punk, &m_iid);
-	}
-};
-
-template <UINT nID, const IID* piid>
-class __declspec(novtable) _IDispEventLocator : public _IDispEvent
-{
-public:
-};
-
-template <UINT nID, class T, const IID* pdiid>
-class __declspec(novtable) IDispEventSimpleImpl : public _IDispEventLocator<nID, pdiid>
-{
-public:
-	virtual HRESULT __stdcall _LocDEQueryInterface(const IID & riid, void ** ppvObject)
-	{
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4165, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		if (InlineIsEqualGUID(riid, GUID_NULL))
-			return ((HRESULT)0x80004002L);
-
-		if (InlineIsEqualGUID(riid, *pdiid) || 
-			InlineIsEqualUnknown(riid) ||
-			InlineIsEqualGUID(riid, __uuidof(IDispatch)) ||
-			InlineIsEqualGUID(riid, m_iid))
-		{
-			*ppvObject = this;
-			AddRef();
-
-
-
-			return ((HRESULT)0x00000000L);
-		}
-		else
-			return ((HRESULT)0x80004002L);
-	}
-
-	
-	virtual ULONG __stdcall AddRef()
-	{
-		return 1;
-	}
-	virtual ULONG __stdcall Release()
-	{
-		return 1;
-	}
-
-	virtual HRESULT __stdcall GetTypeInfoCount(UINT* )
-	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4200)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetTypeInfoCount"); return ((HRESULT)0x80004001L); } while(0);}
-
-	virtual HRESULT __stdcall GetTypeInfo(UINT , LCID , ITypeInfo** )
-	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4203)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetTypeInfo"); return ((HRESULT)0x80004001L); } while(0);}
-
-	virtual HRESULT __stdcall GetIDsOfNames(const IID & , LPOLESTR* , UINT ,
-		LCID , DISPID* )
-	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4207)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetIDsOfNames"); return ((HRESULT)0x80004001L); } while(0);}
-
-	virtual HRESULT __stdcall Invoke(DISPID dispidMember, const IID & ,
-		LCID lcid, WORD , DISPPARAMS* pdispparams, VARIANT* pvarResult,
-		EXCEPINFO* , UINT* )
-	{
-		const _ATL_EVENT_ENTRY<T>* pMap = T::_GetSinkMap();
-		const _ATL_EVENT_ENTRY<T>* pFound = 0;
-		while (pMap->piid != 0)
-		{
-			if ((pMap->nControlID == nID) && (pMap->dispid == dispidMember) && 
-				(IsEqualGUID(*(pMap->piid), *pdiid)))
-			{
-				pFound = pMap;
-				break;
-			}
-			pMap++;
-		}
-		if (pFound == 0)
-			return ((HRESULT)0x00000000L);
-
-
-		_ATL_FUNC_INFO info;
-		_ATL_FUNC_INFO* pInfo;
-		if (pFound->pInfo != 0)
-			pInfo = pFound->pInfo;
-		else
-		{
-			pInfo = &info;
-			HRESULT hr = GetFuncInfoFromId(*pdiid, dispidMember, lcid, info);
-			if (((HRESULT)(hr) < 0))
-				return ((HRESULT)0x00000000L);
-		}
-		return InvokeFromFuncInfo(pFound->pfn, *pInfo, pdispparams, pvarResult);
-	}
-
-	
-	HRESULT InvokeFromFuncInfo(void (__stdcall T::*pEvent)(), _ATL_FUNC_INFO& info, DISPPARAMS* pdispparams, VARIANT* pvarResult)
-	{
-		(void) ((!!((pdispparams->cArgs == (UINT)info.nParams))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4246, 0, L"pdispparams->cArgs == (UINT)info.nParams")) || (__debugbreak(), 0));
-
-		T* pT = static_cast<T*>(this);
-
-		
-		
-		
-		(void) ((!!((info.nParams <= 8))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4253, 0, L"info.nParams <= 8")) || (__debugbreak(), 0));
-		if (info.nParams > 8)
-		{
-			return ((HRESULT)0x80004005L);
-		}
-		VARIANTARG* rgVarArgs[8];
-		VARIANTARG** pVarArgs = info.nParams ? rgVarArgs : 0;
-
-		UINT nIndex = 0;
-
-
-		for (nIndex; nIndex < pdispparams->cNamedArgs; nIndex++)
-			pVarArgs[pdispparams->rgdispidNamedArgs[nIndex]] = &pdispparams->rgvarg[nIndex];
-
-
-		for (; nIndex < pdispparams->cArgs; nIndex++)
-			pVarArgs[info.nParams-nIndex-1] = &pdispparams->rgvarg[nIndex];
-
-		CComStdCallThunk<T> thunk;
-		thunk.Init(pEvent, pT);
-
-		CComVariant tmpResult;
-		if (pvarResult == 0)
-			pvarResult = &tmpResult;
-
-		HRESULT hr = DispCallFunc(
-			&thunk,
-			0,
-			info.cc,
-			info.vtReturn,
-			info.nParams,
-			info.pVarTypes,
-			pVarArgs,
-			pvarResult);
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4287, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		return hr;
-	}
-
-	
-	virtual HRESULT GetFuncInfoFromId(const IID& , DISPID , LCID , _ATL_FUNC_INFO& )
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4294)(L"TODO: Classes using IDispEventSimpleImpl should override this method\n");
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4295, 0, L"0")) || (__debugbreak(), 0));
-		do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4296)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetFuncInfoFromId"); return ((HRESULT)0x80004001L); } while(0);
-	}
-	
-	HRESULT DispEventAdvise(IUnknown* pUnk, const IID* piid)
-	{
-		do { int __atl_condVal=!!(m_dwEventCookie == 0xFEFEFEFE); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4301, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);		
-		return AtlAdvise(pUnk, (IUnknown*)this, *piid, &m_dwEventCookie);
-	}
-	HRESULT DispEventUnadvise(IUnknown* pUnk, const IID* piid)
-	{
-		HRESULT hr = AtlUnadvise(pUnk, *piid, m_dwEventCookie);
-		m_dwEventCookie = 0xFEFEFEFE;
-		return hr;
-	}
-	HRESULT DispEventAdvise(IUnknown* pUnk)
-	{
-		return _IDispEvent::DispEventAdvise(pUnk, pdiid);
-	}
-	HRESULT DispEventUnadvise(IUnknown* pUnk)
-	{
-		return _IDispEvent::DispEventUnadvise(pUnk, pdiid);
-	}
-};
-
-
-template <class T>
-inline HRESULT AtlAdviseSinkMap(T* pT, bool bAdvise)
-{
-	(void) ((!!((::IsWindow(pT->m_hWnd)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4324, 0, L"::IsWindow(pT->m_hWnd)")) || (__debugbreak(), 0));
-	const _ATL_EVENT_ENTRY<T>* pEntries = T::_GetSinkMap();
-	if (pEntries == 0)
-		return ((HRESULT)0x00000000L);
-	HRESULT hr = ((HRESULT)0x00000000L);
-	while (pEntries->piid != 0)
-	{
-		_IDispEvent* pDE = (_IDispEvent*)((DWORD_PTR)pT+pEntries->nOffset);
-		bool bNotAdvised = pDE->m_dwEventCookie == 0xFEFEFEFE;
-		if (bAdvise ^ bNotAdvised)
-		{
-			pEntries++;
-			continue;
-		}
-		hr = ((HRESULT)0x80004005L);
-		HWND h = pT->GetDlgItem(pEntries->nControlID);
-		(void) ((!!((h != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4340, 0, L"h != 0")) || (__debugbreak(), 0));
-		if (h != 0)
-		{
-			CComPtr<IUnknown> spUnk;
-			AtlAxGetControl(h, &spUnk);
-			(void) ((!!((spUnk != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4345, 0, L"spUnk != 0")) || (__debugbreak(), 0));
-			if (spUnk != 0)
-			{
-				if (bAdvise)
-				{
-					if (!InlineIsEqualGUID(GUID_NULL, *pEntries->piid))
-						hr = pDE->DispEventAdvise(spUnk, pEntries->piid);
-					else
-					{
-						hr = AtlGetObjectSourceInterface(spUnk, &pDE->m_libid, &pDE->m_iid, &pDE->m_wMajorVerNum, &pDE->m_wMinorVerNum);
-						if (((HRESULT)(hr) < 0))
-							return hr;
-						hr = pDE->DispEventAdvise(spUnk, &pDE->m_iid);
-					}
-				}
-				else
-				{
-					if (!InlineIsEqualGUID(GUID_NULL, *pEntries->piid))
-						hr = pDE->DispEventUnadvise(spUnk, pEntries->piid);
-					else
-						hr = pDE->DispEventUnadvise(spUnk, &pDE->m_iid);
-				}
-				(void) ((!!((hr == ((HRESULT)0x00000000L)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4367, 0, L"hr == ((HRESULT)0x00000000L)")) || (__debugbreak(), 0));
-			}
-		}
-		if (((HRESULT)(hr) < 0))
-			break;
-		pEntries++;
-	}
-	return hr;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 4061) 
-inline VARTYPE AtlGetUserDefinedType(ITypeInfo *pTI, HREFTYPE hrt)
-{
-	do { int __atl_condVal=!!(pTI != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4381, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
-
-	CComPtr<ITypeInfo> spTypeInfo;
-	VARTYPE vt = VT_USERDEFINED;
-	HRESULT hr = ((HRESULT)0x80004005L);
-	hr = pTI->GetRefTypeInfo(hrt, &spTypeInfo);
-	if(((HRESULT)(hr) < 0))
-		return vt;
-	TYPEATTR *pta = 0;
-
-	hr = spTypeInfo->GetTypeAttr(&pta);
-	if(((HRESULT)(hr) >= 0) && pta && (pta->typekind == TKIND_ALIAS || pta->typekind == TKIND_ENUM))
-	{
-		if (pta->tdescAlias.vt == VT_USERDEFINED)
-			vt = AtlGetUserDefinedType(spTypeInfo, pta->tdescAlias.hreftype);
-		else
-		{
-			switch (pta->typekind)
-			{
-			case TKIND_ENUM :
-				vt = VT_I4;
-				break;
-			case TKIND_INTERFACE :
-				vt = VT_UNKNOWN;
-				break;
-			case TKIND_DISPATCH :
-				vt = VT_DISPATCH;
-				break;
-			default:
-				vt = pta->tdescAlias.vt;
-			}
-		}				
-	}
-
-	if(pta)
-		spTypeInfo->ReleaseTypeAttr(pta);
-	return vt;
-
-}
-#pragma warning(pop)
-
-inline HRESULT AtlGetFuncInfoFromId(ITypeInfo* pTypeInfo, const IID& , DISPID dispidMember, LCID , _ATL_FUNC_INFO& info)
-{
-	if (pTypeInfo == 0)
-		return ((HRESULT)0x80070057L);
-
-	HRESULT hr = ((HRESULT)0x00000000L);
-	FUNCDESC* pFuncDesc = 0;
-	TYPEATTR* pAttr;
-	hr = pTypeInfo->GetTypeAttr(&pAttr);
-	if (((HRESULT)(hr) < 0))
-		return hr;
-	int i;
-	for (i=0;i<pAttr->cFuncs;i++)
-	{
-		hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		if (pFuncDesc->memid == dispidMember)
-			break;
-		pTypeInfo->ReleaseFuncDesc(pFuncDesc);
-		pFuncDesc = 0;
-	}
-	pTypeInfo->ReleaseTypeAttr(pAttr);
-	if (pFuncDesc == 0)
-		return ((HRESULT)0x80004005L);
-
-	
-	
-	(void) ((!!((pFuncDesc->cParams <= 8))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4450, 0, L"pFuncDesc->cParams <= 8")) || (__debugbreak(), 0));
-	if (pFuncDesc->cParams > 8)
-		return ((HRESULT)0x80004005L);
-
-	for (i = 0; i < pFuncDesc->cParams; i++)
-	{
-		info.pVarTypes[i] = pFuncDesc->lprgelemdescParam[i].tdesc.vt;
-		if (info.pVarTypes[i] == VT_PTR)
-			info.pVarTypes[i] = (VARTYPE)(pFuncDesc->lprgelemdescParam[i].tdesc.lptdesc->vt | VT_BYREF);
-		if (info.pVarTypes[i] == VT_USERDEFINED)
-			info.pVarTypes[i] = AtlGetUserDefinedType(pTypeInfo, pFuncDesc->lprgelemdescParam[i].tdesc.hreftype);
-	}
-
-	VARTYPE vtReturn = pFuncDesc->elemdescFunc.tdesc.vt;
-	switch(vtReturn)
-	{
-	case VT_INT:
-		vtReturn = VT_I4;
-		break;
-	case VT_UINT:
-		vtReturn = VT_UI4;
-		break;
-	case VT_VOID:
-		vtReturn = VT_EMPTY; 
-		break;
-	case VT_HRESULT:
-		vtReturn = VT_ERROR;
-		break;
-	}
-	info.vtReturn = vtReturn;
-	info.cc = pFuncDesc->callconv;
-	info.nParams = pFuncDesc->cParams;
-	pTypeInfo->ReleaseFuncDesc(pFuncDesc);
-	return ((HRESULT)0x00000000L);
-}
-
-template <UINT nID, class T, const IID* pdiid = &GUID_NULL, const GUID* plibid = &GUID_NULL, 
-	WORD wMajor = 0, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
-class __declspec(novtable) IDispEventImpl : public IDispEventSimpleImpl<nID, T, pdiid>
-{
-public:
-	typedef tihclass _tihclass;
-
-	IDispEventImpl()
-	{
-		m_libid = *plibid;
-		m_iid = *pdiid;
-		m_wMajorVerNum = wMajor;
-		m_wMinorVerNum = wMinor;
-	}
-
-	virtual HRESULT __stdcall GetTypeInfoCount(UINT* pctinfo)
-	{ 
-		if (pctinfo == 0) 
-			return ((HRESULT)0x80004003L); 
-		*pctinfo = 1; 
-		return ((HRESULT)0x00000000L);
-	}
-
-	virtual HRESULT __stdcall GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
-	{return _tih.GetTypeInfo(itinfo, lcid, pptinfo);}
-
-	virtual HRESULT __stdcall GetIDsOfNames(const IID & riid, LPOLESTR* rgszNames, UINT cNames,
-		LCID lcid, DISPID* rgdispid)
-	{return _tih.GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);}
-
-	
-		HRESULT GetFuncInfoFromId(const IID& iid, DISPID dispidMember, LCID lcid, _ATL_FUNC_INFO& info)
-	{
-		CComPtr<ITypeInfo> spTypeInfo;
-	 
-		if (InlineIsEqualGUID(*_tih.m_plibid, GUID_NULL))
-		{
-			m_InnerLibid = m_libid; 
-			m_InnerIid = m_iid;
-			_tih.m_plibid = &m_InnerLibid;
-			_tih.m_pguid = &m_InnerIid;
-			_tih.m_wMajor = m_wMajorVerNum;
-			_tih.m_wMinor = m_wMinorVerNum;
-
-		}
-		HRESULT hr = _tih.GetTI(lcid, &spTypeInfo);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		return AtlGetFuncInfoFromId(spTypeInfo, iid, dispidMember, lcid, info);
-	}
-	VARTYPE GetUserDefinedType(ITypeInfo *pTI, HREFTYPE hrt)
-	{
-		return AtlGetUserDefinedType(pTI, hrt);
-	}
-protected:
-	static _tihclass _tih;
-	static GUID	m_InnerLibid; 
-	static IID m_InnerIid; 
-	static HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
-	{return _tih.GetTI(lcid, ppInfo);}
-};
- 
-template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-typename IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::_tihclass
-IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::_tih =
-	{piid, plibid, wMajor, wMinor, 0, 0, 0, 0};
- 
-template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-GUID  IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::m_InnerLibid=GUID_NULL; 
-
-template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-IID  IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::m_InnerIid=GUID_NULL;
-
-template <class T>
-struct _ATL_EVENT_ENTRY
-{
-	UINT nControlID;			
-	const IID* piid;			
-	int nOffset;				
-	DISPID dispid;				
-	void (__stdcall T::*pfn)();	
-	_ATL_FUNC_INFO* pInfo;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template <class T, const IID* piid = &__uuidof(T), const GUID* plibid = &CAtlModule::m_libid, WORD wMajor = 1,
-WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
-class __declspec(novtable) IDispatchImpl : public T
-{
-public:
-	typedef tihclass _tihclass;
-
-	virtual HRESULT __stdcall GetTypeInfoCount(UINT* pctinfo)
-	{
-		if (pctinfo == 0) 
-			return ((HRESULT)0x80004003L); 
-		*pctinfo = 1;
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
-	{
-		return _tih.GetTypeInfo(itinfo, lcid, pptinfo);
-	}
-	virtual HRESULT __stdcall GetIDsOfNames(const IID & riid, LPOLESTR* rgszNames, UINT cNames,
-		LCID lcid, DISPID* rgdispid)
-	{
-		return _tih.GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
-	}
-	virtual HRESULT __stdcall Invoke(DISPID dispidMember, const IID & riid,
-		LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
-		EXCEPINFO* pexcepinfo, UINT* puArgErr)
-	{
-		return _tih.Invoke((IDispatch*)this, dispidMember, riid, lcid,
-		wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
-	}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-protected:
-	static _tihclass _tih;
-	static HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
-	{
-		return _tih.GetTI(lcid, ppInfo);
-	}
-
-
-
-};
-
-
-
-template <class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-typename IDispatchImpl<T, piid, plibid, wMajor, wMinor, tihclass>::_tihclass
-IDispatchImpl<T, piid, plibid, wMajor, wMinor, tihclass>::_tih =
-{piid, plibid, wMajor, wMinor, 0, 0, 0, 0};
-
-
-
-
-
-template <const CLSID* pcoclsid, const GUID* plibid = &CAtlModule::m_libid,
-WORD wMajor = 1, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
-class __declspec(novtable) IProvideClassInfoImpl : public IProvideClassInfo
-{
-public:
-	typedef tihclass _tihclass;
-
-	virtual HRESULT __stdcall GetClassInfoW(ITypeInfo** pptinfo)
-	{
-		return _tih.GetTypeInfo(0, 0x00, pptinfo);
-	}
-
-protected:
-	static _tihclass _tih;
-};
-
-template <const CLSID* pcoclsid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-typename IProvideClassInfoImpl<pcoclsid, plibid, wMajor, wMinor, tihclass>::_tihclass
-IProvideClassInfoImpl<pcoclsid, plibid, wMajor, wMinor, tihclass>::_tih =
-{pcoclsid,plibid, wMajor, wMinor, 0, 0, 0, 0};
-
-
-
-template <const CLSID* pcoclsid, const IID* psrcid, const GUID* plibid = &CAtlModule::m_libid,
-WORD wMajor = 1, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
-class __declspec(novtable) IProvideClassInfo2Impl : public IProvideClassInfo2
-{
-public:
-	typedef tihclass _tihclass;
-
-	virtual HRESULT __stdcall GetClassInfoW(ITypeInfo** pptinfo)
-	{
-		return _tih.GetTypeInfo(0, 0x00, pptinfo);
-	}
-	virtual HRESULT __stdcall GetGUID(DWORD dwGuidKind, GUID* pGUID)
-	{
-		if (pGUID == 0)
-		{
-			return ((HRESULT)0x80004003L);
-		}
-		*pGUID = GUID_NULL;
-		if(dwGuidKind!=GUIDKIND_DEFAULT_SOURCE_DISP_IID)
-		{
-			return ((HRESULT)0x80070057L);
-		}
-		if (psrcid != 0)
-		{
-			*pGUID = *psrcid;
-			return ((HRESULT)0x00000000L);
-		}
-		return ((HRESULT)0x80004005L);
-	}
-
-protected:
-	static _tihclass _tih;
-};
-
-
-template <const CLSID* pcoclsid, const IID* psrcid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-typename IProvideClassInfo2Impl<pcoclsid, psrcid, plibid, wMajor, wMinor, tihclass>::_tihclass
-IProvideClassInfo2Impl<pcoclsid, psrcid, plibid, wMajor, wMinor, tihclass>::_tih =
-{pcoclsid,plibid, wMajor, wMinor, 0, 0, 0, 0};
-
-
-
-
-
-template <const IID* piid>
-class __declspec(novtable) ISupportErrorInfoImpl : public ISupportErrorInfo
-{
-public:
-	virtual HRESULT __stdcall InterfaceSupportsErrorInfo(const IID & riid)
-	{
-		return (InlineIsEqualGUID(riid,*piid)) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-	}
-};
-
-
-
-
-
-
-
-
-
-template <class T>
-class _Copy
-{
-public:
-	static HRESULT copy(T* p1, const T* p2) { Checked::memcpy_s(p1, sizeof(T), p2, sizeof(T)); return ((HRESULT)0x00000000L);}
-	static void init(T*) {}
-	static void destroy(T*) {}
-};
-
-template<>
-class _Copy<VARIANT>
-{
-public:
-	static HRESULT copy(VARIANT* p1, const VARIANT* p2) {p1->vt = VT_EMPTY; return VariantCopy(p1, const_cast<VARIANT*>(p2));}
-	static void init(VARIANT* p) {p->vt = VT_EMPTY;}
-	static void destroy(VARIANT* p) {VariantClear(p);}
-};
-
-template<>
-class _Copy<LPOLESTR>
-{
-public:
-	static HRESULT copy(LPOLESTR* p1, const LPOLESTR* p2)
-	{
-		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4775, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		HRESULT hr = ((HRESULT)0x00000000L);
-		ULONG len = ocslen(*p2)+1;
-		(*p1) = (LPOLESTR)::ATL::AtlCoTaskMemCAlloc(len, static_cast<ULONG>(sizeof(OLECHAR)));
-		if (*p1 == 0)
-		{
-			hr = ((HRESULT)0x8007000EL);
-		}
-		else
-		{
-			if(!ocscpy_s(*p1, len, *p2))
-			{
-				hr = ((HRESULT)0x80004005L);
-			}
-		}
-		return hr;
-	}
-	static void init(LPOLESTR* p) {*p = 0;}
-	static void destroy(LPOLESTR* p) { CoTaskMemFree(*p);}
-};
-
-template<>
-class _Copy<OLEVERB>
-{
-public:
-	static HRESULT copy(OLEVERB* p1, const OLEVERB* p2)
-	{
-		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4802, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		HRESULT hr = ((HRESULT)0x00000000L);
-		*p1 = *p2;
-		if (p2->lpszVerbName == 0)
-		{
-			return ((HRESULT)0x00000000L);
-		}
-
-		ULONG len = ocslen(p2->lpszVerbName)+1;
-		p1->lpszVerbName = (LPOLESTR)::ATL::AtlCoTaskMemCAlloc(len, static_cast<ULONG>(sizeof(OLECHAR)));
-		if (p1->lpszVerbName == 0)
-		{
-			hr = ((HRESULT)0x8007000EL);
-		}
-		else
-		{
-			if(!ocscpy_s(p1->lpszVerbName, len, p2->lpszVerbName))
-			{
-				hr = ((HRESULT)0x80004005L);
-			}
-		}
-		return hr;
-	}
-	static void init(OLEVERB* p) { p->lpszVerbName = 0;}
-	static void destroy(OLEVERB* p) { if (p->lpszVerbName) CoTaskMemFree(p->lpszVerbName);}
-};
-
-template<>
-class _Copy<CONNECTDATA>
-{
-public:
-	static HRESULT copy(CONNECTDATA* p1, const CONNECTDATA* p2)
-	{
-		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4835, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		*p1 = *p2;
-		if (p1->pUnk)
-			p1->pUnk->AddRef();
-		return ((HRESULT)0x00000000L);
-	}
-	static void init(CONNECTDATA* ) {}
-	static void destroy(CONNECTDATA* p) {if (p->pUnk) p->pUnk->Release();}
-};
-
-template <class T>
-class _CopyInterface
-{
-public:
-	static HRESULT copy(T* * p1, T * const * p2)
-	{
-		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4851, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		*p1 = *p2;
-		if (*p1)
-			(*p1)->AddRef();
-		return ((HRESULT)0x00000000L);
-	}
-	static void init(T** ) {}
-	static void destroy(T** p) {if (*p) (*p)->Release();}
-};
-
-template<class T>
-class __declspec(novtable) CComIEnum : public IUnknown
-{
-public:
-	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched) = 0;
-	virtual HRESULT __stdcall Skip(ULONG celt) = 0;
-	virtual HRESULT __stdcall Reset(void) = 0;
-	virtual HRESULT __stdcall Clone(CComIEnum<T>** ppEnum) = 0;
-};
-
-
-enum CComEnumFlags
-{
-	
-	AtlFlagNoCopy = 0,
-	AtlFlagTakeOwnership = 2,
-	AtlFlagCopy = 3 
-};
-
-template <class Base, const IID* piid, class T, class Copy>
-class __declspec(novtable) CComEnumImpl : public Base
-{
-public:
-	CComEnumImpl() {m_begin = m_end = m_iter = 0; m_dwFlags = 0;}
-	virtual ~CComEnumImpl();
-	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched);
-	virtual HRESULT __stdcall Skip(ULONG celt);
-	virtual HRESULT __stdcall Reset(void){m_iter = m_begin;return ((HRESULT)0x00000000L);}
-	virtual HRESULT __stdcall Clone(Base** ppEnum);
-	HRESULT Init(T* begin, T* end, IUnknown* pUnk,
-		CComEnumFlags flags = AtlFlagNoCopy);
-	CComPtr<IUnknown> m_spUnk;
-	T* m_begin;
-	T* m_end;
-	T* m_iter;
-	DWORD m_dwFlags;
-protected:
-	enum FlagBits
-	{
-		BitCopy=1,
-		BitOwn=2
-	};
-};
-
-template <class Base, const IID* piid, class T, class Copy>
-CComEnumImpl<Base, piid, T, Copy>::~CComEnumImpl()
-{
-	if (m_dwFlags & BitOwn)
-	{
-		for (T* p = m_begin; p != m_end; p++)
-			Copy::destroy(p);
-		delete [] m_begin;
-	}
-}
-
-template <class Base, const IID* piid, class T, class Copy>
-HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Next(ULONG celt, T* rgelt,
-	ULONG* pceltFetched)
-{
-	if (pceltFetched != 0)
-		*pceltFetched = 0;
-	if (celt == 0)
-		return ((HRESULT)0x80070057L);
-	if (rgelt == 0 || (celt != 1 && pceltFetched == 0))
-		return ((HRESULT)0x80004003L);
-	if (m_begin == 0 || m_end == 0 || m_iter == 0)
-		return ((HRESULT)0x80004005L);
-	ULONG nRem = (ULONG)(m_end - m_iter);
-	HRESULT hRes = ((HRESULT)0x00000000L);
-	if (nRem < celt)
-		hRes = ((HRESULT)0x00000001L);
-	ULONG nMin = celt < nRem ? celt : nRem ;
-	if (pceltFetched != 0)
-		*pceltFetched = nMin;
-	T* pelt = rgelt;
-	while(nMin--)
-	{
-		HRESULT hr = Copy::copy(pelt, m_iter);
-		if (((HRESULT)(hr) < 0))
-		{
-			while (rgelt < pelt)
-				Copy::destroy(rgelt++);
-			if (pceltFetched != 0)
-				*pceltFetched = 0;
-			return hr;
-		}
-		pelt++;
-		m_iter++;
-	}
-	return hRes;
-}
-
-template <class Base, const IID* piid, class T, class Copy>
-HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Skip(ULONG celt)
-{
-	if (celt == 0)
-		return ((HRESULT)0x80070057L);
-
-	ULONG nRem = ULONG(m_end - m_iter);
-	ULONG nSkip = (celt > nRem) ? nRem : celt;
-	m_iter += nSkip;
-	return (celt == nSkip) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-}
-
-template <class Base, const IID* piid, class T, class Copy>
-HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Clone(Base** ppEnum)
-{
-	typedef CComObject<CComEnum<Base, piid, T, Copy> > _class;
-	HRESULT hRes = ((HRESULT)0x80004003L);
-	if (ppEnum != 0)
-	{
-		*ppEnum = 0;
-		_class* p;
-		hRes = _class::CreateInstance(&p);
-		if (((HRESULT)(hRes) >= 0))
-		{
-			
-			hRes = p->Init(m_begin, m_end, (m_dwFlags & BitOwn) ? this : m_spUnk);
-			if (((HRESULT)(hRes) >= 0))
-			{
-				p->m_iter = m_iter;
-				hRes = p->_InternalQueryInterface(*piid, (void**)ppEnum);
-			}
-			if (((HRESULT)(hRes) < 0))
-				delete p;
-		}
-	}
-	return hRes;
-}
-
-template <class Base, const IID* piid, class T, class Copy>
-HRESULT CComEnumImpl<Base, piid, T, Copy>::Init(T* begin, T* end, IUnknown* pUnk,
-	CComEnumFlags flags)
-{
-	if (flags == AtlFlagCopy)
-	{
-		do { (void) ((!!((m_begin == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4997, 0, L"m_begin == 0")) || (__debugbreak(), 0)); ; } while(0); 
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_begin = new T[end-begin];} catch(...) {} __pragma(warning(pop))
-		m_iter = m_begin;
-		if (m_begin == 0)
-			return ((HRESULT)0x8007000EL);
-		for (T* i=begin; i != end; i++)
-		{
-			Copy::init(m_iter);
-			HRESULT hr = Copy::copy(m_iter, i);
-			if (((HRESULT)(hr) < 0))
-			{
-				T* p = m_begin;
-				while (p < m_iter)
-					Copy::destroy(p++);
-				delete [] m_begin;
-				m_begin = m_end = m_iter = 0;
-				return hr;
-			}
-			m_iter++;
-		}
-		m_end = m_begin + (end-begin);
-	}
-	else
-	{
-		m_begin = begin;
-		m_end = end;
-	}
-	m_spUnk = pUnk;
-	m_iter = m_begin;
-	m_dwFlags = flags;
-	return ((HRESULT)0x00000000L);
-}
-
-template <class Base, const IID* piid, class T, class Copy, class ThreadModel = CComObjectThreadModel>
-class __declspec(novtable) CComEnum :
-	public CComEnumImpl<Base, piid, T, Copy>,
-	public CComObjectRootEx< ThreadModel >
-{
-public:
-	typedef CComEnum<Base, piid, T, Copy > _CComEnum;
-	typedef CComEnumImpl<Base, piid, T, Copy > _CComEnumBase;
-	public: typedef _CComEnum _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5038, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"_CComEnum", (ATL::_ATL_CREATORARGFUNC*)0},
-		{&*piid, ((DWORD_PTR)(static_cast<_CComEnumBase*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-};
-
-template <class Base, const IID* piid, class T, class Copy, class CollType>
-class __declspec(novtable) IEnumOnSTLImpl : public Base
-{
-public:
-	HRESULT Init(IUnknown *pUnkForRelease, CollType& collection)
-	{
-		m_spUnk = pUnkForRelease;
-		m_pcollection = &collection;
-		m_iter = m_pcollection->begin();
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched);
-	virtual HRESULT __stdcall Skip(ULONG celt);
-	virtual HRESULT __stdcall Reset(void)
-	{
-		if (m_pcollection == 0)
-			return ((HRESULT)0x80004005L);
-		m_iter = m_pcollection->begin();
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall Clone(Base** ppEnum);
-
-	CComPtr<IUnknown> m_spUnk;
-	CollType* m_pcollection;
-	typename CollType::const_iterator m_iter;
-};
-
-template <class Base, const IID* piid, class T, class Copy, class CollType>
-HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Next(ULONG celt, T* rgelt,
-	ULONG* pceltFetched)
-{
-	if (rgelt == 0 || (celt != 1 && pceltFetched == 0))
-		return ((HRESULT)0x80004003L);
-	if (pceltFetched != 0)
-		*pceltFetched = 0;
-	if (m_pcollection == 0)
-		return ((HRESULT)0x80004005L);
-
-	ULONG nActual = 0;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	T* pelt = rgelt;
-	while (((HRESULT)(hr) >= 0) && m_iter != m_pcollection->end() && nActual < celt)
-	{
-		hr = Copy::copy(pelt, &*m_iter);
-		if (((HRESULT)(hr) < 0))
-		{
-			while (rgelt < pelt)
-				Copy::destroy(rgelt++);
-			nActual = 0;
-		}
-		else
-		{
-			pelt++;
-			m_iter++;
-			nActual++;
-		}
-	}
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (pceltFetched)
-			*pceltFetched = nActual;
-		if (nActual < celt)
-			hr = ((HRESULT)0x00000001L);
-	}
-	return hr;
-}
-
-template <class Base, const IID* piid, class T, class Copy, class CollType>
-HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Skip(ULONG celt)
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	while (celt--)
-	{
-		if (m_iter != m_pcollection->end())
-			m_iter++;
-		else
-		{
-			hr = ((HRESULT)0x00000001L);
-			break;
-		}
-	}
-	return hr;
-}
-
-template <class Base, const IID* piid, class T, class Copy, class CollType>
-HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Clone(Base** ppEnum)
-{
-	typedef CComObject<CComEnumOnSTL<Base, piid, T, Copy, CollType> > _class;
-	HRESULT hRes = ((HRESULT)0x80004003L);
-	if (ppEnum != 0)
-	{
-		*ppEnum = 0;
-		_class* p;
-		hRes = _class::CreateInstance(&p);
-		if (((HRESULT)(hRes) >= 0))
-		{
-			hRes = p->Init(m_spUnk, *m_pcollection);
-			if (((HRESULT)(hRes) >= 0))
-			{
-				p->m_iter = m_iter;
-				hRes = p->_InternalQueryInterface(*piid, (void**)ppEnum);
-			}
-			if (((HRESULT)(hRes) < 0))
-				delete p;
-		}
-	}
-	return hRes;
-}
-
-template <class Base, const IID* piid, class T, class Copy, class CollType, class ThreadModel = CComObjectThreadModel>
-class __declspec(novtable) CComEnumOnSTL :
-	public IEnumOnSTLImpl<Base, piid, T, Copy, CollType>,
-	public CComObjectRootEx< ThreadModel >
-{
-public:
-	typedef CComEnumOnSTL<Base, piid, T, Copy, CollType, ThreadModel > _CComEnum;
-	typedef IEnumOnSTLImpl<Base, piid, T, Copy, CollType > _CComEnumBase;
-	public: typedef _CComEnum _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5160, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"_CComEnum", (ATL::_ATL_CREATORARGFUNC*)0},
-		{&*piid, ((DWORD_PTR)(static_cast<_CComEnumBase*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-};
-
-template <class T, class CollType, class ItemType, class CopyItem, class EnumType>
-class ICollectionOnSTLImpl : public T
-{
-public:
-	virtual HRESULT __stdcall get_Count(long* pcount)
-	{
-		if (pcount == 0)
-			return ((HRESULT)0x80004003L);
-		do { (void) ((!!((m_coll.size()<=2147483647L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5173, 0, L"m_coll.size()<=2147483647L")) || (__debugbreak(), 0)); ; } while(0);
-
-		*pcount = (long)m_coll.size();
-
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall get_Item(long Index, ItemType* pvar)
-	{
-		
-		if (pvar == 0)
-			return ((HRESULT)0x80004003L);
-		if (Index < 1)
-			return ((HRESULT)0x80070057L);
-		HRESULT hr = ((HRESULT)0x80004005L);
-		Index--;
-		CollType::const_iterator iter = m_coll.begin();
-		while (iter != m_coll.end() && Index > 0)
-		{
-			iter++;
-			Index--;
-		}
-		if (iter != m_coll.end())
-			hr = CopyItem::copy(pvar, &*iter);
-		return hr;
-	}
-	virtual HRESULT __stdcall get__NewEnum(IUnknown** ppUnk)
-	{
-		if (ppUnk == 0)
-			return ((HRESULT)0x80004003L);
-		*ppUnk = 0;
-		HRESULT hRes = ((HRESULT)0x00000000L);
-		CComObject<EnumType>* p;
-		hRes = CComObject<EnumType>::CreateInstance(&p);
-		if (((HRESULT)(hRes) >= 0))
-		{
-			hRes = p->Init(this, m_coll);
-			if (hRes == ((HRESULT)0x00000000L))
-				hRes = p->QueryInterface(__uuidof(IUnknown), (void**)ppUnk);
-		}
-		if (hRes != ((HRESULT)0x00000000L))
-			delete p;
-		return hRes;
-	}
-	CollType m_coll;
-};
-
-
-
-template <class T>
-class __declspec(novtable) ISpecifyPropertyPagesImpl : public ISpecifyPropertyPages
-{
-public:
-	
-	
-	virtual HRESULT __stdcall GetPages(CAUUID* pPages)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5229)(atlTraceCOM, 2, L"ISpecifyPropertyPagesImpl::GetPages\n");
-		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
-		return GetPagesHelper(pPages, pMap);
-	}
-protected:
-	HRESULT GetPagesHelper(CAUUID* pPages, ATL_PROPMAP_ENTRY* pMap)
-	{
-		if (pPages == 0)
-			return ((HRESULT)0x80004003L);
-		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5238, 0, L"pMap != 0")) || (__debugbreak(), 0));
-		if (pMap == 0)
-			return ((HRESULT)0x80004003L);
-
-		int nCnt = 0;
-		int i;
-		
-		for (i = 0; pMap[i].pclsidPropPage != 0; i++)
-		{
-			
-			if (pMap[i].vt == 0)
-			{
-				
-				if (!InlineIsEqualGUID(*pMap[i].pclsidPropPage, GUID_NULL))
-					nCnt++;
-			}
-		}
-		pPages->pElems = (GUID*) ::ATL::AtlCoTaskMemCAlloc(nCnt, static_cast<ULONG>(sizeof(CLSID)));
-		if (pPages->pElems == 0)
-			return ((HRESULT)0x8007000EL);
-		
-		nCnt = 0;
-		for (i = 0; pMap[i].pclsidPropPage != 0; i++)
-		{
-			
-			if (pMap[i].vt == 0)
-			{
-				
-				if (!InlineIsEqualGUID(*pMap[i].pclsidPropPage, GUID_NULL))
-				{
-					BOOL bFound = 0;
-					
-					
-					for (int j=0; j<nCnt; j++)
-					{
-						if (InlineIsEqualGUID(*(pMap[i].pclsidPropPage), pPages->pElems[j]))
-						{
-							
-							bFound = 1;
-							break;
-						}
-					}
-					
-					if (!bFound)
-						pPages->pElems[nCnt++] = *pMap[i].pclsidPropPage;
-				}
-			}
-		}
-		pPages->cElems = nCnt;
-		return ((HRESULT)0x00000000L);
-	}
-
-};
-
-
-
-
-
-struct _ATL_CONNMAP_ENTRY
-{
-	DWORD_PTR dwOffset;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template <unsigned int nMaxSize>
-class CComUnkArray
-{
-public:
-	CComUnkArray()
-	{
-		memset(m_arr, 0, sizeof(IUnknown*)*nMaxSize);
-	}
-	DWORD Add(IUnknown* pUnk);
-	BOOL Remove(DWORD dwCookie);
-	
-	
-	DWORD __stdcall GetCookie(IUnknown** ppFind)
-	{
-		(void) ((!!((ppFind && *ppFind))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5370, 0, L"ppFind && *ppFind")) || (__debugbreak(), 0));
-		if (ppFind && *ppFind)
-		{
-			
-			for (DWORD dwCookie = 0; dwCookie < nMaxSize; dwCookie++)
-			{
-				if (m_arr[dwCookie] == *ppFind)
-					return dwCookie+1; 
-			}
-		}
-		return 0;
-	}
-	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
-	{
-		(void) ((!!((dwCookie != 0 && dwCookie <= nMaxSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5384, 0, L"dwCookie != 0 && dwCookie <= nMaxSize")) || (__debugbreak(), 0));
-		if (dwCookie != 0 && dwCookie <= nMaxSize)
-			return m_arr[dwCookie-1]; 
-		else
-			return 0;
-	}
-	IUnknown** begin()
-	{
-		return &m_arr[0];
-	}
-	IUnknown** end()
-	{
-		return &m_arr[nMaxSize];
-	}
-protected:
-	IUnknown* m_arr[nMaxSize];
-};
-
-template <unsigned int nMaxSize>
-inline DWORD CComUnkArray<nMaxSize>::Add(IUnknown* pUnk)
-{
-	DWORD dwCookie = 1;
-	for (IUnknown** pp = begin(); pp < end(); pp++)
-	{
-		if (*pp == 0)
-		{
-			*pp = pUnk;
-			return dwCookie;
-		}
-		dwCookie++;
-	}
-	
-	(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5416, 0, L"0")) || (__debugbreak(), 0));
-	return 0;
-}
-
-template <unsigned int nMaxSize>
-inline BOOL CComUnkArray<nMaxSize>::Remove(DWORD dwCookie)
-{
-	(void) ((!!((dwCookie != 0 && dwCookie <= nMaxSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5423, 0, L"dwCookie != 0 && dwCookie <= nMaxSize")) || (__debugbreak(), 0));
-	if (dwCookie != 0 && dwCookie <= nMaxSize && m_arr[dwCookie-1] != 0)
-	{
-		m_arr[dwCookie-1] = 0;
-		return 1;
-	}
-	else
-		return 0;
-}
-
-template<>
-class CComUnkArray<1>
-{
-public:
-	CComUnkArray()
-	{
-		m_arr[0] = 0;
-	}
-	DWORD Add(IUnknown* pUnk)
-	{
-		if (m_arr[0] != 0)
-		{
-			
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5446, 0, L"0")) || (__debugbreak(), 0));
-			return 0;
-		}
-		m_arr[0] = pUnk;
-		return 1;
-	}
-	BOOL Remove(DWORD dwCookie)
-	{
-		(void) ((!!((dwCookie == 1))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5454, 0, L"dwCookie == 1")) || (__debugbreak(), 0));
-		if (dwCookie == 1 && m_arr[0] != 0)
-		{
-			m_arr[0] = 0;
-			return 1;
-		}
-		else
-			return 0;
-	}
-	DWORD __stdcall GetCookie(IUnknown** )
-	{
-		return 1;
-	}
-	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
-	{
-		(void) ((!!((dwCookie == 1))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5469, 0, L"dwCookie == 1")) || (__debugbreak(), 0));
-		if (dwCookie == 1)
-			return m_arr[0];
-		else 
-			return 0;
-	}
-	IUnknown** begin()
-	{
-		return &m_arr[0];
-	}
-	IUnknown** end()
-	{
-		return (&m_arr[0])+1;
-	}
-protected:
-	IUnknown* m_arr[1];
-};
-
-class CComDynamicUnkArray
-{
-public:
-	CComDynamicUnkArray()
-	{
-		m_nSize = 0;
-		m_ppUnk = 0;
-	}
-
-	~CComDynamicUnkArray()
-	{
-		if (m_nSize > 0)
-			free(m_ppUnk);
-	}
-	DWORD Add(IUnknown* pUnk);
-	BOOL Remove(DWORD dwCookie);
-	
-	
-	DWORD __stdcall GetCookie(IUnknown** ppFind)
-	{
-		(void) ((!!((ppFind && *ppFind))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5507, 0, L"ppFind && *ppFind")) || (__debugbreak(), 0));
-		if (ppFind && *ppFind)
-		{
-			IUnknown** ppUnk = 0;
-			DWORD dwCookie = 1;
-			
-			for (ppUnk = begin(); ppUnk < end(); ppUnk++)
-			{
-				if (*ppUnk == *ppFind)
-					return dwCookie; 
-				dwCookie++;
-			}
-		}
-		return 0;
-	}
-	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
-	{
-
-		(void) ((!!((dwCookie != 0 && dwCookie <= (DWORD)m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5525, 0, L"dwCookie != 0 && dwCookie <= (DWORD)m_nSize")) || (__debugbreak(), 0));
-
-		if (dwCookie != 0 && dwCookie <= (DWORD)m_nSize)
-			return GetAt(dwCookie-1); 
-		else
-			return 0;
-	}
-	IUnknown** begin()
-	{
-		return m_ppUnk;
-	}
-	IUnknown** end()
-	{
-		return &m_ppUnk[m_nSize];
-	}
-
-	IUnknown* GetAt(int nIndex)
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5543, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if (nIndex >= 0 && nIndex < m_nSize)
-			return m_ppUnk[nIndex];
-		else
-			return 0;
-
-	}
-	int GetSize() const
-	{
-		return m_nSize;
-	}
-	void clear()
-	{
-		if (m_nSize > 0)
-		{
-			free(m_ppUnk);
-			m_ppUnk = 0;
-		}
-		m_nSize = 0;
-	}
-protected:
-	IUnknown** m_ppUnk;
-	int m_nSize;
-};
-
-inline DWORD CComDynamicUnkArray::Add(IUnknown* pUnk)
-{
-	IUnknown** pp = 0;
-	if (m_nSize == 0)
-	{
-		
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pp = (IUnknown**)calloc(sizeof(IUnknown*),4);} catch(...) {} __pragma(warning(pop));
-		if (pp == 0)
-			return 0;
-		memset(pp, 0, sizeof(IUnknown*)*4);
-		m_ppUnk = pp;
-		m_nSize = 4;
-	}
-	
-	DWORD dwCookie = 1;
-	for (pp = begin(); pp < end(); pp++)
-	{
-		if (*pp == 0)
-		{
-			*pp = pUnk;
-			return dwCookie; 
-		}
-		dwCookie++;
-	}
-	
-	
-	int nAlloc = m_nSize*2;
-	pp = (IUnknown**)_recalloc(m_ppUnk, sizeof(IUnknown*),nAlloc);
-	if (pp == 0)
-		return 0;
-	m_ppUnk = pp;
-	memset(&m_ppUnk[m_nSize], 0, sizeof(IUnknown*)*m_nSize);
-	m_ppUnk[m_nSize] = pUnk;
-	dwCookie = m_nSize+1;
-	m_nSize = nAlloc;
-	return dwCookie; 
-}
-
-inline BOOL CComDynamicUnkArray::Remove(DWORD dwCookie)
-{
-	DWORD idx = dwCookie -1;
-
-	(void) ((!!((idx < dwCookie && idx < (DWORD)m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5610, 0, L"idx < dwCookie && idx < (DWORD)m_nSize")) || (__debugbreak(), 0));
-
-	if (idx < dwCookie && idx < (DWORD)m_nSize)
-	{
-		
-		if (m_ppUnk[idx] == 0)
-			return 0;
-		m_ppUnk[idx] = 0;
-		return 1;
-	}
-	else
-		return 0;
-}
-
-template <const IID* piid>
-class __declspec(novtable) _ICPLocator
-{
-public:
-	
-	virtual HRESULT __stdcall _LocCPQueryInterface(const IID & riid, void ** ppvObject) = 0;
-	virtual ULONG __stdcall AddRef(void) = 0;
-	virtual ULONG __stdcall Release(void) = 0;
-};
-
-template <class T, const IID* piid, class CDV = CComDynamicUnkArray >
-class __declspec(novtable) IConnectionPointImpl : public _ICPLocator<piid>
-{
-	typedef CComEnum<IEnumConnections, &__uuidof(IEnumConnections), CONNECTDATA,
-		_Copy<CONNECTDATA> > CComEnumConnections;
-	typedef CDV _CDV;
-public:
-	~IConnectionPointImpl();
-	virtual HRESULT __stdcall _LocCPQueryInterface(const IID & riid, void ** ppvObject)
-	{
-
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5645, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		if (InlineIsEqualGUID(riid, __uuidof(IConnectionPoint)) || InlineIsEqualUnknown(riid))
-		{
-			*ppvObject = this;
-			AddRef();
-
-
-
-			return ((HRESULT)0x00000000L);
-		}
-		else
-			return ((HRESULT)0x80004002L);
-	}
-
-	virtual HRESULT __stdcall GetConnectionInterface(IID* piid2)
-	{
-		if (piid2 == 0)
-			return ((HRESULT)0x80004003L);
-		*piid2 = *piid;
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall GetConnectionPointContainer(IConnectionPointContainer** ppCPC)
-	{
-		T* pT = static_cast<T*>(this);
-		
-		return pT->QueryInterface(__uuidof(IConnectionPointContainer), (void**)ppCPC);
-	}
-	virtual HRESULT __stdcall Advise(IUnknown* pUnkSink, DWORD* pdwCookie);
-	virtual HRESULT __stdcall Unadvise(DWORD dwCookie);
-	virtual HRESULT __stdcall EnumConnections(IEnumConnections** ppEnum);
-	CDV m_vec;
-};
-
-template <class T, const IID* piid, class CDV>
-IConnectionPointImpl<T, piid, CDV>::~IConnectionPointImpl()
-{
-	IUnknown** pp = m_vec.begin();
-	while (pp < m_vec.end())
-	{
-		if (*pp != 0)
-			(*pp)->Release();
-		pp++;
-	}
-}
-
-template <class T, const IID* piid, class CDV>
-HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::Advise(IUnknown* pUnkSink,
-	DWORD* pdwCookie)
-{
-	T* pT = static_cast<T*>(this);
-	IUnknown* p;
-	HRESULT hRes = ((HRESULT)0x00000000L);
-	if (pdwCookie != 0)
-		*pdwCookie = 0;
-	if (pUnkSink == 0 || pdwCookie == 0)
-		return ((HRESULT)0x80004003L);
-	IID iid;
-	GetConnectionInterface(&iid);
-	hRes = pUnkSink->QueryInterface(iid, (void**)&p);
-	if (((HRESULT)(hRes) >= 0))
-	{
-		pT->Lock();
-		*pdwCookie = m_vec.Add(p);
-		hRes = (*pdwCookie != 0) ? ((HRESULT)0x00000000L) : (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+1);
-		pT->Unlock();
-		if (hRes != ((HRESULT)0x00000000L))
-			p->Release();
-	}
-	else if (hRes == ((HRESULT)0x80004002L))
-		hRes = (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+2);
-	if (((HRESULT)(hRes) < 0))
-		*pdwCookie = 0;
-	return hRes;
-}
-
-template <class T, const IID* piid, class CDV>
-HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::Unadvise(DWORD dwCookie)
-{
-	T* pT = static_cast<T*>(this);
-	pT->Lock();
-	IUnknown* p = m_vec.GetUnknown(dwCookie);
-	HRESULT hRes = m_vec.Remove(dwCookie) ? ((HRESULT)0x00000000L) : (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+0);
-	pT->Unlock();
-	if (hRes == ((HRESULT)0x00000000L) && p != 0)
-		p->Release();
-	return hRes;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 6014 6211)
-template <class T, const IID* piid, class CDV>
-HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::EnumConnections(
-	IEnumConnections** ppEnum)
-{
-	if (ppEnum == 0)
-		return ((HRESULT)0x80004003L);
-	*ppEnum = 0;
-	CComObject<CComEnumConnections>* pEnum = 0;
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pEnum = new CComObject<CComEnumConnections>;} catch(...) {} __pragma(warning(pop))
-	if (pEnum == 0)
-		return ((HRESULT)0x8007000EL);
-	T* pT = static_cast<T*>(this);
-	pT->Lock();
-	CONNECTDATA* pcd = 0;
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pcd = new CONNECTDATA[m_vec.end()-m_vec.begin()];} catch(...) {} __pragma(warning(pop))
-	if (pcd == 0)
-	{
-		delete pEnum;
-		pT->Unlock();
-		return ((HRESULT)0x8007000EL);
-	}
-	CONNECTDATA* pend = pcd;
-	
-	for (IUnknown** pp = m_vec.begin();pp<m_vec.end();pp++)
-	{
-		if (*pp != 0)
-		{
-			(*pp)->AddRef();
-			pend->pUnk = *pp;
-			pend->dwCookie = m_vec.GetCookie(pp);
-			pend++;
-		}
-	}
-	
-	pEnum->Init(pcd, pend, 0, AtlFlagTakeOwnership);
-	pT->Unlock();
-	HRESULT hRes = pEnum->_InternalQueryInterface(__uuidof(IEnumConnections), (void**)ppEnum);
-	if (((HRESULT)(hRes) < 0))
-		delete pEnum;
-	return hRes;
-}
-#pragma warning(pop)
-
-
-
-
-template <class T>
-class __declspec(novtable) IConnectionPointContainerImpl : public IConnectionPointContainer
-{
-	typedef CComEnum<IEnumConnectionPoints,
-		&__uuidof(IEnumConnectionPoints), IConnectionPoint*,
-		_CopyInterface<IConnectionPoint> >
-		CComEnumConnectionPoints;
-public:
-#pragma warning(push)
-#pragma warning(disable: 6014 6211)
-	virtual HRESULT __stdcall EnumConnectionPoints(IEnumConnectionPoints** ppEnum)
-	{
-		if (ppEnum == 0)
-			return ((HRESULT)0x80004003L);
-		*ppEnum = 0;
-		CComEnumConnectionPoints* pEnum = 0;
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pEnum = new CComObject<CComEnumConnectionPoints>;} catch(...) {} __pragma(warning(pop))
-		if (pEnum == 0)
-			return ((HRESULT)0x8007000EL);
-
-		int nCPCount;
-		const _ATL_CONNMAP_ENTRY* pEntry = T::GetConnMap(&nCPCount);
-
-		
-		ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		if ((nCPCount < 0) || (nCPCount > (2147483647 / sizeof(IConnectionPoint*))))
-			return ((HRESULT)0x8007000EL);
-		size_t nBytes=0;
-		HRESULT hr=((HRESULT)0x00000000L);
-		if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, sizeof(IConnectionPoint*), static_cast<size_t>(nCPCount))) < 0))
-		{
-			return hr;
-		}
-		IConnectionPoint** ppCP = (IConnectionPoint**)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((nBytes <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(nBytes) ) ? _alloca(nBytes) : _AtlSafeAllocaManager.Allocate(nBytes)) __pragma(warning(pop));
-		if (ppCP == 0)
-		{
-			delete pEnum;
-			return ((HRESULT)0x8007000EL);
-		}
-
-		int i = 0;
-		while (pEntry->dwOffset != (DWORD_PTR)-1)
-		{
-			if (pEntry->dwOffset == (DWORD_PTR)-2)
-			{
-				pEntry++;
-				const _ATL_CONNMAP_ENTRY* (*pFunc)(int*) =  (const _ATL_CONNMAP_ENTRY* (*)(int*))(pEntry->dwOffset);
-				pEntry = pFunc(0);
-				continue;
-			}
-			ppCP[i++] = (IConnectionPoint*)((INT_PTR)this+pEntry->dwOffset);
-			pEntry++;
-		}
-
-		
-		HRESULT hRes = pEnum->Init((IConnectionPoint**)&ppCP[0],
-			(IConnectionPoint**)&ppCP[nCPCount],
-			reinterpret_cast<IConnectionPointContainer*>(this), AtlFlagCopy);
-		if (((HRESULT)(hRes) < 0))
-		{
-			delete pEnum;
-			return hRes;
-		}
-		hRes = pEnum->QueryInterface(__uuidof(IEnumConnectionPoints), (void**)ppEnum);
-		if (((HRESULT)(hRes) < 0))
-			delete pEnum;
-		return hRes;
-	}
-#pragma warning(pop)
-
-	virtual HRESULT __stdcall FindConnectionPoint(const IID & riid, IConnectionPoint** ppCP)
-	{
-		if (ppCP == 0)
-			return ((HRESULT)0x80004003L);
-		*ppCP = 0;
-		HRESULT hRes = (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+0);
-		const _ATL_CONNMAP_ENTRY* pEntry = T::GetConnMap(0);
-		IID iid;
-		while (pEntry->dwOffset != (DWORD_PTR)-1)
-		{
-			if (pEntry->dwOffset == (DWORD_PTR)-2)
-			{
-				pEntry++;
-				const _ATL_CONNMAP_ENTRY* (*pFunc)(int*) =  (const _ATL_CONNMAP_ENTRY* (*)(int*))(pEntry->dwOffset);
-				pEntry = pFunc(0);
-				continue;
-			}
-			IConnectionPoint* pCP =
-				(IConnectionPoint*)((INT_PTR)this+pEntry->dwOffset);
-			if (((HRESULT)(pCP->GetConnectionInterface(&iid)) >= 0) &&
-				InlineIsEqualGUID(riid, iid))
-			{
-				*ppCP = pCP;
-				pCP->AddRef();
-				hRes = ((HRESULT)0x00000000L);
-				break;
-			}
-			pEntry++;
-		}
-		return hRes;
-	}
-};
-
-
-
-
-
-
-
-
-
-
-
-template <class T> 
-class IExternalConnectionImpl : public IExternalConnection
-{
-public:
-	IExternalConnectionImpl(void) : m_nStrongLocks(0) {}
-	DWORD __stdcall AddConnection(DWORD extconn, DWORD )
-	{
-		DWORD dw = 0;
-		if (extconn & EXTCONN_STRONG)
-		{
-			dw = T::_ThreadModel::Increment(&m_nStrongLocks);
-			static_cast<T*>(this)->OnAddConnection(dw == 1);
-		}
-		return dw;
-	}
-	DWORD __stdcall ReleaseConnection(DWORD extconn, DWORD , BOOL bLastUnlockReleases)
-	{
-		DWORD dw = 0;
-		if (extconn & EXTCONN_STRONG)
-		{
-			dw = T::_ThreadModel::Decrement(&m_nStrongLocks);
-			static_cast<T*>(this)->OnReleaseConnection(dw == 0, !!bLastUnlockReleases);
-		}
-		return dw;
-	}
-
-	
-	bool DoIHaveAStub() { return m_nStrongLocks != 0; }
-	LONG GetStrongConnectionCount() { return m_nStrongLocks; }
-	
-	void OnAddConnection(bool bThisIsFirstLock) {}
-	void OnReleaseConnection(bool bThisIsLastUnlock, bool bLastUnlockReleases)
-	{
-		if (bThisIsLastUnlock && bLastUnlockReleases)
-			CoDisconnectObject(static_cast<T*>(this)->GetUnknown(), 0);
-	}
-	
-	LONG m_nStrongLocks;
-};
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}	
-#pragma pack(pop)
-
-
-
-
-
-
-#pragma warning (pop)
-
-
-
-
-
-
-
-
-using namespace ATL;
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireInstaller.vdproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireInstaller.vdproj
deleted file mode 100644
index af5659a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireInstaller.vdproj
+++ /dev/null
@@ -1,3276 +0,0 @@
-﻿"DeployProject"
-{
-"VSVersion" = "3:800"
-"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
-"IsWebType" = "8:FALSE"
-"ProjectName" = "8:IECrossfireInstaller"
-"LanguageId" = "3:1033"
-"CodePage" = "3:1252"
-"UILanguageId" = "3:1033"
-"SccProjectName" = "8:"
-"SccLocalPath" = "8:"
-"SccAuxPath" = "8:"
-"SccProvider" = "8:"
-    "Hierarchy"
-    {
-        "Entry"
-        {
-        "MsmKey" = "8:_084B599895D34B5C91B48103EDD41042"
-        "OwnerKey" = "8:_UNDEFINED"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_45B2DFC9DF4244B8B14D1AA1DBD805E0"
-        "OwnerKey" = "8:_UNDEFINED"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_599BE6DB6407468CBC0B327C6D9DA90F"
-        "OwnerKey" = "8:_084B599895D34B5C91B48103EDD41042"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_599BE6DB6407468CBC0B327C6D9DA90F"
-        "OwnerKey" = "8:_45B2DFC9DF4244B8B14D1AA1DBD805E0"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_6D1F615A31044CDB867EF6943A8BF696"
-        "OwnerKey" = "8:_B4CBFC7075C546E3A6BB1715EDCC0295"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_87FA8BE17F3F4CA8A409734D17E49460"
-        "OwnerKey" = "8:_599BE6DB6407468CBC0B327C6D9DA90F"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_B4CBFC7075C546E3A6BB1715EDCC0295"
-        "OwnerKey" = "8:_084B599895D34B5C91B48103EDD41042"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_B4CBFC7075C546E3A6BB1715EDCC0295"
-        "OwnerKey" = "8:_45B2DFC9DF4244B8B14D1AA1DBD805E0"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-    }
-    "Configurations"
-    {
-        "Debug"
-        {
-        "DisplayName" = "8:Debug"
-        "IsDebugOnly" = "11:TRUE"
-        "IsReleaseOnly" = "11:FALSE"
-        "OutputFilename" = "8:Debug\\IECrossfireInstaller.msi"
-        "PackageFilesAs" = "3:2"
-        "PackageFileSize" = "3:-2147483648"
-        "CabType" = "3:1"
-        "Compression" = "3:2"
-        "SignOutput" = "11:FALSE"
-        "CertificateFile" = "8:"
-        "PrivateKeyFile" = "8:"
-        "TimeStampServer" = "8:"
-        "InstallerBootstrapper" = "3:2"
-            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
-            {
-            "Enabled" = "11:TRUE"
-            "PromptEnabled" = "11:TRUE"
-            "PrerequisitesLocation" = "2:1"
-            "Url" = "8:"
-            "ComponentsUrl" = "8:"
-                "Items"
-                {
-                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.2.0"
-                    {
-                    "Name" = "8:Microsoft .NET Framework 2.0"
-                    "ProductCode" = "8:Microsoft.Net.Framework.2.0"
-                    }
-                }
-            }
-        }
-        "Release"
-        {
-        "DisplayName" = "8:Release"
-        "IsDebugOnly" = "11:FALSE"
-        "IsReleaseOnly" = "11:TRUE"
-        "OutputFilename" = "8:Release\\IECrossfireInstaller.msi"
-        "PackageFilesAs" = "3:2"
-        "PackageFileSize" = "3:-2147483648"
-        "CabType" = "3:1"
-        "Compression" = "3:2"
-        "SignOutput" = "11:FALSE"
-        "CertificateFile" = "8:"
-        "PrivateKeyFile" = "8:"
-        "TimeStampServer" = "8:"
-        "InstallerBootstrapper" = "3:2"
-            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
-            {
-            "Enabled" = "11:TRUE"
-            "PromptEnabled" = "11:TRUE"
-            "PrerequisitesLocation" = "2:1"
-            "Url" = "8:"
-            "ComponentsUrl" = "8:"
-                "Items"
-                {
-                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.2.0"
-                    {
-                    "Name" = "8:Microsoft .NET Framework 2.0"
-                    "ProductCode" = "8:Microsoft.Net.Framework.2.0"
-                    }
-                }
-            }
-        }
-    }
-    "Deployable"
-    {
-        "CustomAction"
-        {
-        }
-        "DefaultFeature"
-        {
-        "Name" = "8:DefaultFeature"
-        "Title" = "8:"
-        "Description" = "8:"
-        }
-        "ExternalPersistence"
-        {
-            "LaunchCondition"
-            {
-            }
-        }
-        "File"
-        {
-        }
-        "FileType"
-        {
-        }
-        "Folder"
-        {
-            "{1525181F-901A-416C-8A58-119130FE478E}:_2B99896331BC47A2B7D2ED9E4C943C77"
-            {
-            "Name" = "8:#1919"
-            "AlwaysCreate" = "11:FALSE"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Property" = "8:ProgramMenuFolder"
-                "Folders"
-                {
-                }
-            }
-            "{1525181F-901A-416C-8A58-119130FE478E}:_542E65342D844830AF64585A006FF418"
-            {
-            "Name" = "8:#1916"
-            "AlwaysCreate" = "11:FALSE"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Property" = "8:DesktopFolder"
-                "Folders"
-                {
-                }
-            }
-            "{3C67513D-01DD-4637-8A68-80971EB9504F}:_F79B3187A2A440AF924ED0481F6F9DA5"
-            {
-            "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
-            "Name" = "8:#1925"
-            "AlwaysCreate" = "11:FALSE"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Property" = "8:TARGETDIR"
-                "Folders"
-                {
-                }
-            }
-        }
-        "LaunchCondition"
-        {
-        }
-        "Locator"
-        {
-        }
-        "MsiBootstrapper"
-        {
-        "LangId" = "3:1033"
-        }
-        "Product"
-        {
-        "Name" = "8:Microsoft Visual Studio"
-        "ProductName" = "8:IE Crossfire Server"
-        "ProductCode" = "8:{8454AEA7-EC58-4709-BFED-85CCB406E206}"
-        "PackageCode" = "8:{E9C7B016-4491-4D26-8CBA-6A2A04003404}"
-        "UpgradeCode" = "8:{DC2603D4-1885-4F24-B9B6-5EB74FF9D579}"
-        "RestartWWWService" = "11:FALSE"
-        "RemovePreviousVersions" = "11:TRUE"
-        "DetectNewerInstalledVersion" = "11:TRUE"
-        "InstallAllUsers" = "11:FALSE"
-        "ProductVersion" = "8:1.0.0"
-        "Manufacturer" = "8:IBM"
-        "ARPHELPTELEPHONE" = "8:"
-        "ARPHELPLINK" = "8:"
-        "Title" = "8:IECrossfireInstaller"
-        "Subject" = "8:"
-        "ARPCONTACT" = "8:"
-        "Keywords" = "8:"
-        "ARPCOMMENTS" = "8:"
-        "ARPURLINFOABOUT" = "8:"
-        "ARPPRODUCTICON" = "8:"
-        "ARPIconIndex" = "3:0"
-        "SearchPath" = "8:"
-        "UseSystemSearchPath" = "11:TRUE"
-        "TargetPlatform" = "3:0"
-        "PreBuildEvent" = "8:"
-        "PostBuildEvent" = "8:"
-        "RunPostBuildEvent" = "3:0"
-        }
-        "Registry"
-        {
-            "HKLM"
-            {
-                "Keys"
-                {
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DAD57E19B4D94837BEC24C47E0780FE2"
-                    {
-                    "Name" = "8:Software"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E015CE8158BC49CA9EEC2877191F8823"
-                            {
-                            "Name" = "8:Microsoft"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_315AD8477CBB4333BCBC6888B9382F9D"
-                                    {
-                                    "Name" = "8:Windows"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8D04DC5B33BA47BAA5F0C652EEDB18BC"
-                                            {
-                                            "Name" = "8:CurrentVersion"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_49C46435279940B089A85048E755107F"
-                                                    {
-                                                    "Name" = "8:Explorer"
-                                                    "Condition" = "8:"
-                                                    "AlwaysCreate" = "11:FALSE"
-                                                    "DeleteAtUninstall" = "11:FALSE"
-                                                    "Transitive" = "11:FALSE"
-                                                        "Keys"
-                                                        {
-                                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E61E30E047AF477EA9831CF56DF514D1"
-                                                            {
-                                                            "Name" = "8:Browser Helper Objects"
-                                                            "Condition" = "8:"
-                                                            "AlwaysCreate" = "11:FALSE"
-                                                            "DeleteAtUninstall" = "11:FALSE"
-                                                            "Transitive" = "11:FALSE"
-                                                                "Keys"
-                                                                {
-                                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F5061C6500A04536B95A16845C74CEF2"
-                                                                    {
-                                                                    "Name" = "8:{E8779887-5AF1-4071-B4D4-6135157F142C}"
-                                                                    "Condition" = "8:"
-                                                                    "AlwaysCreate" = "11:TRUE"
-                                                                    "DeleteAtUninstall" = "11:TRUE"
-                                                                    "Transitive" = "11:TRUE"
-                                                                        "Keys"
-                                                                        {
-                                                                        }
-                                                                        "Values"
-                                                                        {
-                                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5DD16C450E4347F591BA8D691DCED3B8"
-                                                                            {
-                                                                            "Name" = "8:NoExplorer"
-                                                                            "Condition" = "8:"
-                                                                            "Transitive" = "11:FALSE"
-                                                                            "ValueTypes" = "3:3"
-                                                                            "Value" = "3:1"
-                                                                            }
-                                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_AAA485390EAB4AA8A48ACA6BC11222ED"
-                                                                            {
-                                                                            "Name" = "8:"
-                                                                            "Condition" = "8:"
-                                                                            "Transitive" = "11:FALSE"
-                                                                            "ValueTypes" = "3:1"
-                                                                            "Value" = "8:IECrossfireBHO Class"
-                                                                            }
-                                                                        }
-                                                                    }
-                                                                }
-                                                                "Values"
-                                                                {
-                                                                }
-                                                            }
-                                                        }
-                                                        "Values"
-                                                        {
-                                                        }
-                                                    }
-                                                }
-                                                "Values"
-                                                {
-                                                }
-                                            }
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D7792EB7943E479BB2CEC1FDAF5BC775"
-                                    {
-                                    "Name" = "8:Internet Explorer"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A81A16FBEBBE40BF824350F34DE99FED"
-                                            {
-                                            "Name" = "8:Toolbar2"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:TRUE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:TRUE"
-                                                "Keys"
-                                                {
-                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2F612EBFE1AC4F9B8E0C0461756A9E3D"
-                                                    {
-                                                    "Name" = "8:{201CD8EF-F249-42DC-AC2E-BDF0CD176F1A}"
-                                                    "Condition" = "8:"
-                                                    "AlwaysCreate" = "11:TRUE"
-                                                    "DeleteAtUninstall" = "11:TRUE"
-                                                    "Transitive" = "11:TRUE"
-                                                        "Keys"
-                                                        {
-                                                        }
-                                                        "Values"
-                                                        {
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7EA03F0B771C4A65B9508C4BF077E2E4"
-                                                            {
-                                                            "Name" = "8:"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:IECrossfireToolBand"
-                                                            }
-                                                        }
-                                                    }
-                                                }
-                                                "Values"
-                                                {
-                                                }
-                                            }
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                }
-            }
-            "HKCU"
-            {
-                "Keys"
-                {
-                }
-            }
-            "HKCR"
-            {
-                "Keys"
-                {
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_032C027743C84BD1AD96D8A81D6FCA8D"
-                    {
-                    "Name" = "8:IECrossfireServer.IEDebugger.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F6923631966F48B9AC2A9AFA67469371"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3642AA9787644AE49E976F940F0E3C1D"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_16380981ACEA46229F522133AB0EE67C"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:IEDebugger Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1B40BB5E02124FF9B6F955FBB96A8D50"
-                    {
-                    "Name" = "8:IECrossfireExtension.IECrossfireBHO.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_18F7A680CA16491A8064827E25FB02C9"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_677A45EB24774D4BB4CB205925DFB276"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{E8779887-5AF1-4071-B4D4-6135157F142C}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7867E4C0E8194250B1C5A36E252C1B33"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:IECrossfireBHO Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_201BA65CA2D04E84BBA80B1AB07918D4"
-                    {
-                    "Name" = "8:Interface"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_586ACAD3A1594C87ACD7416296E90DFC"
-                            {
-                            "Name" = "8:{201244D7-94C6-4FB0-9948-2634523A475B}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3F942CAFDD9D4A888FCBE34387368FF5"
-                                    {
-                                    "Name" = "8:ProxyStubClsid"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2223B9C734BB4A36BEF4CB186A2A3591"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8F3B48039E53497A92F246F8F1179CFB"
-                                    {
-                                    "Name" = "8:ProxyStubClsid32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_AB2F40363E024BEC983CCCB32D7567FA"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E8A1825CB55B427E84178B6B120C0806"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_9E8314CF080A4BF3AD160772324366CC"
-                                            {
-                                            "Name" = "8:Version"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:1.0"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D7ECCF6A14A944C58FAA444DED9B87A2"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7CB92D303947478EABBF9D8E073A84ED"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IIECrossfireBHO"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_69F8C77F401D4CF58256BE7BD57F3741"
-                            {
-                            "Name" = "8:{031DB015-B1BE-4D39-84D2-D7F96D2ACBFE}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_14A187CB0EF34A30AAABEC3814BC45E7"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_666E886651754ABEAD71A6678A677CFF"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F455E0ABAC8542CD8969ED4D3A95E39B"
-                                            {
-                                            "Name" = "8:Version"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:1.0"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C316A5011DAA408BB57E52E288127322"
-                                    {
-                                    "Name" = "8:ProxyStubClsid32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E690399F120A48B3872778A8E04DF89A"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F42FE6E4046A4226823CF1AF1E833CD3"
-                                    {
-                                    "Name" = "8:ProxyStubClsid"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4F7BE565007D4FC6920C17E8188830B0"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_82736A1D9B7C4091B96DA58692F3A215"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:ICrossfireServer"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CB5D4686903A45D599D3B00F95A695BC"
-                            {
-                            "Name" = "8:{F48260BB-C061-4410-9CE1-4C5C7602690E}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_21BBEDAE31E943E698C8C45DA043ACF7"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_58B3B11A66DD47929A68B223F6B26217"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6D4D7E96CF374E618A3F0F087BAF1869"
-                                            {
-                                            "Name" = "8:Version"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:1.0"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3C40A9300C924465A845622F699B9323"
-                                    {
-                                    "Name" = "8:ProxyStubClsid32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2D06E6FDB72C4C0B998046E21BB0388F"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_58B8704566E541F49CDAD7753EE275FF"
-                                    {
-                                    "Name" = "8:ProxyStubClsid"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_558F2CA7E27B4E75A7D97578534E5303"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_41DC2F33923E43BC8EC6F1D28CA5DE1A"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:ICrossfireServerClass"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_22D6C86E6E334B81A2835BF46D42A80F"
-                    {
-                    "Name" = "8:IECrossfireToolBand.CrossfireToolBand"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1D44E3C7E0AA40218716897036945B9B"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2287C9C4A49647CBA79162EDDC0106C4"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireToolBand.CrossfireToolBand.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1FE2E61B1A2344E29F26A74E6C2D7824"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2BFC6A508D7E48E4A7F140BF7E27666B"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{201CD8EF-F249-42DC-AC2E-BDF0CD176F1A}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D7AAB611DFB74567AF8D415227268FE7"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireToolBand Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_38003254C8CB4ED4AE5E87F366DE40CC"
-                    {
-                    "Name" = "8:IECrossfireServer.JSEvalCallback.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_45BB10C8BC1B4D50A875CE0651226460"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A6DA5E07BBE645098CEFA45FBDE68330"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_AF3B2A5FB2F84F30B14A80A13B09D155"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:JSEvalCallback Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3A0001E14F77457785324A1075F632C9"
-                    {
-                    "Name" = "8:AppID"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8C597E49BD764B57871896D532789B4F"
-                            {
-                            "Name" = "8:IECrossfireServer.EXE"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C5D5F21E1A0B40BD917C309BA53D4C17"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8D3C61D7569943D28DD9926D61D915AB"
-                            {
-                            "Name" = "8:{1D72A5EE-2740-48CA-B8E9-777483A92464}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E8E1F1EA311C41BA8CA3282FFC34204E"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireToolBand"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9D815AE40851488D933CAB2C97552870"
-                            {
-                            "Name" = "8:IECrossfireExtension.DLL"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_DBD499F663D54BCBBF87F0574AB49082"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{95F1ADFB-5440-462c-BAA3-9C068F1B1450}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A111D37CF0D84CDEB0D87F94763266E6"
-                            {
-                            "Name" = "8:IECrossfireToolBar.DLL"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F021508882E54863934E76813376E934"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1D72A5EE-2740-48CA-B8E9-777483A92464}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B738DD8B0C3C463B81F1406E380A4F59"
-                            {
-                            "Name" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_97E56B48558E427F96BC5D3CA6EBCF89"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DAB88FE1790C498BAFDF54934FC0D426"
-                            {
-                            "Name" = "8:{95F1ADFB-5440-462c-BAA3-9C068F1B1450}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A5AB7052E33F4D9E80E1A965AB105BF8"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireExtension"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_435131B7C7864453A3B2156B121EBF44"
-                    {
-                    "Name" = "8:IECrossfireServer.CrossfireServerClass"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_ACA905BC774247AB9B28A80AB2BB829A"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4E073EBBC6DA431AA0196B77663A839C"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FCDF0E884414407A804EA28A1D8DDE8F"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_387AC8239F894A439A928F48C48F1A9A"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.CrossfireServerClass.1"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_1B2CEEFA6D2C4ED48E43882AB863032D"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireServerClass Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4DBD5710896B42C6AD40813839348AA9"
-                    {
-                    "Name" = "8:TypeLib"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E1E9244ED8E248A7B646818FD25DAFE1"
-                            {
-                            "Name" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_10E18DDC7BDA4F0EB8B3AF65D13FD904"
-                                    {
-                                    "Name" = "8:1.0"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_01A2D6B4825E455EB6C299D147D16760"
-                                            {
-                                            "Name" = "8:0"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8E23A73E574A4BC9B41F095BBD84FEB8"
-                                                    {
-                                                    "Name" = "8:win32"
-                                                    "Condition" = "8:"
-                                                    "AlwaysCreate" = "11:FALSE"
-                                                    "DeleteAtUninstall" = "11:FALSE"
-                                                    "Transitive" = "11:FALSE"
-                                                        "Keys"
-                                                        {
-                                                        }
-                                                        "Values"
-                                                        {
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_56F3CC3492694A6DACED48A48384BF8E"
-                                                            {
-                                                            "Name" = "8:"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:[TARGETDIR]IECrossfireExtension.dll"
-                                                            }
-                                                        }
-                                                    }
-                                                }
-                                                "Values"
-                                                {
-                                                }
-                                            }
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_944452F0FE714EB880EDBA6C65CD412C"
-                                            {
-                                            "Name" = "8:HELPDIR"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                }
-                                                "Values"
-                                                {
-                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E03A865A7DF14A0F80574FC790ABB677"
-                                                    {
-                                                    "Name" = "8:"
-                                                    "Condition" = "8:"
-                                                    "Transitive" = "11:FALSE"
-                                                    "ValueTypes" = "3:1"
-                                                    "Value" = "8:"
-                                                    }
-                                                }
-                                            }
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BCF40615466D466D8EE618167D64ACAA"
-                                            {
-                                            "Name" = "8:FLAGS"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                }
-                                                "Values"
-                                                {
-                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4DC6FB535C764BE8826AD1B03A51CFB6"
-                                                    {
-                                                    "Name" = "8:"
-                                                    "Condition" = "8:"
-                                                    "Transitive" = "11:FALSE"
-                                                    "ValueTypes" = "3:1"
-                                                    "Value" = "8:0"
-                                                    }
-                                                }
-                                            }
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_191A3CC7B04C4FF3ADC9AD697DAF205A"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireExtension 1.0 Type Library"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_529DF02296EB412E999A4FF767FA88D7"
-                    {
-                    "Name" = "8:IECrossfireServer.CrossfireServer"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_46931859219649E5964BE48ABB3D196F"
-                            {
-                            "Name" = "8:CLSIDBOGUS"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C68A4DE7C2B542439DA6014B8ADCEBEA"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4D6C36184DB440DCA6DEE15F79103F06"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7FBC4B2CE01C4DB3A25F58344A0A82A4"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.CrossfireServer.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DADD0BAFEB3046B694230EBEEADE32F9"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_757265130B374C9488D84CE3772B0D11"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{47836AF4-3E0C-4995-8029-FF931C5A43FC}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5531174EBB4D4E2A8035BEB2361EBFA9"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireServer Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_83ACD655F8154369B627E99E631C0A4D"
-                    {
-                    "Name" = "8:IECrossfireServer.JSEvalCallback"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_74B4BD3F62174A3C8A13E1A839EF4CC7"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2750135FD2284B178177C21EFDB90375"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.JSEvalCallback.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D7BFC80626BE44E2BA0655DE1CA9EBBB"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3F8F6D5A101841AC92FE28CBD1FE23D4"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_06E13A0FF629482888AC5C70A9776BA6"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:JSEvalCallback Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_86C56E9F48C04E8BB4DF5D08AABF908E"
-                    {
-                    "Name" = "8:IECrossfireServer.PendingBreakpoint"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9DC841FA63A74F71BF1BF15EC5BFDB4D"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_DAB080C6ECBA446BBF6101639A8CFCB4"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.PendingBreakpoint.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F8D91A61C79649C5B5CFA1EC7AB27D53"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A57BA27E0EE44032BFB4AB3C4526E27F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{88E7C480-7B7A-47C5-8329-CE1FDF415527}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A7B4878C249541E58FD74135F2052A8E"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:PendingBreakpoint Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A05AF1F3CE414E8EB045203FD6083127"
-                    {
-                    "Name" = "8:IECrossfireExtension.IECrossfireBHO"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9FA71E4D5DE34DAD9F570EAF455ED0DB"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_0C2CBA7ABE8D45A3B066973B117FC480"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireExtension.IECrossfireBHO.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D336456A386240B9A9C7DEA8D1599F08"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E07F0A58052247F48DD3376D0C722A9E"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{E8779887-5AF1-4071-B4D4-6135157F142C}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3B62D1B47E014B258923D69092C54D7C"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:IECrossfireBHO Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AC1D202289004B97AD0C60F99AB421F0"
-                    {
-                    "Name" = "8:IECrossfireServer.CrossfireServer.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2E3DED797B0540E9AA2C0C0992FFE8B5"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5087D77413B445CD9A0B9C88C179D86B"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{47836AF4-3E0C-4995-8029-FF931C5A43FC}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_975DAD0177AD4AFDBB0217399449799A"
-                            {
-                            "Name" = "8:CLSIDBOGUS"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5C2D9E3A88084B5E985E27995A406FCC"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C8F7BAD6F92A4F7080E5EE05FF2113D2"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireServer Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C4C8A656186E4FF09119160B0E7F558A"
-                    {
-                    "Name" = "8:CLSID"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2189685375BB4906B9EDD07522F45C93"
-                            {
-                            "Name" = "8:{E8779887-5AF1-4071-B4D4-6135157F142C}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_29D2515DF67F4AAEB9B625A996D1BBF5"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5D7424E813B246ABB975203C59AAE93E"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireExtension.IECrossfireBHO.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3E29680E7B1F4D13879221993539367F"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_93E6B19383134D2D8BE8A5667D49C3D4"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireExtension.IECrossfireBHO"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_98E1EBDD2DF34A3DB17242CC264940E2"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_17F246F05C8246208876894BD173E40E"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{3FE86E35-0025-45C7-A841-E10AFE660A7F}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E871087D818A40BEA65E10E886555449"
-                                    {
-                                    "Name" = "8:InprocServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ABB5045D832E4DF1BAE3C399CD87EE7A"
-                                            {
-                                            "Name" = "8:ThreadingModel"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:Apartment"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_CD4CF6476714454E826CFF89017924C9"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireExtension.dll\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EE4B1D30809140E5A880B836B6F55E35"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ADF6497B9A2547CBBD130083FF18EDA4"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2CBA68ED52344E278012A8639D2FA855"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{95F1ADFB-5440-462c-BAA3-9C068F1B1450}"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F063353B630D41D799D694138C168263"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireBHO Class"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5447D14FBC01477CBF32404CB6285437"
-                            {
-                            "Name" = "8:{88E7C480-7B7A-47C5-8329-CE1FDF415527}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_117E8AFCE9E34F9A95174EA7AE803064"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A40708D46C3142968865DFB012646256"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_18D7DC3C4D314539A34548AE6D0003D9"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F895170364C849E3BE709AA237576985"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_31A4D968065D43F9B0A0C7B79129FED5"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_493D147B7E0E4F6D9752290B1547D846"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.PendingBreakpoint.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6B41532634F14B0E84F5C0B424AA792B"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AFBD8B5BE39E4CE4BAF02AA05AF7CD33"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_36D87C6857A94E12B4B81813B9FCA56C"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.PendingBreakpoint"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_9947B5CC790D4F16AAF2DB140EEDA4F1"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:PendingBreakpoint Class"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_FA3FDC633E034249BF0AB4E9823A325F"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6B7D94AE9CAF4E8589765C256EC81689"
-                            {
-                            "Name" = "8:{201CD8EF-F249-42DC-AC2E-BDF0CD176F1A}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_16EBBDDE44C54EB49282CDD9DDE6671C"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_21833C8CC02B4FEB828ED6D8990C3595"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_DCC49B6F8E1E4C30AD875EFBE9D53EE3"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{0F916C8A-FCE2-4335-BF1F-71F7A73BBF9F}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6142A477FF7043D393E46F7E457972BE"
-                                    {
-                                    "Name" = "8:InProcServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_28F7FCD272954DC687AAEA7602A085DC"
-                                            {
-                                            "Name" = "8:ThreadingModel"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:Apartment"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_B8D84DE9CED343F099D49816BA6A73FA"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:[TARGETDIR]IECrossfireToolBand.dll"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C4DF201A45264DF5A6A73DCE14614C25"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7BC46880AF774BDA8B824578FA39DFC1"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireToolBand.CrossfireToolBand"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E8003FB5897E49B1B2ECE7552C144FF5"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2C081AF178824FEBA465EAA07C7C5078"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireToolBand.CrossfireToolBand.1"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6AE1AF4F966C42ADA21FF03FC29807C4"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1D72A5EE-2740-48CA-B8E9-777483A92464}"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_FEB7C45B17C54AB19127E462ADF1D4E6"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:CrossfireToolBand Class"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8493B1EC5C4A436CBFD65942FB5102E7"
-                            {
-                            "Name" = "8:{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_0CCC8CFA6FB44629A2C37F772CCABB47"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3A04ECDEE1FB4036BE36713B81911FD7"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_69A60A49A87E493BBDFE42D51BCB1F1A"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_8B0DF96E2EFC4BB19DC738049C902C24"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_98C20FCBD4C24FB6B5C846EDE3741708"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D2B52805930048C183B3CADEF6DCA1D3"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.CrossfireServer.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B80CDE0101CF436B9B198FC5FF241AE4"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_786796B507774648B281563B5A0B8E2F"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.CrossfireServer"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FA9701837CB04BB7943D855A9A5CCF03"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ACDC8F134FDE4142BD25F0A7AE0BB7EE"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:CrossfireServerClass Class"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_FF96B7E67B1744E4BD6E1E70716FF87A"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BD043FDE5D2A42979AAF59672F48E60E"
-                            {
-                            "Name" = "8:{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_00D241A240234703890E7A841E572210"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_B86A5208CF7A478AACC5D1DAEB5845C2"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.JSEvalCallback"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4712AC4E83904A7BA927E6338F16A36B"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_34F2240F979846DEB84DE7B25FF8EF87"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_538132D821DE498FAC092D7B615529B9"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4E6C9E5861B64D1FA7BAE98A2C239256"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_921FA0CC8E63402C8996E79C819D3ABF"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_AF5C5A2649C74F079D826795879CDD62"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.JSEvalCallback.1"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5D327EBF408E42B5B1F6C93BD8513DF8"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:JSEvalCallback Class"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A6DD64D21B91424B901C9D8A9BF5BCA2"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DFCF0F4E58914515BEB6C55DA50484B9"
-                            {
-                            "Name" = "8:{47836AF4-3E0C-4995-8029-FF931C5A43FC}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AF4E813CA86E436CB889952393707738"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_809B9CA8B38840859F207535B9B76746"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BA03A9916DBE4CBAA4343D5657B686A4"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BA8FE23FFD2F4EDD898196521266F8CB"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_05DB65BE480C41418D76B744CE130902"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.CrossfireServer.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E6C80DC2868E468A9366A450E5C84E64"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4DA8B5F4EDCC429F8AA3F9AE2FECA5F2"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F9B06D0FC3E64D749B438E271E15B364"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_296BEEA7DB5447C5AA3FF9C5D4F5C5A6"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.CrossfireServer"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2FB7D3E090994B0BA8A016984A40C750"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:CrossfireServer Class"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6AA994D634F94D26BDF118B1D44D32A7"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E0B108A6542C40D0988D5C05CCEEEA26"
-                            {
-                            "Name" = "8:{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_294F1D32FB6147B4A66051FAD175694B"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_9A695589D9CE4F87B925FA00F4101A42"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.IEDebugger.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6303304E0B6D4111A87820A954FDBEAE"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A83BD51883884469AC761DB66289590C"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_67A637C1B5574692A66B8248FD9D1CE4"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_BE5E78C8B51C466FB7D4ACF45E34E0EE"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.IEDebugger"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DA68A690366F419A8A26888C7414B145"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:TRUE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_10A75B126CE640558A00C40361240B97"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5CDC11CDB2FB46FE8B2ABD1733474AEC"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_B1FF2180AFDE42D7BC534F06FE0EB03F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IEDebugger Class"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C9BBCB11A5F6451E81946BC374538D1A"
-                    {
-                    "Name" = "8:IECrossfireServer.PendingBreakpoint.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6B7C8F9FBF484209A8F72D3827C6EB3A"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E22C07399B164639970B05D97A00CBD6"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{88E7C480-7B7A-47C5-8329-CE1FDF415527}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_EC0BFBC59FD74795B16CA8AA9FBFD8C0"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:PendingBreakpoint Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D5D43D7527814005AF04D5123AE1DADC"
-                    {
-                    "Name" = "8:IECrossfireServer.CrossfireServerClass.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AB8139DF46764224A4B27B4FB3772902"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_02BD6CF55FBA451697FE25910785FF7F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_21710665B9254B099F4D45AB8F0044FA"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireServerClass Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DDE8E336BE8745C393882C835283FD46"
-                    {
-                    "Name" = "8:IECrossfireServer.IEDebugger"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_49C42D3E92F04AF5840CC4EDEF35F12D"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_673777D75211427FA3801998CD5FD772"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A8BDC4165EA9482AAB1C952DB1C02DE5"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_484B701FC98D4977A99F0DAF3FE75F2F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.IEDebugger.1"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_CD761FA04CBD44BCADF8C8AD3625D690"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:IEDebugger Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E7F34417E1294BCDAA574BE5A2E57E9B"
-                    {
-                    "Name" = "8:IECrossfireToolBand.CrossfireToolBand.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:TRUE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EB958070EDF14C308A5B7A0C7C124242"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:TRUE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A748338DD4954E7D9F733789B89F626F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{201CD8EF-F249-42DC-AC2E-BDF0CD176F1A}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E09E4511404949058A49B0C134931421"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireToolBand Class"
-                            }
-                        }
-                    }
-                }
-            }
-            "HKU"
-            {
-                "Keys"
-                {
-                }
-            }
-            "HKPU"
-            {
-                "Keys"
-                {
-                }
-            }
-        }
-        "Sequences"
-        {
-        }
-        "Shortcut"
-        {
-        }
-        "UserInterface"
-        {
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_141F29B7D3194AD58D4FE853AF7B3FE6"
-            {
-            "Name" = "8:#1902"
-            "Sequence" = "3:2"
-            "Attributes" = "3:3"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_05C032DEA994412DA349D66CCEEFF116"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Finished"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_467DA7C5045B4D0F9879613BDBDA2EB4"
-            {
-            "Name" = "8:#1902"
-            "Sequence" = "3:1"
-            "Attributes" = "3:3"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5DD72B82A55A4F6D9DDB6E2984AAABE3"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Finished"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "UpdateText"
-                            {
-                            "Name" = "8:UpdateText"
-                            "DisplayName" = "8:#1058"
-                            "Description" = "8:#1158"
-                            "Type" = "3:15"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:1"
-                            "Value" = "8:#1258"
-                            "DefaultValue" = "8:#1258"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5681E9F1FE4C4C43AEA755A81B3B9E7C"
-            {
-            "Name" = "8:#1900"
-            "Sequence" = "3:2"
-            "Attributes" = "3:1"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_3738443BB8D64900810C574693BB6BBF"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Welcome"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "CopyrightWarning"
-                            {
-                            "Name" = "8:CopyrightWarning"
-                            "DisplayName" = "8:#1002"
-                            "Description" = "8:#1102"
-                            "Type" = "3:3"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:1"
-                            "Value" = "8:#1202"
-                            "DefaultValue" = "8:#1202"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "Welcome"
-                            {
-                            "Name" = "8:Welcome"
-                            "DisplayName" = "8:#1003"
-                            "Description" = "8:#1103"
-                            "Type" = "3:3"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:1"
-                            "Value" = "8:#1203"
-                            "DefaultValue" = "8:#1203"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E3135651702942C19F60B823A2F3E308"
-                    {
-                    "Sequence" = "3:300"
-                    "DisplayName" = "8:Confirm Installation"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FECC155F4BEC4D4E8A58D25F7EB40A34"
-                    {
-                    "Sequence" = "3:200"
-                    "DisplayName" = "8:Installation Folder"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_855DFCB9ED424E1AB299D900E829858A"
-            {
-            "Name" = "8:#1900"
-            "Sequence" = "3:1"
-            "Attributes" = "3:1"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_68352804719046BB8792DBF3748067E5"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Welcome"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "CopyrightWarning"
-                            {
-                            "Name" = "8:CopyrightWarning"
-                            "DisplayName" = "8:#1002"
-                            "Description" = "8:#1102"
-                            "Type" = "3:3"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:1"
-                            "Value" = "8:#1202"
-                            "DefaultValue" = "8:#1202"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "Welcome"
-                            {
-                            "Name" = "8:Welcome"
-                            "DisplayName" = "8:#1003"
-                            "Description" = "8:#1103"
-                            "Type" = "3:3"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:1"
-                            "Value" = "8:#1203"
-                            "DefaultValue" = "8:#1203"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_EB0547A750B948FFB622DA67A20BFCC0"
-                    {
-                    "Sequence" = "3:300"
-                    "DisplayName" = "8:Confirm Installation"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_EE2AF07CF21E42A59E4C0C834C8F12E8"
-                    {
-                    "Sequence" = "3:200"
-                    "DisplayName" = "8:Installation Folder"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "InstallAllUsersVisible"
-                            {
-                            "Name" = "8:InstallAllUsersVisible"
-                            "DisplayName" = "8:#1059"
-                            "Description" = "8:#1159"
-                            "Type" = "3:5"
-                            "ContextData" = "8:1;True=1;False=0"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:0"
-                            "Value" = "3:1"
-                            "DefaultValue" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_B8CA9A4581ED49FA9AB65AF682B73E84"
-            {
-            "UseDynamicProperties" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_BF98141759964ECE9D4455465F90995E"
-            {
-            "Name" = "8:#1901"
-            "Sequence" = "3:1"
-            "Attributes" = "3:2"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B29833B9E6604479B045E19D92964B44"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Progress"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "ShowProgress"
-                            {
-                            "Name" = "8:ShowProgress"
-                            "DisplayName" = "8:#1009"
-                            "Description" = "8:#1109"
-                            "Type" = "3:5"
-                            "ContextData" = "8:1;True=1;False=0"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:0"
-                            "Value" = "3:1"
-                            "DefaultValue" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_C663B24DF9944D95B7303B0209C0BA01"
-            {
-            "UseDynamicProperties" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F6A3BC8A25314E15A8F9D1CD084AE407"
-            {
-            "Name" = "8:#1901"
-            "Sequence" = "3:2"
-            "Attributes" = "3:2"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6E55C6AE6F544E5591EB64DD13882CEC"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Progress"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "ShowProgress"
-                            {
-                            "Name" = "8:ShowProgress"
-                            "DisplayName" = "8:#1009"
-                            "Description" = "8:#1109"
-                            "Type" = "3:5"
-                            "ContextData" = "8:1;True=1;False=0"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:0"
-                            "Value" = "3:1"
-                            "DefaultValue" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        "MergeModule"
-        {
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_599BE6DB6407468CBC0B327C6D9DA90F"
-            {
-            "UseDynamicProperties" = "11:TRUE"
-            "IsDependency" = "11:TRUE"
-            "SourcePath" = "8:Microsoft_VC80_ATL_x86.msm"
-                "Properties"
-                {
-                }
-            "LanguageId" = "3:0"
-            "Exclude" = "11:FALSE"
-            "Folder" = "8:"
-            "Feature" = "8:"
-            "IsolateTo" = "8:"
-            }
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_6D1F615A31044CDB867EF6943A8BF696"
-            {
-            "UseDynamicProperties" = "11:TRUE"
-            "IsDependency" = "11:TRUE"
-            "SourcePath" = "8:policy_8_0_microsoft_vc80_crt_x86.msm"
-                "Properties"
-                {
-                }
-            "LanguageId" = "3:0"
-            "Exclude" = "11:FALSE"
-            "Folder" = "8:"
-            "Feature" = "8:"
-            "IsolateTo" = "8:"
-            }
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_87FA8BE17F3F4CA8A409734D17E49460"
-            {
-            "UseDynamicProperties" = "11:TRUE"
-            "IsDependency" = "11:TRUE"
-            "SourcePath" = "8:policy_8_0_microsoft_vc80_atl_x86.msm"
-                "Properties"
-                {
-                }
-            "LanguageId" = "3:0"
-            "Exclude" = "11:FALSE"
-            "Folder" = "8:"
-            "Feature" = "8:"
-            "IsolateTo" = "8:"
-            }
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_B4CBFC7075C546E3A6BB1715EDCC0295"
-            {
-            "UseDynamicProperties" = "11:TRUE"
-            "IsDependency" = "11:TRUE"
-            "SourcePath" = "8:Microsoft_VC80_CRT_x86.msm"
-                "Properties"
-                {
-                }
-            "LanguageId" = "3:0"
-            "Exclude" = "11:FALSE"
-            "Folder" = "8:"
-            "Feature" = "8:"
-            "IsolateTo" = "8:"
-            }
-        }
-        "ProjectOutput"
-        {
-            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_084B599895D34B5C91B48103EDD41042"
-            {
-            "SourcePath" = "8:..\\IECrossfireExtension\\Release\\IECrossfireExtension.dll"
-            "TargetName" = "8:"
-            "Tag" = "8:"
-            "Folder" = "8:_F79B3187A2A440AF924ED0481F6F9DA5"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Vital" = "11:TRUE"
-            "ReadOnly" = "11:FALSE"
-            "Hidden" = "11:FALSE"
-            "System" = "11:FALSE"
-            "Permanent" = "11:FALSE"
-            "SharedLegacy" = "11:FALSE"
-            "PackageAs" = "3:1"
-            "Register" = "3:1"
-            "Exclude" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "IsolateTo" = "8:"
-            "ProjectOutputGroupRegister" = "3:1"
-            "OutputConfiguration" = "8:"
-            "OutputGroupCanonicalName" = "8:Built"
-            "OutputProjectGuid" = "8:{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}"
-            "ShowKeyOutput" = "11:TRUE"
-                "ExcludeFilters"
-                {
-                }
-            }
-            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_45B2DFC9DF4244B8B14D1AA1DBD805E0"
-            {
-            "SourcePath" = "8:..\\IECrossfireServer\\Release\\IECrossfireServer.exe"
-            "TargetName" = "8:"
-            "Tag" = "8:"
-            "Folder" = "8:_F79B3187A2A440AF924ED0481F6F9DA5"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Vital" = "11:TRUE"
-            "ReadOnly" = "11:FALSE"
-            "Hidden" = "11:FALSE"
-            "System" = "11:FALSE"
-            "Permanent" = "11:FALSE"
-            "SharedLegacy" = "11:FALSE"
-            "PackageAs" = "3:1"
-            "Register" = "3:1"
-            "Exclude" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "IsolateTo" = "8:"
-            "ProjectOutputGroupRegister" = "3:1"
-            "OutputConfiguration" = "8:"
-            "OutputGroupCanonicalName" = "8:Built"
-            "OutputProjectGuid" = "8:{2B73B89A-A1B4-479B-8751-A25B9036A9AF}"
-            "ShowKeyOutput" = "11:TRUE"
-                "ExcludeFilters"
-                {
-                }
-            }
-        }
-        "VJSharpPlugin"
-        {
-        }
-    }
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/IECrossfireInstaller.msi b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/IECrossfireInstaller.msi
deleted file mode 100644
index dc69935..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/IECrossfireInstaller.msi
+++ /dev/null
Binary files differ
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/setup.exe b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/setup.exe
deleted file mode 100644
index 1ed75e3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/setup.exe
+++ /dev/null
Binary files differ
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.cpp
deleted file mode 100644
index 062573f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.cpp
+++ /dev/null
@@ -1,342 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireBPManager.h"
-
-const wchar_t* CrossfireBPManager::KEY_BREAKPOINT = L"breakpoint";
-const wchar_t* CrossfireBPManager::KEY_BREAKPOINTS = L"breakpoints";
-
-CrossfireBPManager::CrossfireBPManager() {
-	m_breakpoints = new std::map<unsigned int, CrossfireBreakpoint*>;
-}
-
-CrossfireBPManager::~CrossfireBPManager() {
-	std::map<unsigned int,CrossfireBreakpoint*>::iterator iterator = m_breakpoints->begin();
-	while (iterator != m_breakpoints->end()) {
-		delete iterator->second;
-		iterator++;
-	}
-	delete m_breakpoints;
-}
-
-bool CrossfireBPManager::clearBreakpoint(unsigned int handle) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("clearBreakpoint: unknown breakpoint handle", handle);
-		return false;
-	}
-
-	delete iterator->second;
-	m_breakpoints->erase(iterator);
-	return true;
-}
-
-bool CrossfireBPManager::commandChangeBreakpoint(Value* arguments, IBreakpointTarget* target, Value** _responseBody) {
-	*_responseBody = NULL;
-
-	Value* value_handle = arguments->getObjectValue(CrossfireBreakpoint::KEY_HANDLE);
-	if (!value_handle || value_handle->getType() != TYPE_NUMBER || (unsigned int)value_handle->getNumberValue() < 1) {
-		Logger::error("'changeBreakpoint' command does not have a valid 'handle' value ");
-		return false;
-	}
-
-	Value* value_condition = arguments->getObjectValue(CrossfireBreakpoint::KEY_CONDITION);
-	if (value_condition && (value_condition->getType() & (TYPE_NULL | TYPE_STRING)) == 0) {
-		Logger::error("'changeBreakpoint' command has 'condition' value of type != String | Null");
-		return false;
-	}
-
-	Value* value_enabled = arguments->getObjectValue(CrossfireBreakpoint::KEY_ENABLED);
-	if (value_enabled && value_enabled->getType() != TYPE_BOOLEAN) {
-		Logger::error("'changeBreakpoint' command has 'enabled' value of type != Boolean");
-		return false;
-	}
-
-	unsigned int handle = (unsigned int)value_handle->getNumberValue();
-	if (value_enabled) {
-		if (!target->setBreakpointEnabled(handle, value_enabled->getBooleanValue())) {
-			return false;
-		}
-		if (!this->setBreakpointEnabled(handle, value_enabled->getBooleanValue())) {
-			return false;
-		}
-	}
-	if (value_condition) {
-		std::wstring* condition = value_condition->getType() == TYPE_STRING ? value_condition->getStringValue() : NULL;
-		if (!target->setBreakpointCondition(handle, condition)) {
-			return false;
-		}
-		if (!this->setBreakpointCondition(handle, condition)) {
-			return false;
-		}
-	}
-
-	Value* result = new Value();
-	result->setType(TYPE_OBJECT);
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireBPManager::commandClearBreakpoint(Value* arguments, IBreakpointTarget* target, Value** _responseBody) {
-	*_responseBody = NULL;
-
-	Value* value_handle = arguments->getObjectValue(CrossfireBreakpoint::KEY_HANDLE);
-	if (!value_handle || value_handle->getType() != TYPE_NUMBER || (unsigned int)value_handle->getNumberValue() < 1) {
-		Logger::error("'clearBreakpoint' command does not have a valid 'handle' value ");
-		return false;
-	}
-
-	if (!target->clearBreakpoint((unsigned int)value_handle->getNumberValue())) {
-		return false;
-	}
-	if (!this->clearBreakpoint((unsigned int)value_handle->getNumberValue())) {
-		return false;
-	}
-
-	Value* result = new Value();
-	result->setType(TYPE_OBJECT);
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireBPManager::commandGetBreakpoint(Value* arguments, IBreakpointTarget* target, Value** _responseBody) {
-	*_responseBody = NULL;
-
-	Value* value_handle = arguments->getObjectValue(CrossfireBreakpoint::KEY_HANDLE);
-	if (!value_handle || value_handle->getType() != TYPE_NUMBER || (unsigned int)value_handle->getNumberValue() < 1) {
-		Logger::error("'getBreakpoint' command does not have a valid 'handle' value");
-		return false;
-	}
-
-	CrossfireBreakpoint* breakpoint = NULL;
-	unsigned int handle = (unsigned int)value_handle->getNumberValue();
-	if (!target->getBreakpoint(handle, &breakpoint)) {
-		return false;
-	}
-
-	Value* value_breakpoint = NULL;
-	bool success = breakpoint->toValueObject(&value_breakpoint);
-	delete breakpoint;
-	if (!success) {
-		return false;
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_BREAKPOINT, value_breakpoint);
-	delete value_breakpoint;
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireBPManager::commandGetBreakpoints(Value* arguments, IBreakpointTarget* target, Value** _responseBody) {
-	CrossfireBreakpoint** breakpoints = NULL;
-	if (!target->getBreakpoints(&breakpoints)) {
-		return false;
-	}
-
-	Value breakpointsArray;
-	breakpointsArray.setType(TYPE_ARRAY);
-	int index = 0;
-	while (breakpoints[index]) {
-		CrossfireBreakpoint* current = breakpoints[index];
-		Value* value_breakpoint = NULL;
-		if (current->toValueObject(&value_breakpoint)) {
-			breakpointsArray.addArrayValue(value_breakpoint);
-			delete value_breakpoint;
-		}
-		delete current;
-		index++;
-	}
-	delete[] breakpoints;
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_BREAKPOINTS, &breakpointsArray);
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireBPManager::commandSetBreakpoint(Value* arguments, IBreakpointTarget* target, Value** _responseBody) {
-	*_responseBody = NULL;
-
-	CrossfireBreakpoint* breakpoint = NULL;
-	if (!createBreakpoint(arguments, &breakpoint)) {
-		return false;
-	}
-
-	CrossfireBreakpoint* resultBreakpoint = NULL;
-	bool success = setBreakpointOnTarget(breakpoint, target, &resultBreakpoint);
-	//delete breakpoint;
-	if (!success) {
-		delete breakpoint;
-		return false;
-	}
-
-	setBreakpointOnTarget(breakpoint, this, NULL);
-	delete breakpoint;
-
-	Value* value_breakpoint = NULL;
-	success = resultBreakpoint->toValueObject(&value_breakpoint);
-	delete resultBreakpoint;
-	if (!success) {
-		return false;
-	}
-	Value* result = new Value();
-	result->addObjectValue(KEY_BREAKPOINT, value_breakpoint);
-	delete value_breakpoint;
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireBPManager::createBreakpoint(Value* arguments, CrossfireBreakpoint** _result) {
-	*_result = NULL;
-
-	Value* value_type = arguments->getObjectValue(CrossfireBreakpoint::KEY_TYPE);
-	if (!value_type || value_type->getType() != TYPE_STRING) {
-		Logger::error("breakpoint creation arguments do not have a valid 'type' value");
-		return false;
-	}
-
-	Value* value_condition = arguments->getObjectValue(CrossfireBreakpoint::KEY_CONDITION);
-	if (value_condition && (value_condition->getType() & (TYPE_NULL | TYPE_STRING)) == 0) {
-		Logger::error("breakpoint creation arguments have a 'condition' value of type != String | Null");
-		return false;
-	}
-
-	Value* value_enabled = arguments->getObjectValue(CrossfireBreakpoint::KEY_ENABLED);
-	if (value_enabled && value_enabled->getType() != TYPE_BOOLEAN) {
-		Logger::error("breakpoint creation arguments have an 'enabled' value of type != Boolean");
-		return false;
-	}
-
-	Value* value_location = arguments->getObjectValue(CrossfireBreakpoint::KEY_LOCATION);
-	if (!value_location || value_location->getType() != TYPE_OBJECT) {
-		Logger::error("breakpoint creation arguments do not have a valid 'location' value");
-		return false;
-	}
-
-	CrossfireBreakpoint* breakpoint = NULL;
-	wchar_t* type = (wchar_t*)value_type->getStringValue()->c_str();
-	if (CrossfireLineBreakpoint::CanHandleBPType(type)) {
-		breakpoint = new CrossfireLineBreakpoint();
-	} else {
-		Logger::error("breakpoint creation arguments specify an unknown 'type' value");
-		return false;
-	}
-
-	if (value_condition && value_condition->getType() == TYPE_STRING) {
-		breakpoint->setCondition(value_condition->getStringValue());
-	}
-	if (value_enabled) {
-		breakpoint->setEnabled(value_enabled->getBooleanValue());
-	}
-	if (!breakpoint->setLocationFromValue(value_location)) {
-		delete breakpoint;
-		return false;
-	}
-
-	*_result = breakpoint;
-	return true;
-}
-
-bool CrossfireBPManager::getBreakpoint(unsigned int handle, CrossfireBreakpoint** _value) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("getBreakpoint: unknown breakpoint handle");
-		return false;
-	}
-
-	CrossfireBreakpoint* breakpoint = iterator->second;
-	breakpoint->clone(_value);
-	return true;
-}
-
-bool CrossfireBPManager::getBreakpoints(CrossfireBreakpoint*** ___values) {
-	size_t size = m_breakpoints->size();
-	CrossfireBreakpoint** breakpoints = new CrossfireBreakpoint*[size + 1];
-
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator it = m_breakpoints->begin();
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator end = m_breakpoints->end();
-	int index = 0;
-	while (it != end) {
-		it->second->clone(&breakpoints[index++]);
-		it++;
-	}
-	breakpoints[index] = NULL;
-
-	*___values = breakpoints;
-	return true;
-}
-
-bool CrossfireBPManager::setBreakpointCondition(unsigned int handle, std::wstring* condition) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("setBreakpointCondition: unknown breakpoint handle", handle);
-		return false;
-	}
-
-	CrossfireBreakpoint* breakpoint = iterator->second;
-	breakpoint->setCondition(condition);
-	return true;
-}
-
-bool CrossfireBPManager::setBreakpointEnabled(unsigned int handle, bool enabled) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("setBreakpointEnabled: unknown breakpoint handle", handle);
-		return false;
-	}
-
-	CrossfireBreakpoint* breakpoint = iterator->second;
-	breakpoint->setEnabled(enabled);
-	return true;
-}
-
-bool CrossfireBPManager::setBreakpointOnTarget(CrossfireBreakpoint* breakpoint, IBreakpointTarget* target, CrossfireBreakpoint** _resultBreakpoint) {
-	if (_resultBreakpoint) {
-		*_resultBreakpoint = NULL;
-	}
-
-	bool success = false;
-	switch (breakpoint->getType()) {
-		case CrossfireBreakpoint::BPTYPE_LINE: {
-			CrossfireLineBreakpoint* copy = NULL;
-			((CrossfireLineBreakpoint*)breakpoint)->clone((CrossfireBreakpoint**)&copy);
-			success = target->setLineBreakpoint(copy, false);
-			if (success && _resultBreakpoint) {
-				*_resultBreakpoint = copy;
-			} else {
-				delete copy;
-			}
-			break;
-		}
-	}
-	return success;
-}
-
-void CrossfireBPManager::setBreakpointsForScript(std::wstring* url, IBreakpointTarget* target) {
-	std::map<unsigned int,CrossfireBreakpoint*>::iterator iterator = m_breakpoints->begin();
-	while (iterator != m_breakpoints->end()) {
-		CrossfireBreakpoint* breakpoint = iterator->second;
-		if (breakpoint->appliesToUrl(url)) {
-			bool success = setBreakpointOnTarget(breakpoint, target, NULL);
-		}
-		iterator++;
-	}
-}
-
-bool CrossfireBPManager::setLineBreakpoint(CrossfireLineBreakpoint *breakpoint, bool isRetry) {
-	CrossfireLineBreakpoint* copy = NULL;
-	breakpoint->clone((CrossfireBreakpoint**)&copy);
-	m_breakpoints->insert(std::pair<unsigned int, CrossfireBreakpoint*>(breakpoint->getHandle(), copy));
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.h
deleted file mode 100644
index f6c2b86..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <map>
-
-#include "IBreakpointTarget.h"
-#include "Logger.h"
-#include "Value.h"
-
-class CrossfireBPManager : IBreakpointTarget {
-
-public:
-	CrossfireBPManager();
-	~CrossfireBPManager();
-
-	virtual bool commandChangeBreakpoint(Value* arguments, IBreakpointTarget* target, Value** _responseBody);
-	virtual bool commandClearBreakpoint(Value* arguments, IBreakpointTarget* target, Value** _responseBody);
-	virtual bool commandGetBreakpoint(Value* arguments, IBreakpointTarget* target, Value** _responseBody);
-	virtual bool commandGetBreakpoints(Value* arguments, IBreakpointTarget* target, Value** _responseBody);
-	virtual bool commandSetBreakpoint(Value* arguments, IBreakpointTarget* target, Value** _responseBody);
-	virtual void setBreakpointsForScript(std::wstring* url, IBreakpointTarget* target);
-
-	/* IBreakpointTarget methods */
-	virtual bool clearBreakpoint(unsigned int handle);
-	virtual bool getBreakpoint(unsigned int handle, CrossfireBreakpoint** _value);
-	virtual bool getBreakpoints(CrossfireBreakpoint*** ___values);
-	virtual bool setBreakpointCondition(unsigned int handle, std::wstring* condition);
-	virtual bool setBreakpointEnabled(unsigned int handle, bool enabled);
-	virtual bool setLineBreakpoint(CrossfireLineBreakpoint* breakpoint, bool isRetry);
-
-private:
-	virtual bool createBreakpoint(Value* arguments, CrossfireBreakpoint** _result);
-	virtual bool setBreakpointOnTarget(CrossfireBreakpoint* breakpoint, IBreakpointTarget* target, CrossfireBreakpoint** _resultBreakpoint);
-
-	std::map<unsigned int, CrossfireBreakpoint*>* m_breakpoints;
-
-	static const wchar_t* KEY_BREAKPOINT;
-	static const wchar_t* KEY_BREAKPOINTS;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.cpp
deleted file mode 100644
index 1aab90a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireBreakpoint.h"
-
-/* initialize statics */
-const wchar_t* CrossfireBreakpoint::KEY_CONDITION = L"condition";
-const wchar_t* CrossfireBreakpoint::KEY_CONTEXTID = L"contextId";
-const wchar_t* CrossfireBreakpoint::KEY_ENABLED = L"enabled";
-const wchar_t* CrossfireBreakpoint::KEY_HANDLE = L"handle";
-const wchar_t* CrossfireBreakpoint::KEY_LOCATION = L"location";
-const wchar_t* CrossfireBreakpoint::KEY_TYPE = L"type";
-
-CrossfireBreakpoint::CrossfireBreakpoint() {
-	static unsigned int s_nextBreakpointHandle = 1;
-	m_condition = NULL;
-	m_contextId = NULL;
-	m_enabled = true;
-	m_handle = s_nextBreakpointHandle++;
-}
-
-CrossfireBreakpoint::CrossfireBreakpoint(unsigned int handle) {
-	m_condition = NULL;
-	m_contextId = NULL;
-	m_enabled = true;
-	m_handle = handle;
-}
-
-CrossfireBreakpoint::~CrossfireBreakpoint() {
-	if (m_condition) {
-		delete m_condition;
-	}
-	if (m_contextId) {
-		delete m_contextId;
-	}
-}
-
-bool CrossfireBreakpoint::appliesToUrl(std::wstring* url) {
-	return true;
-}
-
-const std::wstring* CrossfireBreakpoint::getCondition() {
-	return m_condition;
-}
-
-const std::wstring* CrossfireBreakpoint::getContextId() {
-	return m_contextId;
-}
-
-unsigned int CrossfireBreakpoint::getHandle() {
-	return m_handle;
-}
-
-bool CrossfireBreakpoint::isEnabled() {
-	return m_enabled;
-}
-
-void CrossfireBreakpoint::setCondition(std::wstring* value) {
-	if (m_condition) {
-		delete m_condition;
-		m_condition = NULL;
-	}
-	if (value) {
-		m_condition = new std::wstring;
-		m_condition->assign(*value);
-	}
-}
-
-void CrossfireBreakpoint::setContextId(std::wstring* value) {
-	if (m_contextId) {
-		delete m_contextId;
-		m_contextId = NULL;
-	}
-	if (value) {
-		m_contextId = new std::wstring;
-		m_contextId->assign(*value);
-	}
-}
-
-void CrossfireBreakpoint::setEnabled(bool value) {
-	m_enabled = value;
-}
-
-bool CrossfireBreakpoint::toValueObject(Value** _value) {
-	Value value_null;
-	value_null.setType(TYPE_NULL);
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_HANDLE, &Value((double)m_handle));
-	result->addObjectValue(KEY_TYPE, &Value(getTypeString()));
-	result->addObjectValue(KEY_CONDITION, m_condition ? &Value(m_condition) : &value_null);
-	result->addObjectValue(KEY_CONTEXTID, m_contextId ? &Value(m_contextId) : &value_null);
-	result->addObjectValue(KEY_ENABLED, &Value(m_enabled));
-	Value* value_location = NULL;
-	if (!getLocationAsValue(&value_location)) {
-		delete result;
-		return false;
-	}
-	result->addObjectValue(KEY_LOCATION, value_location);
-	delete value_location;
-	*_value = result;
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.h
deleted file mode 100644
index 20efc75..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <map>
-
-#include "Logger.h"
-#include "Value.h"
-
-class CrossfireBreakpoint {
-
-public:
-	virtual ~CrossfireBreakpoint();
-	virtual bool appliesToUrl(std::wstring* url);
-	virtual void clone(CrossfireBreakpoint** _value) = 0;
-	virtual const std::wstring* getCondition();
-	virtual const std::wstring* getContextId();
-	virtual unsigned int getHandle();
-	virtual int getType() = 0;
-	virtual const wchar_t* getTypeString() = 0;
-	virtual bool isEnabled();
-	virtual void setCondition(std::wstring* value);
-	virtual void setContextId(std::wstring* value);
-	virtual void setEnabled(bool value);
-	virtual bool setLocationFromValue(Value* value) = 0;
-	virtual bool toValueObject(Value** _value);
-
-	static const int BPTYPE_LINE = 1;
-	static const wchar_t* KEY_CONDITION;
-	static const wchar_t* KEY_CONTEXTID;
-	static const wchar_t* KEY_ENABLED;
-	static const wchar_t* KEY_HANDLE;
-	static const wchar_t* KEY_LOCATION;
-	static const wchar_t* KEY_TYPE;
-
-protected:
-	CrossfireBreakpoint();
-	CrossfireBreakpoint(unsigned int handle);
-	virtual bool getLocationAsValue(Value** _value) = 0;
-
-	unsigned int m_handle;
-
-private:
-	std::wstring* m_condition;
-	std::wstring* m_contextId;
-	bool m_enabled;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.cpp
deleted file mode 100644
index 0fffe76..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.cpp
+++ /dev/null
@@ -1,1688 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireContext.h"
-
-#include "JSONParser.h"
-
-/* command: backtrace */
-const wchar_t* CrossfireContext::COMMAND_BACKTRACE = L"backtrace";
-const wchar_t* CrossfireContext::KEY_FRAMES = L"frames";
-const wchar_t* CrossfireContext::KEY_FROMFRAME = L"fromFrame";
-const wchar_t* CrossfireContext::KEY_FUNC = L"func";
-const wchar_t* CrossfireContext::KEY_INDEX = L"index";
-const wchar_t* CrossfireContext::KEY_TOFRAME = L"toFrame";
-const wchar_t* CrossfireContext::KEY_TOTALFRAMES = L"totalFrames";
-
-/* command: continue */
-const wchar_t* CrossfireContext::COMMAND_CONTINUE = L"continue";
-
-/* command: evaluate */
-const wchar_t* CrossfireContext::COMMAND_EVALUATE = L"evaluate";
-const wchar_t* CrossfireContext::KEY_EXPRESSION = L"expression";
-const wchar_t* CrossfireContext::KEY_FRAME = L"frame";
-
-/* command: frame */
-const wchar_t* CrossfireContext::COMMAND_FRAME = L"frame";
-const wchar_t* CrossfireContext::JSVALUE_BOOLEAN = L"Boolean";
-const wchar_t* CrossfireContext::JSVALUE_FUNCTION = L"\"function\"";
-const wchar_t* CrossfireContext::JSVALUE_NUMBER = L"Number";
-const wchar_t* CrossfireContext::JSVALUE_NULL = L"Null";
-const wchar_t* CrossfireContext::JSVALUE_STRING = L"String";
-const wchar_t* CrossfireContext::JSVALUE_TRUE = L"true";
-const wchar_t* CrossfireContext::JSVALUE_UNDEFINED = L"Undefined";
-const wchar_t* CrossfireContext::KEY_INCLUDESCOPES = L"includeScopes";
-const wchar_t* CrossfireContext::KEY_LOCALS = L"locals";
-const wchar_t* CrossfireContext::KEY_NUMBER = L"number";
-const wchar_t* CrossfireContext::KEY_THIS = L"this";
-const wchar_t* CrossfireContext::KEY_VALUE = L"value";
-const wchar_t* CrossfireContext::VALUE_BOOLEAN = L"boolean";
-const wchar_t* CrossfireContext::VALUE_FUNCTION = L"function";
-const wchar_t* CrossfireContext::VALUE_NUMBER = L"number";
-const wchar_t* CrossfireContext::VALUE_OBJECT = L"object";
-const wchar_t* CrossfireContext::VALUE_STRING = L"string";
-const wchar_t* CrossfireContext::VALUE_UNDEFINED = L"undefined";
-
-/* command: inspect */
-const wchar_t* CrossfireContext::COMMAND_INSPECT = L"inspect";
-
-/* command: lookup */
-const wchar_t* CrossfireContext::COMMAND_LOOKUP = L"lookup";
-
-/* command: scope */
-const wchar_t* CrossfireContext::COMMAND_SCOPE = L"scope";
-
-/* command: scopes */
-const wchar_t* CrossfireContext::COMMAND_SCOPES = L"scopes";
-
-/* command: script */
-const wchar_t* CrossfireContext::COMMAND_SCRIPT = L"script";
-const wchar_t* CrossfireContext::KEY_SOURCE = L"source";
-
-/* command: scripts */
-const wchar_t* CrossfireContext::COMMAND_SCRIPTS = L"scripts";
-const wchar_t* CrossfireContext::KEY_COMPILATIONTYPE = L"compilationType";
-const wchar_t* CrossfireContext::KEY_COLUMNOFFSET = L"columnOffset";
-const wchar_t* CrossfireContext::KEY_ID = L"id";
-const wchar_t* CrossfireContext::KEY_LINECOUNT = L"lineCount";
-const wchar_t* CrossfireContext::KEY_LINEOFFSET = L"lineOffset";
-const wchar_t* CrossfireContext::KEY_SCRIPT = L"script";
-const wchar_t* CrossfireContext::KEY_SCRIPTS = L"scripts";
-const wchar_t* CrossfireContext::KEY_SOURCESTART = L"sourceStart";
-const wchar_t* CrossfireContext::KEY_SOURCELENGTH = L"sourceLength";
-const wchar_t* CrossfireContext::VALUE_TOPLEVEL = L"top-level";
-
-/* command: source */
-const wchar_t* CrossfireContext::COMMAND_SOURCE = L"source";
-
-/* command: suspend */
-const wchar_t* CrossfireContext::COMMAND_SUSPEND = L"suspend";
-const wchar_t* CrossfireContext::KEY_STEPACTION = L"stepaction";
-const wchar_t* CrossfireContext::VALUE_IN = L"in";
-const wchar_t* CrossfireContext::VALUE_NEXT = L"next";
-const wchar_t* CrossfireContext::VALUE_OUT = L"out";
-
-/* event: onScript */
-const wchar_t* CrossfireContext::EVENT_ONSCRIPT = L"onScript";
-
-/* breakpoint objects */
-const wchar_t* CrossfireContext::BPTYPE_LINE = L"line";
-const wchar_t* CrossfireContext::KEY_LOCATION = L"location";
-
-/* shared */
-const wchar_t* CrossfireContext::KEY_BREAKPOINT = L"breakpoint";
-const wchar_t* CrossfireContext::KEY_CONTEXTID = L"contextId";
-const wchar_t* CrossfireContext::KEY_HANDLE = L"handle";
-const wchar_t* CrossfireContext::KEY_INCLUDESOURCE = L"includeSource";
-const wchar_t* CrossfireContext::KEY_LINE = L"line";
-const wchar_t* CrossfireContext::KEY_TYPE = L"type";
-const wchar_t* CrossfireContext::KEY_URL = L"url";
-
-CrossfireContext::CrossfireContext(DWORD threadId, CrossfireServer* server) {
-	CComObject<IEDebugger>* result = NULL;
-	HRESULT hr = CComObject<IEDebugger>::CreateInstance(&result);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext(): CoCreateInstance(IIEDebugger) failed", hr);
-		return;
-	}
-	m_debugger = result;
-
-	m_breakpoints = new std::map<unsigned int, CrossfireBreakpoint*>;
-	m_cpcApplicationNodeEvents = 0;
-	m_server = server;
-	m_debugApplicationThread = NULL;
-	m_debuggerHooked = false;
-	m_href = NULL;
-	m_name = NULL;
-	m_nextObjectHandle = 1;
-	m_objects = new std::map<unsigned int, JSObject*>;
-	m_pendingBreakpoints = new std::vector<PendingBreakpoint*>;
-	m_running = true;
-	m_threadId = threadId;
-
-	IEDebugger* ieDebugger = static_cast<IEDebugger*>(m_debugger);
-	ieDebugger->setContext(this);
-	hookDebugger();
-}
-
-CrossfireContext::~CrossfireContext() {
-	if (m_breakpoints) {
-		std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->begin();
-		while (iterator != m_breakpoints->end()) {
-			delete iterator->second;
-			iterator++;
-		}
-		delete m_breakpoints;
-	}
-
-	if (m_pendingBreakpoints) {
-		std::vector<PendingBreakpoint*>::iterator iterator = m_pendingBreakpoints->begin();
-		while (iterator != m_pendingBreakpoints->end()) {
-			(*iterator)->Release();
-			iterator++;
-		}
-		delete m_pendingBreakpoints;
-	}
-
-
-	if (m_cpcApplicationNodeEvents) {
-		CComPtr<IRemoteDebugApplication> debugApplication = NULL;
-		if (!getDebugApplication(&debugApplication)) {
-			Logger::error("~CrossfireContext(): cannot Unadvise() the root node");
-		} else {
-			CComPtr<IDebugApplicationNode> rootNode = NULL;
-			HRESULT hr = debugApplication->GetRootNode(&rootNode);
-			if (FAILED(hr)) {
-				Logger::error("~CrossfireContext(): GetRootNode() failed", hr);
-			} else {
-				CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
-				hr = rootNode->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-				if (FAILED(hr)) {
-					Logger::error("~CrossfireContext(): QI(IConnectionPointContainer) failed", hr);
-				} else {
-					CComPtr<IConnectionPoint> connectionPoint = NULL;
-					hr = connectionPointContainer->FindConnectionPoint(IID_IDebugApplicationNodeEvents, &connectionPoint);
-					if (FAILED(hr)) {
-						Logger::error("~CrossfireContext(): FindConnectionPoint() failed", hr);
-					} else {
-						hr = connectionPoint->Unadvise(m_cpcApplicationNodeEvents);
-						if (FAILED(hr)) {
-							Logger::error("~CrossfireContext(): Unadvise() failed", hr);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	if (m_href) {
-		free(m_href);
-	}
-	if (m_name) {
-		free(m_name);
-	}
-	if (m_objects) {
-		std::map<unsigned int, JSObject*>::iterator iterator = m_objects->begin();
-		while (iterator != m_objects->end()) {
-			JSObject* jsObject = iterator->second;
-			jsObject->debugProperty->Release();
-			delete jsObject->name;
-			if (jsObject->objects) {
-				delete jsObject->objects;
-			}
-			jsObject->stackFrame->Release();
-			delete jsObject;
-			iterator++;
-		}
-		delete m_objects;
-	}
-	if (m_debuggerHooked && unhookDebugger()) {
-		/*
-		* Hooking our debugger and then unhooking it later appears to change its
-		* refcount by a net value of -1 instead of the expected 0.  To work around
-		* this we do not Release our debugger below if it has been hooked and unhooked,
-		* even though this Release should be required in order to offset the refcount
-		* that it starts with when instantiated.
-		*/
-	} else if (m_debugger) {
-		m_debugger->Release();
-	}
-	if (m_debugApplicationThread) {
-		m_debugApplicationThread->Release();
-	}
-}
-
-bool CrossfireContext::clearBreakpoint(unsigned int handle) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("clearBreakpoint: unknown breakpoint handle", handle);
-		return false;
-	}
-	CrossfireLineBreakpoint* breakpoint = (CrossfireLineBreakpoint*)iterator->second;
-
-	CComPtr<IDebugApplicationNode> node = NULL;
-	if (!findNode((wchar_t*)breakpoint->getUrl()->c_str(), NULL, &node)) {
-		Logger::error("CrossfireContext.clearBreakpoint(): unknown target url");
-		return false;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = node->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.clearBreakpoint(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText,(void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.clearBreakpoint(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG characterPosition = 0;
-	hr = documentText->GetPositionOfLine(breakpoint->getLine() - 1, &characterPosition);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.clearBreakpoint(): GetPositionOfLine() failed [1]", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = documentText->GetContextOfPosition(characterPosition, 1, &documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.clearBreakpoint(): GetContextOfPosition() failed", hr);
-		return false;
-	}
-
-	CComPtr<IEnumDebugCodeContexts> codeContexts = NULL;
-	hr = documentContext->EnumCodeContexts(&codeContexts);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.clearBreakpoint(): EnumCodeContexts() failed", hr);
-		return false;
-	}
-
-	ULONG fetched = 0;
-	IDebugCodeContext* codeContext = NULL;
-	hr = codeContexts->Next(1, &codeContext, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.clearBreakpoint(): Next() failed", hr);
-		return false;
-	}
-
-	hr = codeContext->SetBreakPoint(BREAKPOINT_DELETED);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.clearBreakpoint(): SetBreakPoint() failed", hr);
-		return false;
-	}
-
-	delete iterator->second;
-	m_breakpoints->erase(iterator);
-	return true;
-}
-
-bool CrossfireContext::findNode(wchar_t* name, IDebugApplicationNode* startNode, IDebugApplicationNode** _value) {
-	*_value = NULL;
-
-	if (!startNode) {
-		CComPtr<IRemoteDebugApplication> application = NULL;
-		if (!getDebugApplication(&application)) {
-			return false;
-		}
-
-		CComPtr<IDebugApplicationNode> rootNode = NULL;
-		HRESULT hr = application->GetRootNode(&startNode);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext::findNode: GetRootNode() failed", hr);
-			return false;
-		}
-	}
-
-	CComBSTR url = NULL;
-	if (SUCCEEDED(startNode->GetName(DOCUMENTNAMETYPE_URL, &url))) {
-		if (wcscmp(std::wstring(url).c_str(), name) == 0) {
-			startNode->AddRef();
-			*_value = startNode;
-			return true;
-		}
-	}
-
-	CComPtr<IEnumDebugApplicationNodes> children = NULL;
-	HRESULT	hr = startNode->EnumChildren(&children);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.findNode(): EnumChildren() failed", hr);
-		return false;
-	}
-
-	ULONG fetched = 0;
-	do {
-		CComPtr<IDebugApplicationNode> current = NULL;
-		hr = children->Next(1, &current, &fetched);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.findNode(): Next() failed", hr);
-			continue;
-		}
-		if (fetched) {
-			IDebugApplicationNode* node = NULL;
-			if (findNode(name, current, &node)) {
-				*_value = node;
-				return true;
-			}
-		}
-	} while (fetched);
-
-	return false;
-}
-
-bool CrossfireContext::getBreakpoint(unsigned int handle, CrossfireBreakpoint** _value) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("getBreakpoint: unknown breakpoint handle", handle);
-		return false;
-	}
-	CrossfireBreakpoint* breakpoint = iterator->second;
-	breakpoint->clone(_value);
-	return true;
-}
-
-bool CrossfireContext::getBreakpoints(CrossfireBreakpoint*** ___values) {
-	size_t size = m_breakpoints->size();
-	CrossfireBreakpoint** breakpoints = new CrossfireBreakpoint*[size + 1];
-
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator it = m_breakpoints->begin();
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator end = m_breakpoints->end();
-	int index = 0;
-	while (it != end) {
-		it->second->clone(&breakpoints[index++]);
-		it++;
-	}
-	breakpoints[index] = NULL;
-
-	*___values = breakpoints;
-	return true;
-}
-
-bool CrossfireContext::getDebugApplication(IRemoteDebugApplication** _value) {
-	*_value = NULL;
-
-	CComPtr<IRemoteDebugApplicationThread> thread = NULL;
-	if (!getDebugApplicationThread(&thread)) {
-		return false;
-	}
-
-	HRESULT hr = thread->GetApplication(_value);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.getDebugApplication: GetApplication() failed", hr);
-		return false;
-	}
-
-	return true;
-}
-
-bool CrossfireContext::getDebugApplicationThread(IRemoteDebugApplicationThread** _value) {
-	*_value = NULL;
-
-	if (m_debugApplicationThread) {
-		m_debugApplicationThread->AddRef();
-		*_value = m_debugApplicationThread;
-		return true;
-	}
-
-	CComPtr<IMachineDebugManager> mdm;
-	HRESULT hr = mdm.CoCreateInstance(CLSID_MachineDebugManager, NULL, CLSCTX_ALL);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.getDebugApplicationThread(): CoCreateInstance(CLSID_MachineDebugManager) failed", hr);
-		return false;
-	}
-
-	CComPtr<IEnumRemoteDebugApplications> applications;
-	hr = mdm->EnumApplications(&applications);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.getDebugApplicationThread(): EnumApplications() failed", hr);
-		return false;
-	}
-
-	int counter = 0;
-//Logger::error("CrossfireContext.getDebugApplicationThread(): starting loop, looking for", (int)m_threadId);
-	ULONG fetchedApps = 0;
-	do {
-		CComPtr<IRemoteDebugApplication> currentApplication;
-		hr = applications->Next(1, &currentApplication, &fetchedApps);
-		if (FAILED(hr)) {
-			fetchedApps = 1; /* continue to try to enum more applications */
-//Logger::error("CrossfireContext.getDebugApplicationThread(): Next()[1] failed, keep trying", hr);
-		} else if (fetchedApps) {
-			CComPtr<IEnumRemoteDebugApplicationThreads> threads;
-			hr = currentApplication->EnumThreads(&threads);
-//if (FAILED(hr)) {
-//Logger::error("CrossfireContext.getDebugApplicationThread(): EnumThreads() failed, keep trying");
-//}
-			if (SUCCEEDED(hr)) {
-				ULONG fetchedThreads = 0;
-				do {
-					CComPtr<IRemoteDebugApplicationThread> currentThread;
-					hr = threads->Next(1, &currentThread, &fetchedThreads);
-					if (FAILED(hr)) {
-						fetchedThreads = 1; /* continue to try to enum more threads */
-//Logger::error("CrossfireContext.getDebugApplicationThread(): Next()[2] failed, keep trying");
-					} else if (fetchedThreads) {
-						DWORD currentThreadId;
-						hr = currentThread->GetSystemThreadId(&currentThreadId);
-						if (FAILED(hr)) {
-							Logger::error("CrossfireContext.getDebugApplicationThread(): GetSystemThreadId() failed", hr);
-						} else if (m_threadId == currentThreadId) {
-							CComPtr<IDebugApplicationNode> rootNode = NULL;
-							hr = currentApplication->GetRootNode(&rootNode);
-							if (FAILED(hr)) {
-								Logger::error("CrossfireContext.getDebugApplicationThread(): GetRootNode() failed", hr);
-							} else {
-								CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
-								hr = rootNode->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-								if (FAILED(hr)) {
-									Logger::error("CrossfireContext.getDebugApplicationThread(): QI(IConnectionPointContainer) failed", hr);
-								} else {
-									CComPtr<IConnectionPoint> connectionPoint = NULL;
-									hr = connectionPointContainer->FindConnectionPoint(IID_IDebugApplicationNodeEvents, &connectionPoint);
-									if (FAILED(hr)) {
-										Logger::error("CrossfireContext.getDebugApplicationThread(): FindConnectionPoint() failed", hr);
-									} else {
-										hr = connectionPoint->Advise(m_debugger, &m_cpcApplicationNodeEvents);
-										if (FAILED(hr)) {
-											Logger::error("CrossfireContext.getDebugApplicationThread(): Advise() failed", hr);
-										} else {
-											Logger::log("CrossfireContext.getDebugApplicationThread() found the thread and advised its root node successfully");
-											m_debugApplicationThread = currentThread;
-											m_debugApplicationThread->AddRef();
-											break;
-										}
-									}
-								}
-							}
-						}
-//else {
-//	Logger::error("CrossfireContext.getDebugApplicationThread(): they didn't match, got", (int)currentThreadId);
-//}
-					}
-				} while (fetchedThreads);
-			}
-		}
-	} while (!m_debugApplicationThread && fetchedApps);
-
-	if (!m_debugApplicationThread) {
-		Logger::log("CrossfireContext.getDebugApplicationThread() did not find the thread or did not advise its root node");
-		return false;
-	}
-
-	m_debugApplicationThread->AddRef();
-	*_value = m_debugApplicationThread;
-	return true;
-}
-
-wchar_t* CrossfireContext::getHref() {
-	return m_href;
-}
-
-wchar_t* CrossfireContext::getName() {
-	return m_name;
-}
-
-bool CrossfireContext::hookDebugger() {
-	if (m_debuggerHooked) {
-		return true;
-	}
-
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	if (!getDebugApplication(&application)) {
-		return false;
-	}
-
-	CComPtr<IApplicationDebugger> currentDebugger = NULL;
-	HRESULT hr = application->GetDebugger(&currentDebugger);
-	if (SUCCEEDED(hr) && currentDebugger) {
-		Logger::log("CrossfireContext.hookDebugger(): the application already has a debugger");
-		return false;
-	}
-
-	IEDebugger* ieDebugger = static_cast<IEDebugger*>(m_debugger);
-	hr = application->ConnectDebugger(ieDebugger);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.hookDebugger(): ConnectDebugger() failed", hr);
-		return false;
-	}
-
-	Logger::log("CrossfireContext.hookDebugger(): debugger successfully hooked");
-	m_debuggerHooked = true;
-	return true;
-}
-
-void CrossfireContext::installBreakpoints(std::vector<Value*>* breakpoints) {
-	std::vector<Value*>::iterator iterator = breakpoints->begin();
-	while (iterator != breakpoints->end()) {
-		Value* current = *iterator;
-		std::wstring* type = current->getObjectValue(KEY_TYPE)->getStringValue();
-		if (type->compare(std::wstring(BPTYPE_LINE)) == 0) {
-			Value* value_location = current->getObjectValue(KEY_LOCATION);
-			Value* value_url = value_location->getObjectValue(KEY_LINE);
-			if (value_url && value_url->getType() == TYPE_STRING) {
-
-			}
-		}
-		iterator++;
-	}
-}
-
-bool CrossfireContext::performRequest(CrossfireRequest* request) {
-	if (!m_debuggerHooked) {
-		hookDebugger();
-	}
-	wchar_t* command = request->getName();
-	Value* arguments = request->getArguments();
-	Value* responseBody = NULL;
-	bool success = false;
-
-	if (wcscmp(command, COMMAND_BACKTRACE) == 0) {
-		success = commandBacktrace(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_CONTINUE) == 0) {
-		success = commandContinue(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_EVALUATE) == 0) {
-		success = commandEvaluate(arguments, request->getSeq(), &responseBody);
-	} else if (wcscmp(command, COMMAND_FRAME) == 0) {
-		success = commandFrame(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_LOOKUP) == 0) {
-		success = commandLookup(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_SCRIPT) == 0) {
-		success = commandScript(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_SCRIPTS) == 0) {
-		success = commandScripts(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_SCOPE) == 0) {
-		success = commandScope(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_SCOPES) == 0) {
-		success = commandScopes(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_SOURCE) == 0) {
-		success = commandSource(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_SUSPEND) == 0) {
-		success = commandSuspend(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_INSPECT) == 0) {
-		success = false;
-	} else {
-		return false;	/* command not handled */
-	}
-
-	CrossfireResponse response;
-	response.setName(command);
-	response.setRequestSeq(request->getSeq());
-	response.setRunning(m_running);
-	response.setSuccess(success);
-	if (success) {
-		response.setBody(responseBody);
-	} else {
-		Value emptyBody;
-		emptyBody.setType(TYPE_OBJECT);
-		response.setBody(&emptyBody);
-	}
-	if (responseBody) {
-		delete responseBody;
-	}
-	m_server->sendResponse(&response);
-	return true;
-}
-
-bool CrossfireContext::scriptLoaded(std::wstring* url, IDebugApplicationNode *applicationNode, bool isRetry) {
-	CrossfireBPManager* bpManager = m_server->getBreakpointManager();
-	/*
-	 * Incoming IBreakpointTarget method invocations should always be for this
-	 * application node, so store it temporarily so that's it's easily accessible,
-	 * rather than repeatedly looking it up for each IBreakpointTarget invocation.
-	 */
-	m_currentScriptNode = applicationNode;
-	bpManager->setBreakpointsForScript(url, this);
-	m_currentScriptNode = NULL;
-
-	Value* script = NULL;
-	if (createValueForScript(applicationNode, false, &script)) {
-		CrossfireEvent onScriptEvent;
-		onScriptEvent.setName(EVENT_ONSCRIPT);
-		Value data;
-		data.addObjectValue(KEY_SCRIPT, script);
-		delete script;
-		onScriptEvent.setData(&data);
-		sendEvent(&onScriptEvent);
-		return true;
-	}
-
-	if (isRetry) {
-		return false;
-	}
-
-	/*
-	 * The script's content has been loaded yet, so create a listener object
-	 * that will call this method again when this script has been loaded
-	 */
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = applicationNode->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.scriptLoaded(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComObject<PendingBreakpoint>* pendingBreakpoint = NULL;
-	hr = CComObject<PendingBreakpoint>::CreateInstance(&pendingBreakpoint);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.scriptLoaded(): CreateInstance(CLSID_PendingBreakpoint) failed [1]", hr);
-		return false;
-	}
-
-	pendingBreakpoint->AddRef(); /* CComObject::CreateInstance gives initial ref count of 0 */
-	if (pendingBreakpoint->init(applicationNode, document, this)) {
-		m_pendingBreakpoints->push_back(pendingBreakpoint);
-	} else {
-		pendingBreakpoint->Release();
-	}
-
-	return false;
-}
-
-void CrossfireContext::sendEvent(CrossfireEvent* eventObj) {
-	eventObj->setContextId(&std::wstring(m_name));
-	m_server->sendEvent(eventObj);
-
-	// TODO REMOVE!  This is done just to prevent errors from leaving IE hanging forever
-	if (wcscmp(eventObj->getName(), L"onConsoleError") == 0) {
-		Logger::log("sending onConsoleError, so doing auto-resume, don't forget to remove me!!!");
-		CComPtr<IRemoteDebugApplicationThread> applicationThread = NULL;
-		if (!getDebugApplicationThread(&applicationThread)) {
-			Logger::error("failed to do auto-resume: getDebugApplicationThread() failed");
-			return;
-		}
-		CComPtr<IRemoteDebugApplication> application = NULL;
-		HRESULT hr = applicationThread->GetApplication(&application);
-		if (FAILED(hr)) {
-			Logger::error("failed to do auto-resume: GetApplication() failed", hr);
-			return;
-		}
-
-		hr = application->ResumeFromBreakPoint(applicationThread, BREAKRESUMEACTION_CONTINUE, ERRORRESUMEACTION_SkipErrorStatement);
-		if (FAILED(hr)) {
-			Logger::error("failed to do auto-resume: ResumeFromBreakPoint() failed", hr);
-		}
-	}
-	// -------------------------------------------------
-}
-
-bool CrossfireContext::setBreakpointCondition(unsigned int handle, std::wstring* condition) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("setBreakpointCondition: unknown breakpoint handle", handle);
-		return false;
-	}
-	CrossfireBreakpoint* breakpoint = iterator->second;
-	breakpoint->setCondition(condition);
-	return true;
-}
-
-bool CrossfireContext::setBreakpointEnabled(unsigned int handle, bool enabled) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("setBreakpointEnabled: unknown breakpoint handle", handle);
-		return false;
-	}
-	CrossfireLineBreakpoint* breakpoint = (CrossfireLineBreakpoint*)iterator->second;
-
-	CComPtr<IDebugApplicationNode> node = NULL;
-	if (!findNode((wchar_t*)breakpoint->getUrl()->c_str(), NULL, &node)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): unknown target url");
-		return false;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = node->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText,(void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG characterPosition = 0;
-	hr = documentText->GetPositionOfLine(breakpoint->getLine() - 1, &characterPosition);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): GetPositionOfLine() failed [1]", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = documentText->GetContextOfPosition(characterPosition, 1, &documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): GetContextOfPosition() failed", hr);
-		return false;
-	}
-
-	CComPtr<IEnumDebugCodeContexts> codeContexts = NULL;
-	hr = documentContext->EnumCodeContexts(&codeContexts);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): EnumCodeContexts() failed", hr);
-		return false;
-	}
-
-	ULONG fetched = 0;
-	IDebugCodeContext* codeContext = NULL;
-	hr = codeContexts->Next(1, &codeContext, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): Next() failed", hr);
-		return false;
-	}
-
-	hr = codeContext->SetBreakPoint(enabled ? BREAKPOINT_ENABLED : BREAKPOINT_DISABLED);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): SetBreakPoint() failed", hr);
-		return false;
-	}
-
-	breakpoint->setEnabled(enabled);
-	return true;
-}
-
-void CrossfireContext::setHref(wchar_t* value) {
-	if (m_href) {
-		free(m_href);
-	}
-	m_href = _wcsdup(value);
-
-	if (!m_debuggerHooked) {
-		hookDebugger();
-	}
-}
-
-bool CrossfireContext::setLineBreakpoint(CrossfireLineBreakpoint *breakpoint, bool isRetry) {
-	// TODO uncomment the following once Refreshes cause new contexts to be created
-
-//	unsigned int handle = breakpoint->getHandle();
-//	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-//	if (iterator != m_breakpoints->end()) {
-//		/* this breakpoint is already set on this context */
-//		return true;
-//	}
-
-	CComPtr<IDebugApplicationNode> node = NULL;
-	if (m_currentScriptNode) {
-		node = m_currentScriptNode;
-	} else {
-		if (!findNode((wchar_t*)breakpoint->getUrl()->c_str(), NULL, &node)) {
-			Logger::error("CrossfireContext.setLineBreakpoint(): unknown target url");
-			return false;
-		}
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = node->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setLineBreakpoint(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText,(void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setLineBreakpoint(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG characterPosition = 0;
-	hr = documentText->GetPositionOfLine(breakpoint->getLine() - 1, &characterPosition);
-	if (FAILED(hr)) {
-		/*
-		 * In this context E_INVALIDARG failures are often caused by the target document
-		 * not being adequately loaded yet.  If this is the first attempt to set this
-		 * breakpoint then create a pending breakpoint that will attempt to hook itself
-		 * later if it is detected that the document load may have completed.
-		 */
-		if (!isRetry && hr == E_INVALIDARG) {
-			CComObject<PendingBreakpoint>* pendingBreakpoint = NULL;
-			HRESULT hr = CComObject<PendingBreakpoint>::CreateInstance(&pendingBreakpoint);
-			if (FAILED(hr)) {
-				Logger::error("CrossfireContext.setLineBreakpoint(): CreateInstance(CLSID_PendingBreakpoint) failed [1]", hr);
-				return false;
-			}
-
-			pendingBreakpoint->AddRef(); /* CComObject::CreateInstance gives initial ref count of 0 */
-			if (pendingBreakpoint->init(breakpoint, document, this)) {
-				m_pendingBreakpoints->push_back(pendingBreakpoint);
-			} else {
-				pendingBreakpoint->Release();
-			}
-		} else {
-			Logger::error("CrossfireContext.setLineBreakpoint(): GetPositionOfLine() failed [1]", hr);
-		}
-		return false;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = documentText->GetContextOfPosition(characterPosition, 1, &documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setLineBreakpoint(): GetContextOfPosition() failed", hr);
-		return false;
-	}
-
-	CComPtr<IEnumDebugCodeContexts> codeContexts = NULL;
-	hr = documentContext->EnumCodeContexts(&codeContexts);
-	if (FAILED(hr)) {
-		/*
-		 * In this context E_INVALIDARG failures are often caused by the target document
-		 * not being adequately loaded yet.  If this is the first attempt to set this
-		 * breakpoint then create a pending breakpoint that will attempt to hook itself
-		 * later if it is detected that the document load may have completed.
-		 */
-		if (!isRetry && hr == E_INVALIDARG) {
-			CComObject<PendingBreakpoint>* pendingBreakpoint = NULL;
-			HRESULT hr = CComObject<PendingBreakpoint>::CreateInstance(&pendingBreakpoint);
-			if (FAILED(hr)) {
-				Logger::error("CrossfireContext.setLineBreakpoint(): CreateInstance(CLSID_PendingBreakpoint) failed [2]", hr);
-				return false;
-			}
-
-			pendingBreakpoint->AddRef(); /* CComObject::CreateInstance gives initial ref count of 0 */
-			if (pendingBreakpoint->init(breakpoint, document, this)) {
-				m_pendingBreakpoints->push_back(pendingBreakpoint);
-			} else {
-				pendingBreakpoint->Release();
-			}
-		} else {
-			Logger::error("CrossfireContext.setLineBreakpoint(): EnumCodeContexts() failed", hr);
-		}
-		return false;
-	}
-
-	ULONG fetched = 0;
-	CComPtr<IDebugCodeContext> codeContext = NULL;
-	hr = codeContexts->Next(1, &codeContext, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.setLineBreakpoint(): Next() failed", hr);
-		return false;
-	}
-
-	hr = codeContext->SetBreakPoint(breakpoint->isEnabled() ? BREAKPOINT_ENABLED : BREAKPOINT_DISABLED);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setLineBreakpoint(): SetBreakPoint() failed", hr);
-		return false;
-	}
-
-	/* Determine the line number the breakpoint was set on (it may not match the requested line number) */
-
-	CComPtr<IDebugDocumentContext> bpDocumentContext = NULL;
-	hr = codeContext->GetDocumentContext(&bpDocumentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setLineBreakpoint(): GetDocumentContext() failed", hr);
-		return false;
-	}
-
-	characterPosition = 0;
-	ULONG numChars = 0;
-	hr = documentText->GetPositionOfContext(bpDocumentContext, &characterPosition, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setLineBreakpoint(): GetPositionOfContext() failed", hr);
-		return false;
-	}
-
-	ULONG bpLineNumber = 0;
-	ULONG offset = 0;
-	hr = documentText->GetLineOfPosition(characterPosition, &bpLineNumber, &offset);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setLineBreakpoint(): GetLineOfPosition() failed", hr);
-		return false;
-	}
-
-	breakpoint->setLine(bpLineNumber + 1);
-	breakpoint->setContextId(&std::wstring(getName()));
-	CrossfireLineBreakpoint* copy = NULL;
-	breakpoint->clone((CrossfireBreakpoint**)&copy);
-	m_breakpoints->insert(std::pair<unsigned int, CrossfireBreakpoint*>(breakpoint->getHandle(), copy));
-	return true;
-}
-
-void CrossfireContext::setName(wchar_t* value) {
-	if (m_name) {
-		free(m_name);
-	}
-	m_name = _wcsdup(value);
-}
-
-void CrossfireContext::setRunning(bool value) {
-	m_running = value;
-}
-
-bool CrossfireContext::unhookDebugger() {
-	if (!m_debuggerHooked) {
-		return true;
-	}
-
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	if (!getDebugApplication(&application)) {
-		return false;
-	}
-	HRESULT hr = application->DisconnectDebugger();
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.unhookDebugger(): DisconnectDebugger() failed", hr);
-	}
-	return SUCCEEDED(hr);
-}
-
-/* commands */
-
-bool CrossfireContext::commandBacktrace(Value* arguments, Value** _responseBody) {
-	unsigned int fromFrame = 0;
-	Value* value_fromFrame = arguments->getObjectValue(KEY_FROMFRAME);
-	if (value_fromFrame) {
-		if (value_fromFrame->getType() != TYPE_NUMBER || (unsigned int)value_fromFrame->getNumberValue() < 0) {
-			Logger::error("'backtrace' command has an invalid 'fromFrame' value");
-			return false;
-		}
-		fromFrame = (unsigned int)value_fromFrame->getNumberValue();
-	}
-
-	Value framesArray;
-	framesArray.setType(TYPE_ARRAY);
-	int index = 0;
-	for (index = fromFrame; ; index++) {
-		arguments->setObjectValue(KEY_NUMBER, &Value((double)index));
-		Value* frame = NULL;
-		if (!commandFrame(arguments, &frame)) {
-			index--; /* decrement since this attempt was not successful */
-			break;
-		}
-		framesArray.addArrayValue(frame);
-		delete frame;
-	}
-
-	int totalFrames = index - fromFrame + 1;
-	if (totalFrames == 0) {
-		*_responseBody = new Value();
-		(*_responseBody)->setType(TYPE_OBJECT);
-		return false;
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_CONTEXTID, &Value(m_name));
-	result->addObjectValue(KEY_FRAMES, &framesArray);
-	result->addObjectValue(KEY_FROMFRAME, &Value((double)fromFrame));
-	result->addObjectValue(KEY_TOFRAME, &Value((double)index));
-	result->addObjectValue(KEY_TOTALFRAMES, &Value((double)totalFrames));
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireContext::commandContinue(Value* arguments, Value** _responseBody) {
-	BREAKRESUMEACTION action;
-	Value* value_action = NULL;
-	if (arguments) {
-		value_action = arguments->getObjectValue(KEY_STEPACTION);
-	}
-	if (!value_action) {
-		action = BREAKRESUMEACTION_CONTINUE;
-	} else {
-		if (value_action->getType() != TYPE_STRING) {
-			Logger::error("'continue' command has invalid 'stepaction' value");
-			return false;
-		}
-		std::wstring* actionString = value_action->getStringValue();
-		if (actionString->compare(VALUE_IN) == 0) {
-			action = BREAKRESUMEACTION_STEP_INTO;
-		} else if (actionString->compare(VALUE_NEXT) == 0) {
-			action = BREAKRESUMEACTION_STEP_OVER;
-		} else if (actionString->compare(VALUE_OUT) == 0) {
-			action = BREAKRESUMEACTION_STEP_OUT;
-		} else {
-			Logger::error("'continue' command has invalid 'stepaction' value");
-			return false;
-		}
-	}
-
-	CComPtr<IRemoteDebugApplicationThread> applicationThread = NULL;
-	if (!getDebugApplicationThread(&applicationThread)) {
-		return false;
-	}
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	HRESULT hr = applicationThread->GetApplication(&application);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandContinue(): GetApplication() failed", hr);
-		return false;
-	}
-
-	hr = application->ResumeFromBreakPoint(applicationThread, action, ERRORRESUMEACTION_SkipErrorStatement);
-	if (SUCCEEDED(hr)) {
-		*_responseBody = new Value();
-		(*_responseBody)->setType(TYPE_OBJECT);
-		m_running = true;
-	} else {
-		Logger::error("CrossfireContext.commandContinue(): ResumeFromBreakPoint() failed", hr);
-	}
-	return SUCCEEDED(hr);
-}
-
-bool CrossfireContext::commandEvaluate(Value* arguments, unsigned int requestSeq, Value** _responseBody) {
-	unsigned int frame = 0;
-	Value* value_frame = arguments->getObjectValue(KEY_FRAME);
-	if (value_frame) {
-		if (value_frame->getType() != TYPE_NUMBER || (unsigned int)value_frame->getNumberValue() < 0) {
-			Logger::error("'evaluate' command has invalid 'frame' value");
-			return false;
-		}
-		frame = (unsigned int)value_frame->getNumberValue();
-	}
-
-	Value* value_expression = arguments->getObjectValue(KEY_EXPRESSION);
-	if (!value_expression || value_expression->getType() != TYPE_STRING) {
-		Logger::error("'evaluate' command does not have a valid 'expression' value");
-		return false;
-	}
-
-	CComPtr<IRemoteDebugApplicationThread> applicationThread = NULL;
-	if (!getDebugApplicationThread(&applicationThread)) {
-		return false;
-	}
-
-	CComPtr<IEnumDebugStackFrames> stackFrames = NULL;
-	HRESULT hr = applicationThread->EnumStackFrames(&stackFrames);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandEvaluate(): EnumStackFrames() failed", hr);
-		return false;
-	}
-
-	if (frame > 0) {
-		hr = stackFrames->Skip(frame);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.commandEvaluate(): Skip() failed", hr);
-			return false;
-		}
-	}
-
-	ULONG fetched = 0;
-	DebugStackFrameDescriptor stackFrameDescriptor;
-	hr = stackFrames->Next(1, &stackFrameDescriptor, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.commandEvaluate(): Next() failed", hr);
-		return false;
-	}
-
-	IDebugStackFrame* stackFrame = stackFrameDescriptor.pdsf;
-	CComPtr<IDebugExpressionContext> expressionContext = NULL;
-	hr = stackFrame->QueryInterface(IID_IDebugExpressionContext, (void**)&expressionContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandEvaluate(): QI(IDebugExpressionContext) failed", hr);
-		return false;
-	}
-
-	IDebugExpression* expression = NULL;
-	hr = expressionContext->ParseLanguageText(
-		value_expression->getStringValue()->c_str(),
-		10,
-		OLESTR(""),
-		DEBUG_TEXT_ISEXPRESSION | DEBUG_TEXT_RETURNVALUE | DEBUG_TEXT_ALLOWBREAKPOINTS | DEBUG_TEXT_ALLOWERRORREPORT,
-		&expression);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandEvaluate(): ParseLanguageText failed", hr);
-		return false;
-	}
-
-	JSEvalCallback* callback = NULL;
-	hr = CoCreateInstance(CLSID_JSEvalCallback, NULL, CLSCTX_INPROC_SERVER, IID_IJSEvalCallback, (LPVOID*)&callback);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandEvaluate(): CoCreateInstance(CLSID_JSEvalCallback) failed", hr);
-		return false;
-	}
-
-	// TODO finish this, note that "expression" and "callback" need to be released by someone)
-	/*
-	CrossfireResponse response;
-	response.setCommand(COMMAND_EVALUATE);
-	response.setRequestSeq(requestSeq);
-	response.setRunning(true); // TODO better way to determine this?
-	response.setSuccess(true);
-	//callback->init(&response, crossfire, expression);
-
-	hr = expression->Start(static_cast<IDebugExpressionCallBack*>(callback));
-	if (FAILED(hr)) {
-		Logger::error("'evaluate' Start() failed", hr);
-		callback->Release();
-		return false;
-	}
-	*/
-	return true;
-}
-
-bool CrossfireContext::commandFrame(Value* arguments, Value** _responseBody) {
-	Value* value_includeScopes = arguments->getObjectValue(KEY_INCLUDESCOPES);
-	if (!value_includeScopes || value_includeScopes->getType() != TYPE_BOOLEAN) {
-		Logger::error("'frame' command does not have a valid 'includeScopes' value");
-		return false;
-	}
-	bool includeScopes = value_includeScopes->getBooleanValue();
-
-	unsigned int index = 0;
-	Value* value_number = arguments->getObjectValue(KEY_NUMBER);
-	if (value_number) {
-		if (value_number->getType() != TYPE_NUMBER || (unsigned int)value_number->getNumberValue() < 0) {
-			Logger::error("'frame' command has an invalid 'number' value");
-			return false;
-		}
-		index = (unsigned int)value_number->getNumberValue();
-	}
-
-	CComPtr<IRemoteDebugApplicationThread> applicationThread = NULL;
-	if (!getDebugApplicationThread(&applicationThread)) {
-		return false;
-	}
-
-	CComPtr<IEnumDebugStackFrames> stackFrames = NULL;
-	HRESULT hr = applicationThread->EnumStackFrames(&stackFrames);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): EnumStackFrames() failed", hr);
-		return false;
-	}
-
-	if (index > 0) {
-		hr = stackFrames->Skip(index);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.commandFrame(): Skip() failed", hr);
-			return false;
-		}
-	}
-
-	ULONG fetched = 0;
-	DebugStackFrameDescriptor stackFrameDescriptor;
-	hr = stackFrames->Next(1, &stackFrameDescriptor, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.commandFrame(): Next() failed", hr);
-		return false;
-	}
-
-	IDebugStackFrame* stackFrame = stackFrameDescriptor.pdsf;
-	CComBSTR description = NULL;
-	hr = stackFrame->GetDescriptionString(true, &description);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): GetDescriptionString() failed", hr);
-		return false;
-	}
-
-	/* determine the current line number */
-
-	CComPtr<IDebugCodeContext> codeContext = NULL;
-	hr = stackFrame->GetCodeContext(&codeContext);
-	if (FAILED(hr)) {
-		/* fails if the current position is not within a user document, which is valid */
-		return false;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = codeContext->GetDocumentContext(&documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): GetDocumentContext() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	hr = documentContext->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComBSTR url = NULL;
-	hr = document->GetName(DOCUMENTNAMETYPE_URL, &url);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): GetName() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText, (void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG position, numChars;
-	hr = documentText->GetPositionOfContext(documentContext, &position, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): GetPositionOfContext() failed", hr);
-		return false;
-	}
-
-	ULONG lineNumber, column;
-	hr = documentText->GetLineOfPosition(position, &lineNumber, &column);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): GetLineOfPosition() failed", hr);
-		return false;
-	}
-
-	/* get the locals */
-
-	CComPtr<IDebugProperty> debugProperty = NULL;
-	hr = stackFrame->GetDebugProperty(&debugProperty);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): GetDebugProperty() failed", hr);
-		return false;
-	}
-
-	// TODO this frameObject is currently created temporarily, but to
-	// get the full benefit of handle reuse it should be stored and
-	// reused for cases where the frame command is invoked on the same
-	// frame multiple times
-	JSObject frameObject;
-	frameObject.debugProperty = debugProperty;
-	frameObject.isFunction = false;
-	frameObject.name = NULL;
-	frameObject.objects = NULL;
-	frameObject.parentHandle = 0;
-	frameObject.stackFrame = stackFrame;
-	Value* locals = NULL;
-	if (!createValueForObject(&frameObject, &locals)) {
-		return false;
-	}
-
-	/* get "this" */
-
-	CComPtr<IDebugExpressionContext> expressionContext = NULL;
-	hr = stackFrame->QueryInterface(IID_IDebugExpressionContext, (void**)&expressionContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): QI(IDebugExpressionContext) failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugExpression> expression = NULL;
-	hr = expressionContext->ParseLanguageText(
-		OLESTR("this"),
-		10,
-		L"",
-		DEBUG_TEXT_RETURNVALUE,
-		&expression);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): ParseLanguageText failed [2]", hr);
-		return false;
-	}
-
-	hr = expression->Start(NULL);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): Start failed", hr);
-		return false;
-	}
-Logger::error("Evaluating this");
-	while (expression->QueryIsComplete() == S_FALSE) {
-Logger::error("zzz");
-		::Sleep(10);
-	}
-Logger::error("Get result for this");
-	HRESULT evalResult;
-	CComPtr<IDebugProperty> debugProperty2 = NULL;
-	hr = expression->GetResultAsDebugProperty(&evalResult, &debugProperty2);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): GetResultAsDebugProperty failed", hr);
-		return false;
-	}
-	if (FAILED(evalResult)) {
-		Logger::error("CrossfireContext.commandFrame(): evaluation of GetResultAsDebugProperty failed", evalResult);
-		return false;
-	}
-
-	// TODO this thisObject is currently created temporarily, but to
-	// get the full benefit of handle reuse it should be stored and
-	// reused for cases where the frame command is invoked on the same
-	// frame multiple times
-	JSObject thisObject;
-	thisObject.debugProperty = debugProperty2;
-	thisObject.isFunction = false;
-	thisObject.name = NULL;
-	thisObject.objects = NULL;
-	thisObject.parentHandle = 0;
-	thisObject.stackFrame = stackFrame;
-
-	Value* value_this = NULL;
-	if (createValueForObject(&thisObject, &value_this)) {
-		locals->addObjectValue(KEY_THIS, value_this);
-		delete value_this;
-	} else {
-		/* create an empty "this" value */
-		Value value_thisChildren;
-		value_thisChildren.setType(TYPE_OBJECT);
-		Value value_this2;
-		value_this2.addObjectValue(KEY_TYPE, &Value(VALUE_OBJECT));
-		value_this2.addObjectValue(KEY_VALUE, &value_thisChildren);
-		locals->addObjectValue(KEY_THIS, &value_this2);
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_CONTEXTID, &Value(m_name));
-	result->addObjectValue(KEY_FUNC, &Value(description));
-	result->addObjectValue(KEY_INDEX, &Value((double)index));
-	result->addObjectValue(KEY_LINE, &Value((double)lineNumber + 1));
-	result->addObjectValue(KEY_LOCALS, locals);
-	result->addObjectValue(KEY_SCRIPT, &Value(url));
-	delete locals;
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireContext::commandLookup(Value* arguments, Value** _responseBody) {
-	Value* value_handle = arguments->getObjectValue(KEY_HANDLE);
-	if (!value_handle || value_handle->getType() != TYPE_NUMBER || (unsigned int)value_handle->getNumberValue() < 1) {
-		Logger::error("'lookup' command does not have a valid 'handle' value");
-		return false;
-	}
-
-	bool includeSource = false;
-	Value* value_includeSource = arguments->getObjectValue(KEY_INCLUDESOURCE);
-	if (value_includeSource) {
-		if (value_includeSource->getType() != TYPE_BOOLEAN) {
-			Logger::error("'lookup' command has an invalid 'includeSource' value");
-			return false;
-		}
-		includeSource = value_includeSource->getBooleanValue();
-	}
-
-	unsigned int handle = (unsigned int)value_handle->getNumberValue();
-
-	std::map<unsigned int, JSObject*>::iterator iterator = m_objects->find(handle);
-	if (iterator == m_objects->end()) {
-		Logger::error("'lookup' handle value is not a known object handle");
-		return false;
-	}
-	JSObject* object = iterator->second;
-
-	Value* result = NULL;
-	if (!createValueForObject(object, &result)) {
-		return false;
-	}
-
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireContext::createValueForObject(JSObject* object, Value** _value) {
-	*_value = NULL;
-	IDebugProperty* debugProperty = object->debugProperty;
-
-	CComPtr<IEnumDebugPropertyInfo> enumPropertyInfo = NULL;
-	HRESULT hr = debugProperty->EnumMembers(
-		/*DBGPROP_INFO_NAME | DBGPROP_INFO_TYPE | DBGPROP_INFO_VALUE | DBGPROP_INFO_DEBUGPROP*/ 0x3F,
-		10,
-		IID_IDebugPropertyEnumType_LocalsPlusArgs,
-		&enumPropertyInfo);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForObject(): EnumMembers() failed", hr);
-		return false;
-	}
-
-	/* The IDebugExpressionContext will be needed for each encountered object/function */
-	CComPtr<IDebugExpressionContext> expressionContext = NULL;
-	hr = object->stackFrame->QueryInterface(IID_IDebugExpressionContext, (void**)&expressionContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForObject(): QI(IDebugExpressionContext) failed", hr);
-		return false;
-	}
-
-	Value membersCollection;
-	membersCollection.setType(TYPE_OBJECT);
-
-	std::map<wchar_t*, unsigned int>* newObjectsTable = NULL;
-	ULONG fetched;
-	do {
-		DebugPropertyInfo propertyInfo;
-		HRESULT hr = enumPropertyInfo->Next(1, &propertyInfo, &fetched);
-		if (SUCCEEDED(hr) && fetched) {
-			BSTR type = propertyInfo.m_bstrType;
-			Value local;
-			if (wcscmp(type, JSVALUE_NULL) == 0) {
-				local.setType(TYPE_NULL);
-			} else if (wcscmp(type, JSVALUE_UNDEFINED) == 0) {
-				local.setValue(VALUE_UNDEFINED);
-			} else {
-				BSTR stringValue = propertyInfo.m_bstrValue;
-				if (wcscmp(type, JSVALUE_NUMBER) == 0) {
-					wchar_t* endPtr = 0;
-					double value = wcstod(stringValue, &endPtr);
-					local.addObjectValue(KEY_TYPE, &Value(VALUE_NUMBER));
-					local.addObjectValue(KEY_VALUE, &Value(value));
-				} else if (wcscmp(type, JSVALUE_BOOLEAN) == 0) {
-					local.addObjectValue(KEY_TYPE, &Value(VALUE_BOOLEAN));
-					if (wcscmp(stringValue, JSVALUE_TRUE) == 0) {
-						local.addObjectValue(KEY_VALUE, &Value(true));
-					} else {
-						local.addObjectValue(KEY_VALUE, &Value(false));
-					}
-				} else if (wcscmp(type, JSVALUE_STRING) == 0) {
-					std::wstring string(stringValue);
-					string = string.substr(1, string.length() - 2);
-					local.addObjectValue(KEY_TYPE, &Value(VALUE_STRING));
-					local.addObjectValue(KEY_VALUE, &Value(&string));
-				} else {
-					bool isFunction = (propertyInfo.m_dwAttrib & /*DBGPROP_ATTRIB_VALUE_IS_EXPANDABLE*/ 0x10) == 0;
-					if (!newObjectsTable) {
-						newObjectsTable = new std::map<wchar_t*, unsigned int>;
-					}
-
-					wchar_t* name = propertyInfo.m_bstrName;
-					unsigned int handle = 0;
-					if (object->objects) {
-						std::map<wchar_t*, unsigned int>::iterator iterator = object->objects->find(name);
-						if (iterator != object->objects->end()) {
-							std::map<unsigned int, JSObject*>::iterator iterator2 = m_objects->find(iterator->second);
-							if (iterator2 != m_objects->end()) {
-								JSObject* existingObject = iterator2->second;
-								if (existingObject->isFunction == isFunction) {
-									handle = iterator2->first;
-								}
-							}
-						}
-					}
-					if (!handle) {
-						JSObject* newObject = new JSObject();
-						IDebugProperty* objectProperty = propertyInfo.m_pDebugProp;
-						objectProperty->AddRef();
-						newObject->debugProperty = objectProperty;
-						newObject->isFunction = isFunction;
-						newObject->name = _wcsdup(name);
-						newObject->objects = NULL;
-						newObject->parentHandle = 0;
-						newObject->stackFrame = object->stackFrame;
-						newObject->stackFrame->AddRef();
-						handle = m_nextObjectHandle++;
-						m_objects->insert(std::pair<unsigned int, JSObject*>(handle, newObject));
-					}
-					newObjectsTable->insert(std::pair<wchar_t*, unsigned int>(name, handle));
-					local.setObjectValue(KEY_TYPE, isFunction ? &Value(VALUE_FUNCTION) : &Value(VALUE_OBJECT));
-					local.addObjectValue(KEY_HANDLE, &Value((double)handle));
-				}
-			}
-			membersCollection.addObjectValue(propertyInfo.m_bstrName, &local);
-		}
-	} while (fetched);
-
-	if (object->objects) {
-		std::map<wchar_t*, unsigned int>::iterator iterator = object->objects->begin();
-		while (iterator != object->objects->end()) {
-			delete iterator->first;
-			iterator++;
-		}
-		delete object->objects;
-	}
-	object->objects = newObjectsTable;
-
-	Value* result = new Value();
-	result->setObjectValue(KEY_TYPE, object->isFunction ? &Value(VALUE_FUNCTION) : &Value(VALUE_OBJECT));
-	result->setObjectValue(KEY_VALUE, &membersCollection);
-	*_value = result;
-	return true;
-}
-
-bool CrossfireContext::commandScope(Value* arguments, Value** _responseBody) {
-	return false;
-}
-
-bool CrossfireContext::commandScopes(Value* arguments, Value** _responseBody) {
-	return false;
-}
-
-bool CrossfireContext::commandScript(Value* arguments, Value** _responseBody) {
-	Value* value_url = arguments->getObjectValue(KEY_URL);
-	if (!value_url || value_url->getType() != TYPE_STRING) {
-		Logger::error("'script' command does not have a valid 'url' value");
-		return false;
-	}
-	std::wstring* url = value_url->getStringValue();
-
-	Value* value_includeSource = arguments->getObjectValue(KEY_INCLUDESOURCE);
-	if (!value_includeSource || value_includeSource->getType() != TYPE_BOOLEAN) {
-		Logger::error("'script' command does not have a valid 'includeSource' value");
-		return false;
-	}
-	bool includeSource = value_includeSource->getBooleanValue();
-
-	CComPtr<IDebugApplicationNode> node = NULL;
-	if (!findNode((wchar_t*)url->c_str(), NULL, &node)) {
-		Logger::error("'script' command specified an unknown script url");
-		return false;
-	}
-
-	Value* script = NULL;
-	if (!createValueForScript(node, includeSource, &script)) {
-		return false;
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_CONTEXTID, &Value(m_name));
-	result->addObjectValue(KEY_SCRIPT, script);
-	*_responseBody = result;
-	delete script;
-	return true;
-}
-
-bool CrossfireContext::createValueForScript(IDebugApplicationNode* node, bool includeSource, Value** _value) {
-	*_value = NULL;
-
-	CComBSTR url = L"NULL";
-	HRESULT hr = node->GetName(DOCUMENTNAMETYPE_URL, &url);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): GetName() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	hr = node->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText,(void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG numLines = 0;
-	ULONG numChars = 0;
-	hr = documentText->GetSize(&numLines, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): GetSize() failed", hr);
-		return false;
-	}
-
-	ULONG line1start = 0;
-	hr = documentText->GetPositionOfLine(1, &line1start);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): GetPositionOfLine() failed [2]", hr);
-		return false;
-	}
-
-	wchar_t* line0chars = new wchar_t[line1start + 1];
-	ULONG charsRead = 0;
-	hr = documentText->GetText(0, line0chars, NULL, &charsRead, line1start);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): GetText() failed", hr);
-		return false;
-	}
-	line0chars[line1start] = NULL;
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_ID, &Value(url));
-	result->addObjectValue(KEY_LINEOFFSET, &Value((double)0)); // TODO right?
-	result->addObjectValue(KEY_COLUMNOFFSET, &Value((double)0)); // TODO right?
-	result->addObjectValue(KEY_SOURCESTART, &Value(line0chars));
-	result->addObjectValue(KEY_SOURCELENGTH, &Value((double)numLines)); // TODO wrong
-	result->addObjectValue(KEY_LINECOUNT, &Value((double)numLines));
-	result->addObjectValue(KEY_COMPILATIONTYPE, &Value(VALUE_TOPLEVEL)); // TODO right?
-	delete[] line0chars;
-
-	if (includeSource) {
-		wchar_t* sourceChars = new wchar_t[numChars + 1];
-		charsRead = 0;
-		hr = documentText->GetText(0, sourceChars, NULL, &charsRead, numChars);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.createValueForScript(): GetText()[2] failed", hr);
-			return false;
-		}
-		sourceChars[numChars] = NULL;
-		result->addObjectValue(KEY_SOURCE, &Value(sourceChars));
-		delete[] sourceChars;
-	}
-
-	*_value = result;
-	return true;
-}
-
-bool CrossfireContext::commandScripts(Value* arguments, Value** _responseBody) {
-	Value* value_includeSource = arguments->getObjectValue(KEY_INCLUDESOURCE);
-	if (!value_includeSource || value_includeSource->getType() != TYPE_BOOLEAN) {
-		Logger::error("'scripts' command does not have a valid 'includeSource' value");
-		return false;
-	}
-	bool includeSource = value_includeSource->getBooleanValue();
-
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	if (!getDebugApplication(&application)) {
-		return false;
-	}
-
-	CComPtr<IDebugApplicationNode> rootNode = NULL;
-	HRESULT hr = application->GetRootNode(&rootNode);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandScripts(): GetRootNode() failed", hr);
-		return false;
-	}
-
-	Value scripts;
-	scripts.setType(TYPE_ARRAY);
-	addScriptsToArray(rootNode, includeSource, &scripts);
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_CONTEXTID, &Value(m_name));
-	result->addObjectValue(KEY_SCRIPTS, &scripts);
-	*_responseBody = result;
-	return true;
-}
-
-void CrossfireContext::addScriptsToArray(IDebugApplicationNode* node, bool includeSource, Value* scriptsArray) {
-	Value* value_script = NULL;
-	if (createValueForScript(node, includeSource, &value_script)) {
-		Value script;
-		script.addObjectValue(KEY_SCRIPT, value_script);
-		scriptsArray->addArrayValue(&script);
-		delete value_script;
-	}
-
-	CComPtr<IEnumDebugApplicationNodes> nodes = NULL;
-	HRESULT hr = node->EnumChildren(&nodes);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.addScriptsToArray(): EnumChildren() failed", hr);
-		return;
-	}
-
-	ULONG fetched = 0;
-	do {
-		CComPtr<IDebugApplicationNode> current = NULL;
-		hr = nodes->Next(1, &current, &fetched);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.addScriptsToArray(): Next() failed", hr);
-		} else {
-			if (fetched) {
-				addScriptsToArray(current, includeSource, scriptsArray);
-			}
-		}
-	} while (fetched);
-}
-
-bool CrossfireContext::commandSource(Value* arguments, Value** _responseBody) {
-	arguments->setObjectValue(KEY_INCLUDESOURCE, &Value(true));
-	return commandScripts(arguments, _responseBody);
-}
-
-bool CrossfireContext::commandSuspend(Value* arguments, Value** _responseBody) {
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	if (!getDebugApplication(&application)) {
-		return false;
-	}
-
-	HRESULT hr = application->CauseBreak();
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandSuspend(): CauseBreak() failed", hr);
-		return false;
-	}
-
-	*_responseBody = new Value();
-	(*_responseBody)->setType(TYPE_OBJECT);
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.h
deleted file mode 100644
index 54fdf51..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "activdbg.h"
-#include <vector>
-
-#include "CrossfireEvent.h"
-#include "CrossfireRequest.h"
-#include "CrossfireResponse.h"
-#include "JSEvalCallback.h"
-#include "IECrossfireServer.h"
-#include "IBreakpointTarget.h"
-#include "Value.h"
-#include "Logger.h"
-
-class CrossfireContext; // forward declaration
-#include "PendingBreakpoint.h"
-#include "CrossfireServer.h"
-#include "IEDebugger.h"
-
-class CrossfireContext : IBreakpointTarget {
-
-public:
-	CrossfireContext(DWORD threadId, CrossfireServer* server);
-	~CrossfireContext();
-
-	virtual bool createValueForScript(IDebugApplicationNode* node, bool includeSource, Value** _value);
-	virtual bool findNode(wchar_t* name, IDebugApplicationNode* startNode, IDebugApplicationNode** _value);
-	virtual wchar_t* getHref();
-	virtual wchar_t* getName();
-	virtual void installBreakpoints(std::vector<Value*>* breakpoints);
-	virtual bool performRequest(CrossfireRequest* request);
-	virtual bool scriptLoaded(std::wstring* url, IDebugApplicationNode *applicationNode, bool isRetry);
-	virtual void sendEvent(CrossfireEvent* eventObj);
-	virtual void setHref(wchar_t* value);
-	virtual void setName(wchar_t* value);
-	virtual void setRunning(bool value);
-
-	/* IBreakpointTarget methods */
-	virtual bool clearBreakpoint(unsigned int handle);
-	virtual bool getBreakpoint(unsigned int handle, CrossfireBreakpoint** _value);
-	virtual bool getBreakpoints(CrossfireBreakpoint*** ___values);
-	virtual bool setBreakpointCondition(unsigned int handle, std::wstring* condition);
-	virtual bool setBreakpointEnabled(unsigned int handle, bool enabled);
-	virtual bool setLineBreakpoint(CrossfireLineBreakpoint* breakpoint, bool isRetry);
-
-private:
-	struct JSObject {
-		IDebugProperty* debugProperty;
-		IDebugStackFrame* stackFrame;
-		bool isFunction;
-		wchar_t* name;
-		std::map<wchar_t*, unsigned int>* objects;
-		unsigned int parentHandle;
-	};
-
-	virtual bool createValueForObject(JSObject* object, Value** _value);
-
-	virtual bool getDebugApplication(IRemoteDebugApplication** _value);
-	virtual bool getDebugApplicationThread(IRemoteDebugApplicationThread** _value);
-	virtual bool hookDebugger();
-	virtual bool unhookDebugger();
-
-	std::map<unsigned int, CrossfireBreakpoint*>* m_breakpoints;
-	DWORD m_cpcApplicationNodeEvents;
-	IDebugApplicationNode* m_currentScriptNode;
-	unsigned int m_nextObjectHandle;
-	CrossfireServer* m_server;
-	IRemoteDebugApplicationThread* m_debugApplicationThread;
-	IIEDebugger* m_debugger;
-	bool m_debuggerHooked;
-	wchar_t* m_href;
-	wchar_t* m_name;
-	std::map<unsigned int, JSObject*>* m_objects;
-	std::vector<PendingBreakpoint*>* m_pendingBreakpoints;
-	bool m_running;
-	DWORD m_threadId;
-
-	/* command: backtrace */
-	static const wchar_t* COMMAND_BACKTRACE;
-	static const wchar_t* KEY_FRAMES;
-	static const wchar_t* KEY_FROMFRAME;
-	static const wchar_t* KEY_TOFRAME;
-	static const wchar_t* KEY_TOTALFRAMES;
-	virtual bool commandBacktrace(Value* arguments, Value** _responseBody);
-
-	/* command: continue */
-	static const wchar_t* COMMAND_CONTINUE;
-	virtual bool commandContinue(Value* arguments, Value** _responseBody);
-
-	/* command: evaluate */
-	static const wchar_t* COMMAND_EVALUATE;
-	static const wchar_t* KEY_EXPRESSION;
-	static const wchar_t* KEY_FRAME;
-	virtual bool commandEvaluate(Value* arguments, unsigned int requestSeq, Value** _responseBody);
-
-	/* command: frame */
-	static const wchar_t* COMMAND_FRAME;
-	static const wchar_t* JSVALUE_BOOLEAN;
-	static const wchar_t* JSVALUE_FUNCTION;
-	static const wchar_t* JSVALUE_NUMBER;
-	static const wchar_t* JSVALUE_NULL;
-	static const wchar_t* JSVALUE_STRING;
-	static const wchar_t* JSVALUE_TRUE;
-	static const wchar_t* JSVALUE_UNDEFINED;
-	static const wchar_t* KEY_FUNC;
-	static const wchar_t* KEY_INCLUDESCOPES;
-	static const wchar_t* KEY_INDEX;
-	static const wchar_t* KEY_LOCALS;
-	static const wchar_t* KEY_NUMBER;
-	static const wchar_t* KEY_THIS;
-	static const wchar_t* KEY_VALUE;
-	static const wchar_t* VALUE_BOOLEAN;
-	static const wchar_t* VALUE_FUNCTION;
-	static const wchar_t* VALUE_NUMBER;
-	static const wchar_t* VALUE_OBJECT;
-	static const wchar_t* VALUE_STRING;
-	static const wchar_t* VALUE_UNDEFINED;
-	virtual bool commandFrame(Value* arguments, Value** _responseBody);
-
-	/* command: inspect */
-	static const wchar_t* COMMAND_INSPECT;
-
-	/* command: lookup */
-	static const wchar_t* COMMAND_LOOKUP;
-	virtual bool commandLookup(Value* arguments, Value** _responseBody);
-
-	/* command: scope */
-	static const wchar_t* COMMAND_SCOPE;
-	virtual bool commandScope(Value* arguments, Value** _responseBody);
-
-	/* command: scopes */
-	static const wchar_t* COMMAND_SCOPES;
-	virtual bool commandScopes(Value* arguments, Value** _responseBody);
-
-	/* command: script */
-	static const wchar_t* COMMAND_SCRIPT;
-	virtual bool commandScript(Value* arguments, Value** _responseBody);
-//	virtual bool createValueForScript(IDebugApplicationNode* node, bool includeSource, Value** _value);
-
-	/* command: scripts */
-	static const wchar_t* COMMAND_SCRIPTS;
-	static const wchar_t* KEY_COMPILATIONTYPE;
-	static const wchar_t* KEY_COLUMNOFFSET;
-	static const wchar_t* KEY_ID;
-	static const wchar_t* KEY_LINECOUNT;
-	static const wchar_t* KEY_LINEOFFSET;
-	static const wchar_t* KEY_SCRIPT;
-	static const wchar_t* KEY_SCRIPTS;
-	static const wchar_t* KEY_SOURCE;
-	static const wchar_t* KEY_SOURCESTART;
-	static const wchar_t* KEY_SOURCELENGTH;
-	static const wchar_t* VALUE_TOPLEVEL;
-	virtual bool commandScripts(Value* arguments, Value** _responseBody);
-	virtual void addScriptsToArray(IDebugApplicationNode* node, bool includeSource, Value* arrayValue);
-
-	/* command: source */
-	static const wchar_t* COMMAND_SOURCE;
-	virtual bool commandSource(Value* arguments, Value** _responseBody);
-
-	/* command: suspend */
-	static const wchar_t* COMMAND_SUSPEND;
-	static const wchar_t* KEY_STEPACTION;
-	static const wchar_t* VALUE_IN;
-	static const wchar_t* VALUE_NEXT;
-	static const wchar_t* VALUE_OUT;
-	virtual bool commandSuspend(Value* arguments, Value** _responseBody);
-
-	/* event: onScript */
-	static const wchar_t* EVENT_ONSCRIPT;
-
-	/* shared */
-	static const wchar_t* KEY_BREAKPOINT;
-	static const wchar_t* KEY_CONTEXTID;
-	static const wchar_t* KEY_HANDLE;
-	static const wchar_t* KEY_INCLUDESOURCE;
-	static const wchar_t* KEY_LINE;
-	static const wchar_t* KEY_TYPE;
-	static const wchar_t* KEY_URL;
-
-	/* breakpoint objects */
-	static const wchar_t* BPTYPE_LINE;
-	static const wchar_t* KEY_LOCATION;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.cpp
deleted file mode 100644
index 60c9054..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireEvent.h"
-
-CrossfireEvent::CrossfireEvent() : CrossfirePacket() {
-	m_contextId = NULL;
-	m_data = NULL;
-	m_name = NULL;
-}
-
-CrossfireEvent::~CrossfireEvent() {
-	if (m_contextId) {
-		delete m_contextId;
-	}
-	if (m_data) {
-		delete m_data;
-	}
-	if (m_name) {
-		free(m_name);
-	}
-}
-
-void CrossfireEvent::clone(CrossfirePacket** _value) {
-	CrossfireEvent* result = new CrossfireEvent();
-	result->setContextId(m_contextId);
-	result->setData(m_data);
-	result->setName(m_name);
-	*_value = result;
-}
-
-std::wstring* CrossfireEvent::getContextId() {
-	return m_contextId;
-}
-
-Value* CrossfireEvent::getData() {
-	return m_data;
-}
-
-wchar_t* CrossfireEvent::getName() {
-	return m_name;
-}
-
-int CrossfireEvent::getType() {
-	return TYPE_EVENT;
-}
-
-void CrossfireEvent::setContextId(std::wstring* value) {
-	if (m_contextId) {
-		delete m_contextId;
-		m_contextId = NULL;
-	}
-	if (value) {
-		m_contextId = new std::wstring;
-		m_contextId->assign(*value);
-	}
-}
-
-bool CrossfireEvent::setData(Value* value) {
-	if (value && value->getType() != TYPE_OBJECT) {
-		return false;
-	}
-	if (m_data) {
-		delete m_data;
-		m_data = NULL;
-	}
-	if (value) {
-		value->clone(&m_data);
-	}
-	return true;
-}
-
-void CrossfireEvent::setName(const wchar_t* value) {
-	if (m_name) {
-		free(m_name);
-		m_name = NULL;
-	}
-	if (value) {
-		m_name = _wcsdup(value);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.h
deleted file mode 100644
index f0875c6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "CrossfirePacket.h"
-#include "Value.h"
-
-class CrossfireEvent : public CrossfirePacket {
-
-public:
-	CrossfireEvent();
-	~CrossfireEvent();
-	virtual void clone(CrossfirePacket** _value);
-	virtual std::wstring* getContextId();
-	virtual Value* getData();
-	virtual wchar_t* getName();
-	virtual int getType();
-	virtual void setContextId(std::wstring* value);
-	virtual bool setData(Value* value);
-	virtual void setName(const wchar_t* value);
-
-private:
-	std::wstring* m_contextId;
-	Value* m_data;
-	wchar_t* m_name;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.cpp
deleted file mode 100644
index 7840b80..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireLineBreakpoint.h"
-
-/* initialize statics */
-const wchar_t* CrossfireLineBreakpoint::BPTYPESTRING_LINE = L"line";
-const wchar_t* CrossfireLineBreakpoint::KEY_LINE = L"line";
-const wchar_t* CrossfireLineBreakpoint::KEY_URL = L"url";
-
-CrossfireLineBreakpoint::CrossfireLineBreakpoint() : CrossfireBreakpoint() {
-	m_line = -1;
-	m_url = NULL;
-}
-
-CrossfireLineBreakpoint::CrossfireLineBreakpoint(unsigned int handle) : CrossfireBreakpoint(handle) {
-	m_line = -1;
-	m_url = NULL;
-}
-
-CrossfireLineBreakpoint::~CrossfireLineBreakpoint() {
-	if (m_url) {
-		delete m_url;
-	}
-}
-
-bool CrossfireLineBreakpoint::CanHandleBPType(wchar_t* type) {
-	return wcscmp(type, BPTYPESTRING_LINE) == 0;
-}
-
-bool CrossfireLineBreakpoint::appliesToUrl(std::wstring* url) {
-	return m_url->compare(*url) == 0;
-}
-
-void CrossfireLineBreakpoint::clone(CrossfireBreakpoint** _value) {
-	CrossfireLineBreakpoint* result = new CrossfireLineBreakpoint(getHandle());
-	result->setCondition((std::wstring*)getCondition());
-	result->setContextId((std::wstring*)getContextId());
-	result->setEnabled(isEnabled());
-	result->setLine(getLine());
-	result->setUrl((std::wstring*)getUrl());
-	*_value = result;
-}
-
-unsigned int CrossfireLineBreakpoint::getLine() {
-	return m_line;
-}
-
-bool CrossfireLineBreakpoint::getLocationAsValue(Value** _value) {
-	if (!m_url || m_line < 0) {
-		return false;
-	}
-	Value* result = new Value();
-	result->setObjectValue(KEY_URL, &Value(m_url));
-	result->setObjectValue(KEY_LINE, &Value((double)m_line));
-	*_value = result;
-	return true;
-}
-
-int CrossfireLineBreakpoint::getType() {
-	return BPTYPE_LINE;
-}
-
-const wchar_t* CrossfireLineBreakpoint::getTypeString() {
-	return BPTYPESTRING_LINE;
-}
-
-const std::wstring* CrossfireLineBreakpoint::getUrl() {
-	return m_url;
-}
-
-void CrossfireLineBreakpoint::setLine(unsigned int value) {
-	m_line = value;
-}
-
-bool CrossfireLineBreakpoint::setLocationFromValue(Value* value) {
-	Value* value_url = value->getObjectValue(KEY_URL);
-	if (!value_url || value_url->getType() != TYPE_STRING) {
-		Logger::error("breakpoint 'location' argument does not have a valid 'url' value");
-		return false;
-	}
-
-	Value* value_line = value->getObjectValue(KEY_LINE);
-	if (!value_line || value_line->getType() != TYPE_NUMBER) {
-		Logger::error("breakpoint 'location' argument does not have a valid 'line' value");
-		return false;
-	}
-
-	setLine((unsigned int)value_line->getNumberValue());
-	setUrl(value_url->getStringValue());
-	return true;
-}
-
-bool CrossfireLineBreakpoint::setUrl(std::wstring* value) {
-	if (!value) {
-		return false;
-	}
-	if (!m_url) {
-		m_url = new std::wstring;
-	}
-	m_url->assign(*value);
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.h
deleted file mode 100644
index 253284d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "CrossfireBreakpoint.h"
-#include "Value.h"
-
-class CrossfireLineBreakpoint : public CrossfireBreakpoint {
-
-public:
-	CrossfireLineBreakpoint();
-	virtual ~CrossfireLineBreakpoint();
-	virtual bool appliesToUrl(std::wstring* url);
-	virtual void clone(CrossfireBreakpoint** _value);
-	virtual unsigned int getLine();
-	virtual int getType();
-	virtual const wchar_t* getTypeString();
-	virtual const std::wstring* getUrl();
-	virtual void setLine(unsigned int value);
-	virtual bool setLocationFromValue(Value* value);
-	virtual bool setUrl(std::wstring* value);
-
-	static bool CanHandleBPType(wchar_t* type);
-
-protected:
-	CrossfireLineBreakpoint(unsigned int handle);
-	virtual bool getLocationAsValue(Value** _value);
-
-private:
-	unsigned int m_line;
-	std::wstring* m_url;
-
-	static const wchar_t* BPTYPESTRING_LINE;
-	static const wchar_t* KEY_LINE;
-	static const wchar_t* KEY_URL;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.cpp
deleted file mode 100644
index b84427b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfirePacket.h"
-
-CrossfirePacket::CrossfirePacket() {
-	m_seq = -1;
-}
-
-CrossfirePacket::~CrossfirePacket() {
-}
-
-unsigned int CrossfirePacket::getSeq() {
-	return m_seq;
-}
-
-void CrossfirePacket::setSeq(unsigned int value) {
-	m_seq = value;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.h
deleted file mode 100644
index 14e4692..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-class CrossfirePacket {
-
-public:
-	CrossfirePacket();
-	~CrossfirePacket();
-	virtual void clone(CrossfirePacket** _value) = 0;
-	virtual unsigned int getSeq();
-	virtual int getType() = 0;
-	virtual void setSeq(unsigned int);
-
-	enum {
-		TYPE_REQUEST,
-		TYPE_RESPONSE,
-		TYPE_EVENT
-	};
-
-private:
-	unsigned int m_seq;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.cpp
deleted file mode 100644
index 22c6f52..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireProcessor.h"
-
-/* initialize statics */
-const wchar_t* CrossfireProcessor::HEADER_CONTENTLENGTH = L"Content-Length:";
-const wchar_t* CrossfireProcessor::LINEBREAK = L"\r\n";
-const size_t CrossfireProcessor::LINEBREAK_LENGTH = 2;
-const wchar_t* CrossfireProcessor::NAME_ARGUMENTS = L"arguments";
-const wchar_t* CrossfireProcessor::NAME_BODY = L"body";
-const wchar_t* CrossfireProcessor::NAME_COMMAND = L"command";
-const wchar_t* CrossfireProcessor::NAME_CONTEXTID = L"context_id";
-const wchar_t* CrossfireProcessor::NAME_DATA = L"data";
-const wchar_t* CrossfireProcessor::NAME_EVENT = L"event";
-const wchar_t* CrossfireProcessor::NAME_REQUESTSEQ = L"request_seq";
-const wchar_t* CrossfireProcessor::NAME_RUNNING = L"running";
-const wchar_t* CrossfireProcessor::NAME_SEQ = L"seq";
-const wchar_t* CrossfireProcessor::NAME_SUCCESS = L"success";
-const wchar_t* CrossfireProcessor::NAME_TYPE = L"type";
-const wchar_t* CrossfireProcessor::VALUE_EVENT = L"event";
-const wchar_t* CrossfireProcessor::VALUE_REQUEST = L"request";
-const wchar_t* CrossfireProcessor::VALUE_RESPONSE = L"response";
-
-CrossfireProcessor::CrossfireProcessor() {
-	m_jsonParser = new JSONParser();
-	m_nextEventSeq = 0;
-}
-
-CrossfireProcessor::~CrossfireProcessor() {
-	delete m_jsonParser;
-}
-
-bool CrossfireProcessor::createEventPacket(CrossfireEvent* eventObj, std::wstring** _value) {
-	*_value = NULL;
-	Value value_packet;
-
-	/* packet type */
-	value_packet.addObjectValue(NAME_TYPE, &Value(VALUE_EVENT));
-
-	/* event type */
-	if (!eventObj->getName()) {
-		Logger::error("CrossfireProcessor.createEventPacket(): event does not have a name");
-		return false;
-	}
-	value_packet.addObjectValue(NAME_EVENT, &Value(eventObj->getName()));
-
-	/* context id */
-	if (eventObj->getContextId()) {
-		value_packet.addObjectValue(NAME_CONTEXTID, &Value(eventObj->getContextId()));
-	}
-
-	/* data */
-	Value* dataValue = eventObj->getData();
-	if (dataValue) {
-		if (dataValue->getType() != TYPE_OBJECT) {
-			Logger::error("CrossfireProcessor.createEventPacket(): event has data object of wrong type");
-			return false;
-		}
-		value_packet.addObjectValue(NAME_DATA, dataValue);
-	}
-
-	/* seq */
-	value_packet.setObjectValue(NAME_SEQ, &Value((double)m_nextEventSeq++));
-
-	std::wstring* content = NULL;
-	m_jsonParser->stringify(&value_packet, &content);
-	wchar_t length[9];
-	_ltow_s((unsigned int)content->length() + LINEBREAK_LENGTH, length, 9, 10); /* trailing linebreak */
-	std::wstring* eventString = new std::wstring;
-	eventString->append(HEADER_CONTENTLENGTH);
-	eventString->append(length);
-	eventString->append(LINEBREAK);
-	eventString->append(LINEBREAK);
-	eventString->append(*content);
-	eventString->append(LINEBREAK);
-	delete content;
-
-	*_value = eventString;
-	return true;
-}
-
-bool CrossfireProcessor::createResponsePacket(CrossfireResponse *response, std::wstring **_value) {
-	static unsigned int s_nextResponseSeq = 0;
-	*_value = NULL;
-	Value value_packet;
-
-	/* packet type */
-	value_packet.addObjectValue(NAME_TYPE, &Value(VALUE_RESPONSE));
-
-	/* command */
-	if (!response->getName()) {
-		Logger::error("CrossfireProcessor.createResponsePacket(): response does not have a name");
-		return false;
-	}
-	value_packet.addObjectValue(NAME_COMMAND, &Value(response->getName()));
-
-	/* request seq */
-	if (response->getRequestSeq() < 0) {
-		Logger::error("CrossfireProcessor.createResponsePacket(): response does not have a request seq value");
-		return false;
-	}
-	value_packet.addObjectValue(NAME_REQUESTSEQ, &Value((double)response->getRequestSeq()));
-
-	/* running */
-	value_packet.addObjectValue(NAME_RUNNING, &Value(response->getRunning()));
-
-	/* success */
-	value_packet.addObjectValue(NAME_SUCCESS, &Value(response->getSuccess()));
-
-	/* body */
-	Value* bodyValue = response->getBody();
-	if (!bodyValue || bodyValue->getType() != TYPE_OBJECT) {
-		Logger::error("CrossfireProcessor.createResponsePacket(): response does not have a body value of type object");
-		return false;
-	}
-	value_packet.addObjectValue(NAME_BODY, bodyValue);
-
-	/* seq */
-	value_packet.setObjectValue(NAME_SEQ, &Value((double)s_nextResponseSeq++));
-	std::wstring* content = NULL;
-	m_jsonParser->stringify(&value_packet, &content);
-	wchar_t length[9];
-	_ltow_s((unsigned int)content->length() + LINEBREAK_LENGTH, length, 9, 10); /* trailing linebreak */
-	std::wstring* responseString = new std::wstring;
-	responseString->append(HEADER_CONTENTLENGTH);
-	responseString->append(length);
-	responseString->append(LINEBREAK);
-	responseString->append(LINEBREAK);
-	responseString->append(*content);
-	responseString->append(LINEBREAK);
-	delete content;
-
-	*_value = responseString;
-	return true;
-}
-
-bool CrossfireProcessor::parseRequestPacket(std::wstring* msg, CrossfireRequest** _value) {
-	*_value = NULL;
-
-	size_t startIndex = msg->find(L"\r\n\r\n") + 2 * LINEBREAK_LENGTH; /* header linebreak */
-	size_t msgLength = msg->length();
-
-	if (msg->at(msgLength - 2) != wchar_t('\r')) {
-		Logger::error("Request packet does not contain terminating '\\r'");
-		return false;
-	}
-	if (msg->at(msgLength - 1) != wchar_t('\n')) {
-		Logger::error("Request packet does not contain terminating '\\n'");
-		return false;
-	}
-
-	std::wstring content = msg->substr(startIndex, msgLength - startIndex - LINEBREAK_LENGTH); /* trailing linebreak */
-
-	Value* value_request = NULL;
-	m_jsonParser->parse(&content, &value_request);
-	if (!value_request) {
-		Logger::error("Failure occurred while parsing Request packet content");
-		return false;
-	}
-
-	Value* value_type = value_request->getObjectValue(NAME_TYPE);
-	if (!value_type || value_type->getType() != TYPE_STRING || value_type->getStringValue()->compare(VALUE_REQUEST) != 0) {
-		Logger::error("Request packet does not contain a 'type' value of \"request\"");
-		delete value_request;
-		return false;
-	}
-
-	Value* value_seq = value_request->getObjectValue(NAME_SEQ);
-	if (!value_seq || value_seq->getType() != TYPE_NUMBER || value_seq->getNumberValue() < 0) {
-		Logger::error("Request packet does not contain a 'seq' Number value >= 0");
-		delete value_request;
-		return false;
-	}
-
-	Value* value_command = value_request->getObjectValue(NAME_COMMAND);
-	if (!value_command || value_command->getType() != TYPE_STRING) {
-		Logger::error("Request packet does not contain a String 'command' value");
-		delete value_request;
-		return false;
-	}
-
-	Value* value_contextId = value_request->getObjectValue(NAME_CONTEXTID);
-	if (value_contextId && value_contextId->getType() != TYPE_STRING) {
-		Logger::error("Request packet contains a non-string 'context_id' value");
-		delete value_request;
-		return false;
-	}
-
-	Value* value_arguments = value_request->getObjectValue(NAME_ARGUMENTS);
-	if (value_arguments && value_arguments->getType() != TYPE_OBJECT) {
-		Logger::error("Request packet contains a non-object 'arguments' value");
-		delete value_request;
-		return false;
-	}
-
-	CrossfireRequest* result = new CrossfireRequest();
-	result->setName((wchar_t*)value_command->getStringValue()->c_str());
-	result->setSeq((unsigned int)value_seq->getNumberValue());
-	if (value_contextId) {
-		result->setContextId(value_contextId->getStringValue());
-	}
-	if (value_arguments) {
-		result->setArguments(value_arguments);
-	}
-
-	*_value = result;
-	delete value_request;
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.h
deleted file mode 100644
index 0528d9e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <queue>
-
-#include "CrossfireEvent.h"
-#include "CrossfireRequest.h"
-#include "CrossfireResponse.h"
-#include "JSONParser.h"
-#include "Value.h"
-#include "Logger.h"
-
-class CrossfireProcessor {
-
-public:
-	CrossfireProcessor();
-	~CrossfireProcessor();
-	virtual bool createEventPacket(CrossfireEvent* eventObj, std::wstring** _value);
-	virtual bool createResponsePacket(CrossfireResponse* response, std::wstring** _value);
-	virtual bool parseRequestPacket(std::wstring* msg, CrossfireRequest** _value);
-
-private:
-	JSONParser* m_jsonParser;
-	unsigned int m_nextEventSeq;
-
-	/* constants */
-	static const wchar_t* HEADER_CONTENTLENGTH;
-	static const wchar_t* LINEBREAK;
-	static const size_t LINEBREAK_LENGTH;
-	static const wchar_t* NAME_ARGUMENTS;
-	static const wchar_t* NAME_BODY;
-	static const wchar_t* NAME_COMMAND;
-	static const wchar_t* NAME_CONTEXTID;
-	static const wchar_t* NAME_DATA;
-	static const wchar_t* NAME_EVENT;
-	static const wchar_t* NAME_REQUESTSEQ;
-	static const wchar_t* NAME_RUNNING;
-	static const wchar_t* NAME_SEQ;
-	static const wchar_t* NAME_SUCCESS;
-	static const wchar_t* NAME_TYPE;
-	static const wchar_t* VALUE_EVENT;
-	static const wchar_t* VALUE_REQUEST;
-	static const wchar_t* VALUE_RESPONSE;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.cpp
deleted file mode 100644
index 9656379..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireRequest.h"
-
-CrossfireRequest::CrossfireRequest() : CrossfirePacket() {
-	m_arguments = NULL;
-	m_contextId = NULL;
-	m_name = NULL;
-}
-
-CrossfireRequest::~CrossfireRequest() {
-	if (m_arguments) {
-		delete m_arguments;
-	}
-	if (m_contextId) {
-		delete m_contextId;
-	}
-	if (m_name) {
-		free(m_name);
-	}
-}
-
-void CrossfireRequest::clone(CrossfirePacket** _value) {
-	CrossfireRequest* result = new CrossfireRequest();
-	result->setArguments(m_arguments);
-	result->setContextId(m_contextId);
-	result->setName(m_name);
-	*_value = result;
-}
-
-Value* CrossfireRequest::getArguments() {
-	return m_arguments;
-}
-
-std::wstring* CrossfireRequest::getContextId() {
-	return m_contextId;
-}
-
-wchar_t* CrossfireRequest::getName() {
-	return m_name;
-}
-
-int CrossfireRequest::getType() {
-	return TYPE_REQUEST;
-}
-
-bool CrossfireRequest::setArguments(Value* value) {
-	if (value && value->getType() != TYPE_OBJECT) {
-		return false;
-	}
-	if (m_arguments) {
-		delete m_arguments;
-		m_arguments = NULL;
-	}
-	if (value) {
-		value->clone(&m_arguments);
-	}
-	return true;
-}
-
-void CrossfireRequest::setName(const wchar_t* value) {
-	if (m_name) {
-		free(m_name);
-		m_name = NULL;
-	}
-	if (value) {
-		m_name = _wcsdup(value);
-	}
-}
-
-void CrossfireRequest::setContextId(std::wstring* value) {
-	if (m_contextId) {
-		delete m_contextId;
-		m_contextId = NULL;
-	}
-	if (value) {
-		m_contextId = new std::wstring;
-		m_contextId->assign(*value);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.h
deleted file mode 100644
index 3ef2644..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "CrossfirePacket.h"
-#include "Value.h"
-
-class CrossfireRequest : public CrossfirePacket {
-
-public:
-	CrossfireRequest();
-	~CrossfireRequest();
-	virtual void clone(CrossfirePacket** _value);
-	virtual Value* getArguments();
-	virtual std::wstring* getContextId();
-	virtual wchar_t* getName();
-	virtual int getType();
-	virtual bool setArguments(Value* value);
-	virtual void setContextId(std::wstring* value);
-	virtual void setName(const wchar_t* value);
-
-private:
-	Value* m_arguments;
-	std::wstring* m_contextId;
-	wchar_t* m_name;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.cpp
deleted file mode 100644
index 7626f52..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireResponse.h"
-
-CrossfireResponse::CrossfireResponse() : CrossfirePacket() {
-	m_body = NULL;
-	m_name = NULL;
-	m_requestSeq = -1;
-	m_running = false;
-	m_success = false;
-}
-
-CrossfireResponse::~CrossfireResponse() {
-	if (m_body) {
-		delete m_body;
-	}
-	if (m_name) {
-		free(m_name);
-	}
-}
-
-void CrossfireResponse::clone(CrossfirePacket** _value) {
-	CrossfireResponse* result = new CrossfireResponse();
-	result->setBody(m_body);
-	result->setName(m_name);
-	result->setRequestSeq(m_requestSeq);
-	result->setRunning(m_running);
-	result->setSuccess(m_success);
-	*_value = result;
-}
-
-Value* CrossfireResponse::getBody() {
-	return m_body;
-}
-
-wchar_t* CrossfireResponse::getName() {
-	return m_name;
-}
-
-unsigned int CrossfireResponse::getRequestSeq() {
-	return m_requestSeq;
-}
-
-bool CrossfireResponse::getRunning() {
-	return m_running;
-}
-
-bool CrossfireResponse::getSuccess() {
-	return m_success;
-}
-
-int CrossfireResponse::getType() {
-	return TYPE_RESPONSE;
-}
-
-bool CrossfireResponse::setBody(Value* value) {
-	if (value && value->getType() != TYPE_OBJECT) {
-		return false;
-	}
-	if (value) {
-		value->clone(&m_body);
-	}
-	return true;
-}
-
-void CrossfireResponse::setName(const wchar_t* value) {
-	if (m_name) {
-		free(m_name);
-		m_name = NULL;
-	}
-	if (value) {
-		m_name = _wcsdup(value);
-	}
-}
-
-void CrossfireResponse::setRequestSeq(unsigned int value) {
-	m_requestSeq = value;
-}
-
-void CrossfireResponse::setRunning(bool value) {
-	m_running = value;
-}
-
-void CrossfireResponse::setSuccess(bool value) {
-	m_success = value;
-}
-
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.h
deleted file mode 100644
index cd50b92..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "CrossfirePacket.h"
-#include "Value.h"
-
-class CrossfireResponse : public CrossfirePacket {
-
-public:
-	CrossfireResponse();
-	~CrossfireResponse();
-	virtual void clone(CrossfirePacket** _value);
-	virtual Value* getBody();
-	virtual wchar_t* getName();
-	virtual unsigned int getRequestSeq();
-	virtual bool getRunning();
-	virtual bool getSuccess();
-	virtual int getType();
-	virtual bool setBody(Value* value);
-	virtual void setName(const wchar_t* value);
-	virtual void setRequestSeq(unsigned int value);
-	virtual void setRunning(bool value);
-	virtual void setSuccess(bool value);
-
-private:
-	Value* m_body;
-	wchar_t* m_name;
-	unsigned int m_requestSeq;
-	bool m_running;
-	bool m_success;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.cpp
deleted file mode 100644
index 3bee93a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.cpp
+++ /dev/null
@@ -1,562 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireServer.h"
-
-/* initialize statics */
-const wchar_t* CrossfireServer::CONTEXTID_PREAMBLE = L"xfIE::";
-const wchar_t* CrossfireServer::HANDSHAKE = L"CrossfireHandshake\r\n";
-const wchar_t* CrossfireServer::HEADER_CONTENTLENGTH = L"Content-Length:";
-const wchar_t* CrossfireServer::LINEBREAK = L"\r\n";
-const size_t CrossfireServer::LINEBREAK_LENGTH = 2;
-
-const wchar_t* CrossfireServer::COMMAND_CHANGEBREAKPOINT = L"changebreakpoint";
-const wchar_t* CrossfireServer::COMMAND_CLEARBREAKPOINT = L"clearbreakpoint";
-const wchar_t* CrossfireServer::COMMAND_GETBREAKPOINT = L"getbreakpoint";
-const wchar_t* CrossfireServer::COMMAND_GETBREAKPOINTS = L"getbreakpoints";
-const wchar_t* CrossfireServer::COMMAND_SETBREAKPOINT = L"setbreakpoint";
-
-/* command: listContexts */
-const wchar_t* CrossfireServer::COMMAND_LISTCONTEXTS = L"listcontexts";
-const wchar_t* CrossfireServer::KEY_CONTEXTS = L"contexts";
-const wchar_t* CrossfireServer::KEY_CURRENT = L"current";
-
-/* command: version */
-const wchar_t* CrossfireServer::COMMAND_VERSION = L"version";
-const wchar_t* CrossfireServer::KEY_VERSION = L"version";
-const wchar_t* CrossfireServer::VERSION_STRING = L"0.3";
-
-/* event: closed */
-const wchar_t* CrossfireServer::EVENT_CLOSED = L"closed";
-
-/* event: onContextChanged */
-const wchar_t* CrossfireServer::EVENT_CONTEXTCHANGED = L"onContextChanged";
-const wchar_t* CrossfireServer::KEY_NEWHREF = L"new-href";
-
-/* event: onContextCreated */
-const wchar_t* CrossfireServer::EVENT_CONTEXTCREATED = L"onContextCreated";
-
-/* event: onContextDestroyed */
-const wchar_t* CrossfireServer::EVENT_CONTEXTDESTROYED = L"onContextDestroyed";
-
-/* event: onContextLoaded */
-const wchar_t* CrossfireServer::EVENT_CONTEXTLOADED = L"onContextLoaded";
-
-/* shared */
-const wchar_t* CrossfireServer::KEY_HREF = L"href";
-
-
-CrossfireServer::CrossfireServer() {
-	m_bpManager = new CrossfireBPManager();
-	m_connection = NULL;
-	m_contexts = new std::map<DWORD, CrossfireContext*>;
-	m_currentContext = NULL;
-	m_handshakeReceived = false;
-	m_inProgressPacket = new std::wstring;
-	m_lastRequestSeq = -1;
-	m_pendingEvents = new std::vector<CrossfireEvent*>;
-	m_port = -1;
-	m_processingRequest = false;
-	m_processor = new CrossfireProcessor();
-	m_windowHandle = 0;
-}
-
-CrossfireServer::~CrossfireServer() {
-	delete m_bpManager;
-
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		delete iterator->second;
-		iterator++;
-	}
-	delete m_contexts;
-
-	std::vector<CrossfireEvent*>::iterator iterator2 = m_pendingEvents->begin();
-	while (iterator2 != m_pendingEvents->end()) {
-		if (m_connection) {
-			sendEvent(*iterator2);
-		}
-		delete *iterator2;
-		iterator2++;
-	}
-	delete m_pendingEvents;
-
-	delete m_inProgressPacket;
-	delete m_processor;
-	if (m_connection) {
-		delete m_connection;
-	}
-
-	if (m_windowHandle) {
-		CComPtr<ICrossfireServerClass> serverClass = NULL;
-		HRESULT hr = CoGetClassObject(CLSID_CrossfireServer, CLSCTX_ALL, 0, IID_ICrossfireServerClass, (LPVOID*)&serverClass);
-		if (FAILED(hr)) {
-			Logger::error("~CrossfireServer: CoGetClassObject() failed", hr);
-			return;
-		}
-		hr = serverClass->RemoveServer(m_windowHandle);
-		if (FAILED(hr)) {
-			Logger::error("~CrossfireServer: RemoveServer() failed", hr);
-			return;
-		}
-	}
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::contextCreated(DWORD threadId, OLECHAR* href) {
-	if (m_port == -1) {
-		return S_FALSE;
-	}
-
-	HRESULT hr = registerContext(threadId, href);
-	if (SUCCEEDED(hr)) {
-		std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(threadId);
-		CrossfireContext* context = iterator->second;
-		eventContextCreated(context);
-	}
-	return hr;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::contextDestroyed(DWORD threadId) {
-	if (m_port == -1) {
-		return S_FALSE;
-	}
-
-	std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(threadId);
-	if (iterator == m_contexts->end()) {
-		Logger::error("CrossfireServer.contextDestroyed(): unknown context", threadId);
-		return S_FALSE;
-	}
-	CrossfireContext* context = iterator->second;
-	eventContextDestroyed(context);
-	m_contexts->erase(iterator);
-	delete context;
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::contextLoaded(DWORD threadId) {
-	if (m_port == -1) {
-		return S_FALSE;
-	}
-
-	std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(threadId);
-	if (iterator == m_contexts->end()) {
-		Logger::error("CrossfireServer.contextLoaded(): unknown context", threadId);
-		return S_FALSE;
-	}
-	CrossfireContext* context = iterator->second;
-	eventContextLoaded(context);
-	return S_OK;
-}
-
-void CrossfireServer::disconnected() {
-	reset();
-}
-
-CrossfireBPManager* CrossfireServer::getBreakpointManager() {
-	return m_bpManager;
-}
-
-CrossfireContext* CrossfireServer::getRequestContext(CrossfireRequest* request) {
-	std::wstring* contextId = request->getContextId();
-	if (!contextId) {
-		return NULL;
-	}
-
-	wchar_t* searchString = (wchar_t*)contextId->c_str();
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		if (wcscmp(iterator->second->getName(), searchString) == 0) {
-			return iterator->second;
-		}
-		iterator++;
-	}
-	return NULL;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::isActive(boolean* value) {
-	*value = m_port != -1;
-	return S_OK;
-}
-
-bool CrossfireServer::performRequest(CrossfireRequest* request) {
-	wchar_t* command = request->getName();
-	Value* arguments = request->getArguments();
-	Value* responseBody = NULL;
-	bool success = false;
-	if (wcscmp(command, COMMAND_VERSION) == 0) {
-		success = commandVersion(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_CHANGEBREAKPOINT) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		IBreakpointTarget* target = context ? (IBreakpointTarget*)context : (IBreakpointTarget*)m_bpManager;
-		success = m_bpManager->commandChangeBreakpoint(arguments, target, &responseBody);
-	} else if (wcscmp(command, COMMAND_CLEARBREAKPOINT) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		IBreakpointTarget* target = context ? (IBreakpointTarget*)context : (IBreakpointTarget*)m_bpManager;
-		success = m_bpManager->commandClearBreakpoint(arguments, target, &responseBody);
-	} else if (wcscmp(command, COMMAND_LISTCONTEXTS) == 0) {
-		success = commandListContexts(arguments, &responseBody);
-	} else if (wcscmp(command, COMMAND_GETBREAKPOINT) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		IBreakpointTarget* target = context ? (IBreakpointTarget*)context : (IBreakpointTarget*)m_bpManager;
-		success = m_bpManager->commandGetBreakpoint(arguments, target, &responseBody);
-	} else if (wcscmp(command, COMMAND_GETBREAKPOINTS) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		IBreakpointTarget* target = context ? (IBreakpointTarget*)context : (IBreakpointTarget*)m_bpManager;
-		success = m_bpManager->commandGetBreakpoints(arguments, target, &responseBody);
-	} else if (wcscmp(command, COMMAND_SETBREAKPOINT) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		IBreakpointTarget* target = context ? (IBreakpointTarget*)context : (IBreakpointTarget*)m_bpManager;
-		success = m_bpManager->commandSetBreakpoint(arguments, target, &responseBody);
-	} else {
-		return false;	/* command not handled */
-	}
-
-	CrossfireResponse response;
-	response.setName(command);
-	response.setRequestSeq(request->getSeq());
-	response.setRunning(true);
-	response.setSuccess(success);
-	if (success) {
-		response.setBody(responseBody);
-	} else {
-		Value emptyBody;
-		emptyBody.setType(TYPE_OBJECT);
-		response.setBody(&emptyBody);
-	}
-	if (responseBody) {
-		delete responseBody;
-	}
-	sendResponse(&response);
-	return true;
-}
-
-void CrossfireServer::received(wchar_t* msg) {
-	if (!m_handshakeReceived) {
-		if (wcscmp(msg, HANDSHAKE) == 0) {
-			m_handshakeReceived = true;
-			m_connection->send(HANDSHAKE);
-		} else {
-			Logger::error("Crossfire content received before handshake, not processing it");
-		}
-		return;
-	}
-
-	m_inProgressPacket->append(std::wstring(msg));
-	std::wstring packet;
-	do {
-		packet.clear();
-		if (m_inProgressPacket->find(HEADER_CONTENTLENGTH) != 0) {
-			Logger::error("request packet does not start with 'Content-Length:', not processing it");
-			Logger::log(m_inProgressPacket);
-			m_inProgressPacket->clear();
-			break;
-		}
-
-		size_t endIndex = m_inProgressPacket->find(wchar_t('\r'));
-		if (endIndex == std::wstring::npos) {
-			Logger::error("request packet does not contain '\r', not processing it");
-			Logger::log(m_inProgressPacket);
-			m_inProgressPacket->clear();
-			break;
-		}
-
-		size_t headerLength = wcslen(HEADER_CONTENTLENGTH);
-		std::wstring lengthString = m_inProgressPacket->substr(headerLength, endIndex - headerLength);
-		int lengthValue = _wtoi(lengthString.c_str());
-		if (!lengthValue) {
-			Logger::error("request packet does not have a valid 'Content-Length' value, not processing it");
-			Logger::log(m_inProgressPacket);
-			m_inProgressPacket->clear();
-			break;
-		}
-
-		if (m_inProgressPacket->find(L"\r\n", endIndex) != endIndex) {
-			Logger::error("request packet does not follow initial '\\r' with '\\n', not processing it");
-			Logger::log(m_inProgressPacket);
-			m_inProgressPacket->clear();
-			break;
-		}
-
-		// TODO for now just skip over "tool:" lines, though these should really be validated
-
-		size_t toolEnd = m_inProgressPacket->find(L"\r\n\r\n", endIndex);
-		if (toolEnd == std::wstring::npos) {
-			Logger::error("request packet does not contain '\\r\\n\\r\\n' to delimit its header, not processing it");
-			Logger::log(m_inProgressPacket);
-			m_inProgressPacket->clear();
-			break;
-		}
-		size_t toolsLength = toolEnd - endIndex;
-		size_t targetLength = wcslen(HEADER_CONTENTLENGTH) + lengthString.length() + 3 * LINEBREAK_LENGTH + toolsLength + lengthValue;
-
-		if (targetLength <= m_inProgressPacket->length()) {
-			packet.assign(m_inProgressPacket->substr(0, targetLength));
-			m_inProgressPacket->erase(0, targetLength);
-		}
-
-		if (packet.length()) {
-			CrossfireRequest* request = NULL;
-			if (!m_processor->parseRequestPacket(&packet, &request)) {
-				Logger::error("invalid request packet received, not processing it");
-				Logger::log(&packet);
-			} else {
-				unsigned int seq = request->getSeq();
-				if (seq <= m_lastRequestSeq) {
-					// TODO handle out-of-order packets
-					Logger::log("packet received out of sequence, still processing it");
-				}
-				m_lastRequestSeq = seq;
-				m_processingRequest = true;
-				if (!performRequest(request)) {
-					/*
-					 * the request's command was not handled by the server,
-					 * so try to delegate to the specified context, if any
-					 */
-					CrossfireContext* context = getRequestContext(request);
-					if (!context) {
-						Logger::error("request command was unknown to the server and a valid context id was not provided, not processing it");
-						Logger::log(&packet);
-					} else {
-						if (!context->performRequest(request)) {
-							Logger::error("request command was unknown to the server and to the specified context, not processing it");
-							Logger::log(&packet);
-						}
-					}
-				}
-				m_processingRequest = false;
-				delete request;
-
-				/*
-				 * Debugger events may have been received in response to the request that was
-				 * just processed.  These events can be sent now that processing of the request
-				 * is complete.
-				 */
-				if (m_pendingEvents->size() > 0) {
-// GWG HACK! helps JSDT with stepping
-Logger::error("start sleep");
-Sleep(500);
-Logger::error("end sleep");
-
-					std::vector<CrossfireEvent*>::iterator iterator = m_pendingEvents->begin();
-					while (iterator != m_pendingEvents->end()) {
-						sendEvent(*iterator);
-						delete *iterator;
-						iterator++;
-					}
-					m_pendingEvents->clear();
-				}
-			}
-		}
-	} while (packet.length() > 0 && m_inProgressPacket->length() > 0);
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::registerContext(DWORD threadId, OLECHAR* href) {
-	if (m_port == -1) {
-		return S_FALSE;
-	}
-
-	static int s_contextCounter = 0;
-
-	CrossfireContext* context = NULL;
-	std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(threadId);
-	if (iterator == m_contexts->end()) {
-		context = new CrossfireContext(threadId, this);
-		m_contexts->insert(std::pair<DWORD,CrossfireContext*>(threadId, context));
-	} else {
-		Logger::error("CrossfireServer.registerContext(): a context already exists for thread", threadId);
-		return S_FALSE;
-	}
-
-	std::wstringstream stream;
-	stream << CONTEXTID_PREAMBLE;
-	stream << threadId;
-	stream << "-";
-	stream << s_contextCounter++;
-	context->setName((wchar_t*)stream.str().c_str());
-	context->setHref(href);
-	return S_OK;
-}
-
-void CrossfireServer::reset() {
-	m_connection->close();
-	delete m_connection;
-	m_connection = NULL;
-
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		delete iterator->second;
-		iterator++;
-	}
-	m_contexts->clear();
-	m_currentContext = NULL;
-	m_handshakeReceived = false;
-	m_inProgressPacket->clear();
-	m_lastRequestSeq = -1;
-	m_port = -1;
-}
-
-void CrossfireServer::sendEvent(CrossfireEvent* eventObj) {
-	/*
-	 * If a request is being processed then events to be sent to
-	 * the client should be queued and sent after the response to
-	 * the request has been sent first.
-	 */
-	if (m_processingRequest) {
-		CrossfireEvent* copy = NULL;
-		eventObj->clone((CrossfirePacket**)&copy);
-		m_pendingEvents->push_back(copy);
-		return;
-	}
-
-	std::wstring* string = NULL;
-	if (!m_processor->createEventPacket(eventObj, &string)) {
-		Logger::error("CrossfireServer.sendEvent(): Invalid event packet, not sending it");
-		return;
-	}
-
-	m_connection->send(string->c_str());
-	delete string;
-}
-
-void CrossfireServer::sendResponse(CrossfireResponse* response) {
-	std::wstring* string = NULL;
-	if (!m_processor->createResponsePacket(response, &string)) {
-		Logger::error("CrossfireServer.sendResponse(): Invalid response packet, not sending it");
-		return;
-	}
-	m_connection->send(string->c_str());
-	delete string;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::setCurrentContext(DWORD threadId) {
-	if (m_port == -1) {
-		return S_FALSE;
-	}
-
-	std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(threadId);
-	if (iterator == m_contexts->end()) {
-		Logger::error("CrossfireServer.setCurrentContext(): unknown context", threadId);
-		return S_FALSE;
-	}
-	CrossfireContext* context = iterator->second;
-	CrossfireContext* oldContext = m_currentContext;
-	m_currentContext = context;
-	eventContextChanged(context, oldContext);
-	return S_OK;
-}
-
-void CrossfireServer::setWindowHandle(unsigned long value) {
-	m_windowHandle = value;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::start(unsigned int port) {
-	if (m_port != -1) {
-		return S_FALSE;
-	}
-
-	m_connection = new WindowsSocketConnection(this);
-	if (!m_connection->init(port)) {
-		delete m_connection;
-		return S_FALSE;
-	}
-	m_port = port;
-	m_connection->acceptConnection();
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::stop() {
-	if (m_port == -1) {
-		return S_FALSE;
-	}
-
-	eventClosed();
-	reset();
-	return S_OK;
-}
-
-/* commands */
-
-bool CrossfireServer::commandListContexts(Value* arguments, Value** _responseBody) {
-	Value contexts;
-	contexts.setType(TYPE_ARRAY);
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		CrossfireContext* context = iterator->second;
-		Value value_context;
-		value_context.addObjectValue(/*KEY_CONTEXTID*/L"context_id", &Value(context->getName()));
-		value_context.addObjectValue(KEY_HREF, &Value(context->getHref()));
-		value_context.addObjectValue(KEY_CURRENT, &Value((bool)(context == m_currentContext)));
-		contexts.addArrayValue(&value_context);
-		iterator++;
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_CONTEXTS, &contexts);
-	*_responseBody = result;
-	return true;
-}
-
-bool CrossfireServer::commandVersion(Value* arguments, Value** _responseBody) {
-	Value* result = new Value();
-	result->addObjectValue(KEY_VERSION, &Value(VERSION_STRING));
-	*_responseBody = result;
-	return true;
-}
-
-/* events */
-
-void CrossfireServer::eventClosed() {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CLOSED);
-	sendEvent(&eventObj);
-}
-
-void CrossfireServer::eventContextChanged(CrossfireContext* newContext, CrossfireContext* oldContext) {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CONTEXTCHANGED);
-	eventObj.setContextId(&std::wstring(newContext->getName()));
-	Value data;
-	data.addObjectValue(KEY_NEWHREF, &Value(&std::wstring(newContext->getHref())));
-	if (oldContext) {
-		data.addObjectValue(KEY_HREF, &Value(&std::wstring(oldContext->getHref())));
-	}
-	eventObj.setData(&data);
-	sendEvent(&eventObj);
-}
-
-void CrossfireServer::eventContextCreated(CrossfireContext* context) {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CONTEXTCREATED);
-	eventObj.setContextId(&std::wstring(context->getName()));
-	Value data;
-	data.addObjectValue(KEY_HREF, &Value(&std::wstring(context->getHref())));
-	eventObj.setData(&data);
-	sendEvent(&eventObj);
-}
-
-void CrossfireServer::eventContextDestroyed(CrossfireContext* context) {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CONTEXTDESTROYED);
-	eventObj.setContextId(&std::wstring(context->getName()));
-	sendEvent(&eventObj);
-}
-
-void CrossfireServer::eventContextLoaded(CrossfireContext* context) {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CONTEXTLOADED);
-	eventObj.setContextId(&std::wstring(context->getName()));
-	Value data;
-	data.addObjectValue(KEY_HREF, &Value(&std::wstring(context->getHref())));
-	eventObj.setData(&data);
-	sendEvent(&eventObj);
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.h
deleted file mode 100644
index 5df4d89..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include <map>
-
-#include "CrossfireBPManager.h"
-#include "CrossfireContext.h"
-#include "CrossfireEvent.h"
-#include "CrossfireProcessor.h"
-#include "CrossfireResponse.h"
-#include "WindowsSocketConnection.h"
-
-class ATL_NO_VTABLE CrossfireServer :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<CrossfireServer, &CLSID_CrossfireServer>,
-	public IDispatchImpl<ICrossfireServer, &IID_ICrossfireServer, &LIBID_IECrossfireServerLib, 1, 0> {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_CROSSFIRESERVER)
-	DECLARE_NOT_AGGREGATABLE(CrossfireServer)
-	BEGIN_COM_MAP(CrossfireServer)
-		COM_INTERFACE_ENTRY(ICrossfireServer)
-		COM_INTERFACE_ENTRY(IDispatch)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	CrossfireServer();
-	~CrossfireServer();
-
-	/* ICrossfireServer */
-	virtual HRESULT STDMETHODCALLTYPE contextCreated(DWORD threadId, OLECHAR* href);
-	virtual HRESULT STDMETHODCALLTYPE contextDestroyed(DWORD threadId);
-	virtual HRESULT STDMETHODCALLTYPE contextLoaded(DWORD threadId);
-	virtual HRESULT STDMETHODCALLTYPE isActive(boolean* value);
-	virtual HRESULT STDMETHODCALLTYPE registerContext(DWORD threadId, OLECHAR* href);
-	virtual HRESULT STDMETHODCALLTYPE setCurrentContext(DWORD threadId);
-	virtual HRESULT STDMETHODCALLTYPE start(unsigned int port);
-	virtual HRESULT STDMETHODCALLTYPE stop();
-
-	virtual void disconnected();
-	virtual CrossfireBPManager* getBreakpointManager();
-	virtual void received(wchar_t* msg);
-	virtual void sendEvent(CrossfireEvent* eventObj);
-	virtual void sendResponse(CrossfireResponse* response);
-	virtual void setWindowHandle(unsigned long value);
-
-private:
-	virtual CrossfireContext* getRequestContext(CrossfireRequest* request);
-	virtual bool performRequest(CrossfireRequest* request);
-	virtual void reset();
-
-	CrossfireBPManager* m_bpManager;
-	WindowsSocketConnection* m_connection;
-	std::map<DWORD, CrossfireContext*>* m_contexts;
-	CrossfireContext* m_currentContext;
-	bool m_handshakeReceived;
-	std::wstring* m_inProgressPacket;
-	unsigned int m_lastRequestSeq;
-	std::vector<CrossfireEvent*>* m_pendingEvents;
-	unsigned int m_port;
-	bool m_processingRequest;
-	CrossfireProcessor* m_processor;
-	unsigned long m_windowHandle;
-
-	static const wchar_t* COMMAND_CHANGEBREAKPOINT;
-	static const wchar_t* COMMAND_CLEARBREAKPOINT;
-	static const wchar_t* COMMAND_GETBREAKPOINT;
-	static const wchar_t* COMMAND_GETBREAKPOINTS;
-	static const wchar_t* COMMAND_SETBREAKPOINT;
-
-	/* command: listContexts */
-	static const wchar_t* COMMAND_LISTCONTEXTS;
-	static const wchar_t* KEY_CONTEXTS;
-	static const wchar_t* KEY_CURRENT;
-	virtual bool commandListContexts(Value* arguments, Value** _responseBody);
-
-	/* command: version */
-	static const wchar_t* COMMAND_VERSION;
-	static const wchar_t* KEY_VERSION;
-	static const wchar_t* VERSION_STRING;
-	virtual bool commandVersion(Value* arguments, Value** _responseBody);
-
-	/* event: closed */
-	static const wchar_t* EVENT_CLOSED;
-	virtual void eventClosed();
-
-	/* event: onContextChanged */
-	static const wchar_t* EVENT_CONTEXTCHANGED;
-	static const wchar_t* KEY_NEWHREF;
-	virtual void eventContextChanged(CrossfireContext* newContext, CrossfireContext* oldContext);
-
-	/* event: onContextCreated */
-	static const wchar_t* EVENT_CONTEXTCREATED;
-	virtual void eventContextCreated(CrossfireContext* context);
-
-	/* event: onContextDestroyed */
-	static const wchar_t* EVENT_CONTEXTDESTROYED;
-	virtual void eventContextDestroyed(CrossfireContext* context);
-
-	/* event: onContextLoaded */
-	static const wchar_t* EVENT_CONTEXTLOADED;
-	virtual void eventContextLoaded(CrossfireContext* context);
-
-	/* shared */
-	static const wchar_t* KEY_HREF;
-
-	/* constants */
-	static const wchar_t* CONTEXTID_PREAMBLE;
-	static const wchar_t* HANDSHAKE;
-	static const wchar_t* HEADER_CONTENTLENGTH;
-	static const wchar_t* LINEBREAK;
-	static const size_t LINEBREAK_LENGTH;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(CrossfireServer), CrossfireServer)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer1.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer1.rgs
deleted file mode 100644
index ad7493b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer1.rgs
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR
-{
-	IECrossfireServer.CrossfireContr.1 = s 'CrossfireServer Class'
-	{
-		CLSID = s '{47836AF4-3E0C-4995-8029-FF931C5A43FC}'
-	}
-	IECrossfireServer.CrossfireControl = s 'CrossfireServer Class'
-	{
-		CLSID = s '{47836AF4-3E0C-4995-8029-FF931C5A43FC}'
-		CurVer = s 'IECrossfireServer.CrossfireServer.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {47836AF4-3E0C-4995-8029-FF931C5A43FC} = s 'CrossfireServer Class'
-		{
-			ProgID = s 'IECrossfireServer.CrossfireServer.1'
-			VersionIndependentProgID = s 'IECrossfireServer.CrossfireServer'
-			ForceRemove 'Programmable'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.cpp
deleted file mode 100644
index ee5a795..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireServerClass.h"
-
-CrossfireServerClass::CrossfireServerClass() {
-	m_servers = new std::map<unsigned long, ICrossfireServer*>;
-	lockCount = 0;
-}
-
-CrossfireServerClass::~CrossfireServerClass() {
-	std::map<unsigned long, ICrossfireServer*>::iterator iterator = m_servers->begin();
-	while (iterator != m_servers->end()) {
-		iterator->second->Release();
-		iterator++;
-	}
-	delete m_servers;
-}
-
-HRESULT CrossfireServerClass::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject) {
-	/* ICrossfireServer instances must be created via GetServer() */
-	return E_NOTIMPL;
-}
-
-STDMETHODIMP CrossfireServerClass::GetServer(unsigned long windowHandle, ICrossfireServer** _value) {
-	*_value = NULL;
-
-	std::map<unsigned long,ICrossfireServer*>::iterator iterator = m_servers->find(windowHandle);
-	if (iterator != m_servers->end()) {
-		*_value = iterator->second;
-		(*_value)->AddRef();
-	} else {
-		CComObject<CrossfireServer>* server = NULL;
-		HRESULT hr = CComObject<CrossfireServer>::CreateInstance(&server);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireServerClass.GetServer(): CreateInstance() failed", hr);
-			return S_FALSE;
-		}
-
-		server->AddRef(); /* CComObject::CreateInstance gives initial ref count of 0 */
-		server->setWindowHandle(windowHandle);
-		m_servers->insert(std::pair<unsigned long,ICrossfireServer*>(windowHandle, server));
-		*_value = server;
-	}
-	return S_OK;
-}
-
-HRESULT CrossfireServerClass::LockServer(BOOL fLock) {
-	lockCount += fLock ? 1 : -1;
-	if (!lockCount && m_servers->empty()) {
-		PostQuitMessage(0);
-	}
-	return S_OK;
-}
-
-STDMETHODIMP CrossfireServerClass::RemoveServer(unsigned long windowHandle) {
-	std::map<unsigned long,ICrossfireServer*>::iterator iterator = m_servers->find(windowHandle);
-	if (iterator == m_servers->end()) {
-		Logger::error("CrossfireServerClass.RemoveServer(): unknown windowHandle");
-		return S_FALSE;
-	}
-	m_servers->erase(iterator);
-	if (!lockCount && m_servers->empty()) {
-		PostQuitMessage(0);
-	}
-	return S_OK;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.h
deleted file mode 100644
index 94d98a6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include <map>
-
-#include "CrossfireServer.h"
-#include "IECrossfireServer.h"
-#include "Logger.h"
-
-class ATL_NO_VTABLE CrossfireServerClass :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<CrossfireServerClass, &CLSID_CrossfireServerClass>,
-	public IClassFactory,
-	public IDispatchImpl<ICrossfireServerClass, &IID_ICrossfireServerClass, &LIBID_IECrossfireServerLib, 1, 0> {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_CROSSFIRESERVERCLASS)
-	DECLARE_NOT_AGGREGATABLE(CrossfireServerClass)
-	BEGIN_COM_MAP(CrossfireServerClass)
-		COM_INTERFACE_ENTRY(ICrossfireServerClass)
-		COM_INTERFACE_ENTRY(IClassFactory)
-		COM_INTERFACE_ENTRY(IDispatch)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	/* ICrossfireServerClass */
-	virtual HRESULT STDMETHODCALLTYPE GetServer(unsigned long windowHandle, ICrossfireServer** _value);
-	virtual HRESULT STDMETHODCALLTYPE RemoveServer(unsigned long windowHandle);
-
-	/* IClassFactory */
-	virtual HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject);
-	virtual HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock);
-
-protected:
-	CrossfireServerClass();
-	~CrossfireServerClass();
-
-	int lockCount;
-
-private:
-	std::map<unsigned long, ICrossfireServer*>* m_servers;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(CrossfireServerClass), CrossfireServerClass)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.rgs
deleted file mode 100644
index 2ea77a8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.rgs
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR
-{
-	IECrossfireServer.CrossfireContr.1 = s 'CrossfireServerClass Class'
-	{
-		CLSID = s '{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}'
-	}
-	IECrossfireServer.CrossfireControl = s 'CrossfireServerClass Class'
-	{
-		CLSID = s '{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}'
-		CurVer = s 'IECrossfireServer.CrossfireContr.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25} = s 'CrossfireServerClass Class'
-		{
-			ProgID = s 'IECrossfireServer.CrossfireServer.1'
-			VersionIndependentProgID = s 'IECrossfireServer.CrossfireServer'
-			ForceRemove 'Programmable'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IBreakpointTarget.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IBreakpointTarget.h
deleted file mode 100644
index 0062ebd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IBreakpointTarget.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "CrossfireLineBreakpoint.h"
-
-class IBreakpointTarget {
-
-public:
-	IBreakpointTarget() {
-	}
-
-	virtual ~IBreakpointTarget() {
-	}
-
-	virtual bool clearBreakpoint(unsigned int handle) = 0;
-	virtual bool getBreakpoint(unsigned int handle, CrossfireBreakpoint** _value) = 0;
-	virtual bool getBreakpoints(CrossfireBreakpoint*** ___values) = 0;
-	virtual bool setBreakpointCondition(unsigned int handle, std::wstring* condition) = 0;
-	virtual bool setBreakpointEnabled(unsigned int handle, bool enabled) = 0;
-	virtual bool setLineBreakpoint(CrossfireLineBreakpoint* breakpoint, bool isRetry) = 0;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.cpp
deleted file mode 100644
index 67be32c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "resource.h"
-
-#include "CrossfireServerClass.h"
-#include "IECrossfireServer.h"
-#include "Logger.h"
-
-class CIECrossfireServerModule : public CAtlExeModuleT<CIECrossfireServerModule> {
-public :
-	DECLARE_LIBID(LIBID_IECrossfireServerLib)
-	DECLARE_REGISTRY_APPID_RESOURCEID(IDR_IECrossfireServer, "{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}")
-};
-
-CIECrossfireServerModule _AtlModule;
-
-extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) {
-	if (wcscmp((const wchar_t*)lpCmdLine, L"/Embedding") == 0 || wcscmp((const wchar_t*)lpCmdLine, L"-Embedding") == 0) {
-		CoInitialize(NULL);
-		CComObject<CrossfireServerClass>* serverClass = NULL;
-		HRESULT hr = CComObject<CrossfireServerClass>::CreateInstance(&serverClass);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireServer.main(): CreateInstance() failed", hr);
-			return 0;
-		}
-
-		/*
-		 * server is not AddRef'd here in spite of the use of CComObject::CreateInstance
-		 * because CoRegisterClassObject does an automatic AddRef()
-		 */
-
-		DWORD id = 0;
-		hr = CoRegisterClassObject(CLSID_CrossfireServer, (ICrossfireServerClass*)serverClass, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &id);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireServer.main(): CoRegisterClassObject() failed", hr);
-			return 0;
-		}
-
-		BOOL ret;
-		MSG msg;
-		while ((ret = GetMessage(&msg, 0, 0, 0)) != 0) {
-			if (ret == -1) {
-				Logger::error("IECrossfireServer.main(): GetMessage() failed", GetLastError());
-			} else {
-				TranslateMessage(&msg);
-				DispatchMessage(&msg);
-			}
-		}
-
-		hr = CoRevokeClassObject(id);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireServer.main(): CoRevokeClassObject() failed", hr);
-			return 0;
-		}
-
-		CoUninitialize();
-		return 0;
-	}
-
-    return _AtlModule.WinMain(nShowCmd);
-}
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.h
deleted file mode 100644
index f28afa9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.h
+++ /dev/null
@@ -1,902 +0,0 @@
-
-
-/* this ALWAYS GENERATED file contains the definitions for the interfaces */
-
-
- /* File created by MIDL compiler version 6.00.0366 */
-/* at Fri Mar 11 10:39:23 2011
- */
-/* Compiler settings for .\IECrossfireServer.idl:
-    Oicf, W1, Zp8, env=Win32 (32b run)
-    protocol : dce , ms_ext, c_ext
-    error checks: allocation ref bounds_check enum stub_data 
-    VC __declspec() decoration level: 
-         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
-         DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING(  )
-
-#pragma warning( disable: 4049 )  /* more than 64k source lines */
-
-
-/* verify that the <rpcndr.h> version is high enough to compile this file*/
-#ifndef __REQUIRED_RPCNDR_H_VERSION__
-#define __REQUIRED_RPCNDR_H_VERSION__ 440
-#endif
-
-#include "rpc.h"
-#include "rpcndr.h"
-
-#ifndef __RPCNDR_H_VERSION__
-#error this stub requires an updated version of <rpcndr.h>
-#endif // __RPCNDR_H_VERSION__
-
-#ifndef COM_NO_WINDOWS_H
-#include "windows.h"
-#include "ole2.h"
-#endif /*COM_NO_WINDOWS_H*/
-
-#ifndef __IECrossfireServer_h__
-#define __IECrossfireServer_h__
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-#pragma once
-#endif
-
-/* Forward Declarations */ 
-
-#ifndef __IJSEvalCallback_FWD_DEFINED__
-#define __IJSEvalCallback_FWD_DEFINED__
-typedef interface IJSEvalCallback IJSEvalCallback;
-#endif 	/* __IJSEvalCallback_FWD_DEFINED__ */
-
-
-#ifndef __IIEDebugger_FWD_DEFINED__
-#define __IIEDebugger_FWD_DEFINED__
-typedef interface IIEDebugger IIEDebugger;
-#endif 	/* __IIEDebugger_FWD_DEFINED__ */
-
-
-#ifndef __ICrossfireServer_FWD_DEFINED__
-#define __ICrossfireServer_FWD_DEFINED__
-typedef interface ICrossfireServer ICrossfireServer;
-#endif 	/* __ICrossfireServer_FWD_DEFINED__ */
-
-
-#ifndef __ICrossfireServerClass_FWD_DEFINED__
-#define __ICrossfireServerClass_FWD_DEFINED__
-typedef interface ICrossfireServerClass ICrossfireServerClass;
-#endif 	/* __ICrossfireServerClass_FWD_DEFINED__ */
-
-
-#ifndef __IPendingBreakpoint_FWD_DEFINED__
-#define __IPendingBreakpoint_FWD_DEFINED__
-typedef interface IPendingBreakpoint IPendingBreakpoint;
-#endif 	/* __IPendingBreakpoint_FWD_DEFINED__ */
-
-
-#ifndef __JSEvalCallback_FWD_DEFINED__
-#define __JSEvalCallback_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class JSEvalCallback JSEvalCallback;
-#else
-typedef struct JSEvalCallback JSEvalCallback;
-#endif /* __cplusplus */
-
-#endif 	/* __JSEvalCallback_FWD_DEFINED__ */
-
-
-#ifndef __IEDebugger_FWD_DEFINED__
-#define __IEDebugger_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class IEDebugger IEDebugger;
-#else
-typedef struct IEDebugger IEDebugger;
-#endif /* __cplusplus */
-
-#endif 	/* __IEDebugger_FWD_DEFINED__ */
-
-
-#ifndef __CrossfireServer_FWD_DEFINED__
-#define __CrossfireServer_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class CrossfireServer CrossfireServer;
-#else
-typedef struct CrossfireServer CrossfireServer;
-#endif /* __cplusplus */
-
-#endif 	/* __CrossfireServer_FWD_DEFINED__ */
-
-
-#ifndef __CrossfireServerClass_FWD_DEFINED__
-#define __CrossfireServerClass_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class CrossfireServerClass CrossfireServerClass;
-#else
-typedef struct CrossfireServerClass CrossfireServerClass;
-#endif /* __cplusplus */
-
-#endif 	/* __CrossfireServerClass_FWD_DEFINED__ */
-
-
-#ifndef __PendingBreakpoint_FWD_DEFINED__
-#define __PendingBreakpoint_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class PendingBreakpoint PendingBreakpoint;
-#else
-typedef struct PendingBreakpoint PendingBreakpoint;
-#endif /* __cplusplus */
-
-#endif 	/* __PendingBreakpoint_FWD_DEFINED__ */
-
-
-/* header files for imported files */
-#include "oaidl.h"
-#include "ocidl.h"
-
-#ifdef __cplusplus
-extern "C"{
-#endif 
-
-void * __RPC_USER MIDL_user_allocate(size_t);
-void __RPC_USER MIDL_user_free( void * ); 
-
-#ifndef __IJSEvalCallback_INTERFACE_DEFINED__
-#define __IJSEvalCallback_INTERFACE_DEFINED__
-
-/* interface IJSEvalCallback */
-/* [unique][helpstring][uuid][object] */ 
-
-
-EXTERN_C const IID IID_IJSEvalCallback;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("31DC44C3-7C98-4737-8D62-0E78FCCC503C")
-    IJSEvalCallback : public IUnknown
-    {
-    public:
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IJSEvalCallbackVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            IJSEvalCallback * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            IJSEvalCallback * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            IJSEvalCallback * This);
-        
-        END_INTERFACE
-    } IJSEvalCallbackVtbl;
-
-    interface IJSEvalCallback
-    {
-        CONST_VTBL struct IJSEvalCallbackVtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IJSEvalCallback_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IJSEvalCallback_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IJSEvalCallback_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-
-#endif 	/* __IJSEvalCallback_INTERFACE_DEFINED__ */
-
-
-#ifndef __IIEDebugger_INTERFACE_DEFINED__
-#define __IIEDebugger_INTERFACE_DEFINED__
-
-/* interface IIEDebugger */
-/* [unique][helpstring][uuid][object] */ 
-
-
-EXTERN_C const IID IID_IIEDebugger;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("0F9DDD31-746A-4EBC-873D-7A988B5EE088")
-    IIEDebugger : public IUnknown
-    {
-    public:
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IIEDebuggerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            IIEDebugger * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            IIEDebugger * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            IIEDebugger * This);
-        
-        END_INTERFACE
-    } IIEDebuggerVtbl;
-
-    interface IIEDebugger
-    {
-        CONST_VTBL struct IIEDebuggerVtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IIEDebugger_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IIEDebugger_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IIEDebugger_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-
-#endif 	/* __IIEDebugger_INTERFACE_DEFINED__ */
-
-
-#ifndef __ICrossfireServer_INTERFACE_DEFINED__
-#define __ICrossfireServer_INTERFACE_DEFINED__
-
-/* interface ICrossfireServer */
-/* [unique][helpstring][nonextensible][dual][oleautomation][uuid][object] */ 
-
-
-EXTERN_C const IID IID_ICrossfireServer;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("031DB015-B1BE-4D39-84D2-D7F96D2ACBFE")
-    ICrossfireServer : public IDispatch
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE contextCreated( 
-            /* [in] */ DWORD threadId,
-            /* [string][in] */ OLECHAR *href) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE contextDestroyed( 
-            /* [in] */ DWORD threadId) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE contextLoaded( 
-            /* [in] */ DWORD threadId) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE isActive( 
-            /* [out] */ boolean *value) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE registerContext( 
-            /* [in] */ DWORD threadId,
-            /* [string][in] */ OLECHAR *href) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE setCurrentContext( 
-            /* [in] */ DWORD threadId) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE start( 
-            /* [in] */ unsigned int port) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE stop( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct ICrossfireServerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            ICrossfireServer * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            ICrossfireServer * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            ICrossfireServer * This);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( 
-            ICrossfireServer * This,
-            /* [out] */ UINT *pctinfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( 
-            ICrossfireServer * This,
-            /* [in] */ UINT iTInfo,
-            /* [in] */ LCID lcid,
-            /* [out] */ ITypeInfo **ppTInfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( 
-            ICrossfireServer * This,
-            /* [in] */ REFIID riid,
-            /* [size_is][in] */ LPOLESTR *rgszNames,
-            /* [in] */ UINT cNames,
-            /* [in] */ LCID lcid,
-            /* [size_is][out] */ DISPID *rgDispId);
-        
-        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( 
-            ICrossfireServer * This,
-            /* [in] */ DISPID dispIdMember,
-            /* [in] */ REFIID riid,
-            /* [in] */ LCID lcid,
-            /* [in] */ WORD wFlags,
-            /* [out][in] */ DISPPARAMS *pDispParams,
-            /* [out] */ VARIANT *pVarResult,
-            /* [out] */ EXCEPINFO *pExcepInfo,
-            /* [out] */ UINT *puArgErr);
-        
-        HRESULT ( STDMETHODCALLTYPE *contextCreated )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId,
-            /* [string][in] */ OLECHAR *href);
-        
-        HRESULT ( STDMETHODCALLTYPE *contextDestroyed )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId);
-        
-        HRESULT ( STDMETHODCALLTYPE *contextLoaded )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId);
-        
-        HRESULT ( STDMETHODCALLTYPE *isActive )( 
-            ICrossfireServer * This,
-            /* [out] */ boolean *value);
-        
-        HRESULT ( STDMETHODCALLTYPE *registerContext )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId,
-            /* [string][in] */ OLECHAR *href);
-        
-        HRESULT ( STDMETHODCALLTYPE *setCurrentContext )( 
-            ICrossfireServer * This,
-            /* [in] */ DWORD threadId);
-        
-        HRESULT ( STDMETHODCALLTYPE *start )( 
-            ICrossfireServer * This,
-            /* [in] */ unsigned int port);
-        
-        HRESULT ( STDMETHODCALLTYPE *stop )( 
-            ICrossfireServer * This);
-        
-        END_INTERFACE
-    } ICrossfireServerVtbl;
-
-    interface ICrossfireServer
-    {
-        CONST_VTBL struct ICrossfireServerVtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define ICrossfireServer_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define ICrossfireServer_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define ICrossfireServer_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define ICrossfireServer_GetTypeInfoCount(This,pctinfo)	\
-    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)
-
-#define ICrossfireServer_GetTypeInfo(This,iTInfo,lcid,ppTInfo)	\
-    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-
-#define ICrossfireServer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)	\
-    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-
-#define ICrossfireServer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)	\
-    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-
-
-#define ICrossfireServer_contextCreated(This,threadId,href)	\
-    (This)->lpVtbl -> contextCreated(This,threadId,href)
-
-#define ICrossfireServer_contextDestroyed(This,threadId)	\
-    (This)->lpVtbl -> contextDestroyed(This,threadId)
-
-#define ICrossfireServer_contextLoaded(This,threadId)	\
-    (This)->lpVtbl -> contextLoaded(This,threadId)
-
-#define ICrossfireServer_isActive(This,value)	\
-    (This)->lpVtbl -> isActive(This,value)
-
-#define ICrossfireServer_registerContext(This,threadId,href)	\
-    (This)->lpVtbl -> registerContext(This,threadId,href)
-
-#define ICrossfireServer_setCurrentContext(This,threadId)	\
-    (This)->lpVtbl -> setCurrentContext(This,threadId)
-
-#define ICrossfireServer_start(This,port)	\
-    (This)->lpVtbl -> start(This,port)
-
-#define ICrossfireServer_stop(This)	\
-    (This)->lpVtbl -> stop(This)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_contextCreated_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId,
-    /* [string][in] */ OLECHAR *href);
-
-
-void __RPC_STUB ICrossfireServer_contextCreated_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_contextDestroyed_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId);
-
-
-void __RPC_STUB ICrossfireServer_contextDestroyed_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_contextLoaded_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId);
-
-
-void __RPC_STUB ICrossfireServer_contextLoaded_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_isActive_Proxy( 
-    ICrossfireServer * This,
-    /* [out] */ boolean *value);
-
-
-void __RPC_STUB ICrossfireServer_isActive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_registerContext_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId,
-    /* [string][in] */ OLECHAR *href);
-
-
-void __RPC_STUB ICrossfireServer_registerContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_setCurrentContext_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ DWORD threadId);
-
-
-void __RPC_STUB ICrossfireServer_setCurrentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_start_Proxy( 
-    ICrossfireServer * This,
-    /* [in] */ unsigned int port);
-
-
-void __RPC_STUB ICrossfireServer_start_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServer_stop_Proxy( 
-    ICrossfireServer * This);
-
-
-void __RPC_STUB ICrossfireServer_stop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __ICrossfireServer_INTERFACE_DEFINED__ */
-
-
-#ifndef __ICrossfireServerClass_INTERFACE_DEFINED__
-#define __ICrossfireServerClass_INTERFACE_DEFINED__
-
-/* interface ICrossfireServerClass */
-/* [unique][helpstring][nonextensible][dual][oleautomation][uuid][object] */ 
-
-
-EXTERN_C const IID IID_ICrossfireServerClass;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("F48260BB-C061-4410-9CE1-4C5C7602690E")
-    ICrossfireServerClass : public IDispatch
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetServer( 
-            /* [in] */ unsigned long windowHandle,
-            /* [retval][out] */ ICrossfireServer **_value) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveServer( 
-            /* [in] */ unsigned long windowHandle) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct ICrossfireServerClassVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            ICrossfireServerClass * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            ICrossfireServerClass * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            ICrossfireServerClass * This);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( 
-            ICrossfireServerClass * This,
-            /* [out] */ UINT *pctinfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( 
-            ICrossfireServerClass * This,
-            /* [in] */ UINT iTInfo,
-            /* [in] */ LCID lcid,
-            /* [out] */ ITypeInfo **ppTInfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( 
-            ICrossfireServerClass * This,
-            /* [in] */ REFIID riid,
-            /* [size_is][in] */ LPOLESTR *rgszNames,
-            /* [in] */ UINT cNames,
-            /* [in] */ LCID lcid,
-            /* [size_is][out] */ DISPID *rgDispId);
-        
-        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( 
-            ICrossfireServerClass * This,
-            /* [in] */ DISPID dispIdMember,
-            /* [in] */ REFIID riid,
-            /* [in] */ LCID lcid,
-            /* [in] */ WORD wFlags,
-            /* [out][in] */ DISPPARAMS *pDispParams,
-            /* [out] */ VARIANT *pVarResult,
-            /* [out] */ EXCEPINFO *pExcepInfo,
-            /* [out] */ UINT *puArgErr);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetServer )( 
-            ICrossfireServerClass * This,
-            /* [in] */ unsigned long windowHandle,
-            /* [retval][out] */ ICrossfireServer **_value);
-        
-        HRESULT ( STDMETHODCALLTYPE *RemoveServer )( 
-            ICrossfireServerClass * This,
-            /* [in] */ unsigned long windowHandle);
-        
-        END_INTERFACE
-    } ICrossfireServerClassVtbl;
-
-    interface ICrossfireServerClass
-    {
-        CONST_VTBL struct ICrossfireServerClassVtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define ICrossfireServerClass_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define ICrossfireServerClass_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define ICrossfireServerClass_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define ICrossfireServerClass_GetTypeInfoCount(This,pctinfo)	\
-    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)
-
-#define ICrossfireServerClass_GetTypeInfo(This,iTInfo,lcid,ppTInfo)	\
-    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-
-#define ICrossfireServerClass_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)	\
-    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-
-#define ICrossfireServerClass_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)	\
-    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-
-
-#define ICrossfireServerClass_GetServer(This,windowHandle,_value)	\
-    (This)->lpVtbl -> GetServer(This,windowHandle,_value)
-
-#define ICrossfireServerClass_RemoveServer(This,windowHandle)	\
-    (This)->lpVtbl -> RemoveServer(This,windowHandle)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServerClass_GetServer_Proxy( 
-    ICrossfireServerClass * This,
-    /* [in] */ unsigned long windowHandle,
-    /* [retval][out] */ ICrossfireServer **_value);
-
-
-void __RPC_STUB ICrossfireServerClass_GetServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ICrossfireServerClass_RemoveServer_Proxy( 
-    ICrossfireServerClass * This,
-    /* [in] */ unsigned long windowHandle);
-
-
-void __RPC_STUB ICrossfireServerClass_RemoveServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __ICrossfireServerClass_INTERFACE_DEFINED__ */
-
-
-#ifndef __IPendingBreakpoint_INTERFACE_DEFINED__
-#define __IPendingBreakpoint_INTERFACE_DEFINED__
-
-/* interface IPendingBreakpoint */
-/* [unique][helpstring][nonextensible][dual][uuid][object] */ 
-
-
-EXTERN_C const IID IID_IPendingBreakpoint;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("56C1AD62-3E69-46BA-BE6D-E1D2A0D88AB5")
-    IPendingBreakpoint : public IDispatch
-    {
-    public:
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IPendingBreakpointVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            IPendingBreakpoint * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            IPendingBreakpoint * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            IPendingBreakpoint * This);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( 
-            IPendingBreakpoint * This,
-            /* [out] */ UINT *pctinfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( 
-            IPendingBreakpoint * This,
-            /* [in] */ UINT iTInfo,
-            /* [in] */ LCID lcid,
-            /* [out] */ ITypeInfo **ppTInfo);
-        
-        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( 
-            IPendingBreakpoint * This,
-            /* [in] */ REFIID riid,
-            /* [size_is][in] */ LPOLESTR *rgszNames,
-            /* [in] */ UINT cNames,
-            /* [in] */ LCID lcid,
-            /* [size_is][out] */ DISPID *rgDispId);
-        
-        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( 
-            IPendingBreakpoint * This,
-            /* [in] */ DISPID dispIdMember,
-            /* [in] */ REFIID riid,
-            /* [in] */ LCID lcid,
-            /* [in] */ WORD wFlags,
-            /* [out][in] */ DISPPARAMS *pDispParams,
-            /* [out] */ VARIANT *pVarResult,
-            /* [out] */ EXCEPINFO *pExcepInfo,
-            /* [out] */ UINT *puArgErr);
-        
-        END_INTERFACE
-    } IPendingBreakpointVtbl;
-
-    interface IPendingBreakpoint
-    {
-        CONST_VTBL struct IPendingBreakpointVtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IPendingBreakpoint_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IPendingBreakpoint_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IPendingBreakpoint_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IPendingBreakpoint_GetTypeInfoCount(This,pctinfo)	\
-    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)
-
-#define IPendingBreakpoint_GetTypeInfo(This,iTInfo,lcid,ppTInfo)	\
-    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-
-#define IPendingBreakpoint_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)	\
-    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-
-#define IPendingBreakpoint_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)	\
-    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-
-#endif 	/* __IPendingBreakpoint_INTERFACE_DEFINED__ */
-
-
-
-#ifndef __IECrossfireServerLib_LIBRARY_DEFINED__
-#define __IECrossfireServerLib_LIBRARY_DEFINED__
-
-/* library IECrossfireServerLib */
-/* [helpstring][version][uuid] */ 
-
-
-EXTERN_C const IID LIBID_IECrossfireServerLib;
-
-EXTERN_C const CLSID CLSID_JSEvalCallback;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7")
-JSEvalCallback;
-#endif
-
-EXTERN_C const CLSID CLSID_IEDebugger;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("B63BD92F-6C66-4AB2-A243-D5AFCCF4B587")
-IEDebugger;
-#endif
-
-EXTERN_C const CLSID CLSID_CrossfireServer;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("47836AF4-3E0C-4995-8029-FF931C5A43FC")
-CrossfireServer;
-#endif
-
-EXTERN_C const CLSID CLSID_CrossfireServerClass;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25")
-CrossfireServerClass;
-#endif
-
-EXTERN_C const CLSID CLSID_PendingBreakpoint;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("88E7C480-7B7A-47C5-8329-CE1FDF415527")
-PendingBreakpoint;
-#endif
-#endif /* __IECrossfireServerLib_LIBRARY_DEFINED__ */
-
-/* Additional Prototypes for ALL interfaces */
-
-/* end of Additional Prototypes */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.idl b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.idl
deleted file mode 100644
index 1d5a60b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.idl
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-import "oaidl.idl";
-import "ocidl.idl";
-
-[
-	object,
-	uuid(31DC44C3-7C98-4737-8D62-0E78FCCC503C),
-	helpstring("IJSEvalCallback Interface"),
-	pointer_default(unique)
-]
-interface IJSEvalCallback : IUnknown {
-};
-[
-	object,
-	uuid(0F9DDD31-746A-4EBC-873D-7A988B5EE088),
-	helpstring("IIEDebugger Interface"),
-	pointer_default(unique)
-]
-interface IIEDebugger : IUnknown {
-};
-[
-	object,
-	uuid(031DB015-B1BE-4D39-84D2-D7F96D2ACBFE),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("ICrossfireServer Interface"),
-	pointer_default(unique)
-]
-interface ICrossfireServer : IDispatch {
-	HRESULT contextCreated([in] DWORD threadId, [in, string] OLECHAR* href);
-	HRESULT contextDestroyed([in] DWORD threadId);
-	HRESULT contextLoaded([in] DWORD threadId);
-	HRESULT isActive([out] boolean* value);
-	HRESULT registerContext([in] DWORD threadId, [in, string] OLECHAR* href);
-	HRESULT setCurrentContext([in] DWORD threadId);
-	HRESULT start([in] unsigned int port);
-	HRESULT stop();
-};
-[
-	object,
-	uuid(F48260BB-C061-4410-9CE1-4C5C7602690E),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("ICrossfireServerClass Interface"),
-	pointer_default(unique)
-]
-interface ICrossfireServerClass : IDispatch {
-	HRESULT GetServer([in] unsigned long windowHandle, [out, retval] ICrossfireServer** _value);
-	HRESULT RemoveServer([in] unsigned long windowHandle);
-};
-[
-	object,
-	uuid(56C1AD62-3E69-46BA-BE6D-E1D2A0D88AB5),
-	dual,
-	nonextensible,
-	helpstring("IPendingBreakpoint Interface"),
-	pointer_default(unique)
-]
-interface IPendingBreakpoint : IDispatch {
-};
-[
-	uuid(A8FFC284-CE2C-40B5-98D1-D3112811E9D9),
-	version(1.0),
-	helpstring("IECrossfireServer 1.0 Type Library")
-]
-library IECrossfireServerLib {
-	importlib("stdole2.tlb");
-	[
-		uuid(4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7),
-		helpstring("JSEvalCallback Class")
-	]
-	coclass JSEvalCallback
-	{
-		[default] interface IJSEvalCallback;
-	};
-	[
-		uuid(B63BD92F-6C66-4AB2-A243-D5AFCCF4B587),
-		helpstring("IEDebugger Class")
-	]
-	coclass IEDebugger
-	{
-		[default] interface IIEDebugger;
-	};
-	[
-		uuid(47836AF4-3E0C-4995-8029-FF931C5A43FC),
-		helpstring("CrossfireServer Class")
-	]
-	coclass CrossfireServer
-	{
-		[default] interface ICrossfireServer;
-	};
-	[
-		uuid(7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25),
-		helpstring("CrossfireServerClass Class")
-	]
-	coclass CrossfireServerClass
-	{
-		[default] interface ICrossfireServerClass;
-	};
-	[
-		uuid(88E7C480-7B7A-47C5-8329-CE1FDF415527),
-		helpstring("PendingBreakpoint Class")
-	]
-	coclass PendingBreakpoint
-	{
-		[default] interface IPendingBreakpoint;
-	};
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rc b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rc
deleted file mode 100644
index 5205144..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "winres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (Canada) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "#include ""winres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "1 TYPELIB ""IECrossfireServer.tlb""\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,1
- PRODUCTVERSION 1,0,0,1
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904e4"
-        BEGIN
-            VALUE "CompanyName", "Eclipse Foundation"
-            VALUE "FileDescription", "IE Crossfire Server"
-            VALUE "FileVersion", "1.0.0.0"
-            VALUE "LegalCopyright", "Copyright (c) 2011 IBM Corp.  All Rights Reserved."
-            VALUE "InternalName", "IECrossfireServer"
-            VALUE "OriginalFilename", "IECrossfireServer.exe"
-            VALUE "ProductName", "IE Crossfire Server"
-            VALUE "ProductVersion", "0,0,0,0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1252
-    END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// REGISTRY
-//
-
-IDR_IECrossfireServer   REGISTRY                "IECrossfireServer.rgs"
-IDR_JSEVALCALLBACK      REGISTRY                "JSEvalCallback.rgs"
-IDR_IEDEBUGGER          REGISTRY                "IEDebugger.rgs"
-IDR_CROSSFIRESERVER     REGISTRY                "CrossfireServer1.rgs"
-IDR_CROSSFIRESERVERCLASS REGISTRY                "CrossfireServerClass.rgs"
-IDR_PENDINGBREAKPOINT   REGISTRY                "PendingBreakpoint.rgs"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// String Table
-//
-
-STRINGTABLE 
-BEGIN
-    IDS_PROJNAME            "IECrossfireServer"
-END
-
-#endif    // English (Canada) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-1 TYPELIB "IECrossfireServer.tlb"
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rgs
deleted file mode 100644
index 2e7f3a0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rgs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	NoRemove AppID {
-		'%APPID%' = s 'IECrossfireServer'
-		'IECrossfireServer.EXE' {
-			val AppID = s '%APPID%'
-		}
-	}
-	NoRemove CLSID {
-		ForceRemove {47836AF4-3E0C-4995-8029-FF931C5A43FC} = s 'CrossfireServer Class' {
-			LocalServer32 = s '%MODULE%'
-		}
-	}
-	NoRemove Interface {
-		ForceRemove {031DB015-B1BE-4D39-84D2-D7F96D2ACBFE} = s 'CrossfireServer Interface' {
-			ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
-			TypeLib = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-	NoRemove Interface {
-		ForceRemove {F48260BB-C061-4410-9CE1-4C5C7602690E} = s 'CrossfireServerClass Interface' {
-			ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
-			TypeLib = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcproj
deleted file mode 100644
index b29143f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcproj
+++ /dev/null
@@ -1,480 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="IECrossfireServer"
-	ProjectGUID="{2B73B89A-A1B4-479B-8751-A25B9036A9AF}"
-	RootNamespace="IECrossfireServer"
-	Keyword="AtlProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			UseOfATL="2"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				PreprocessorDefinitions="_DEBUG"
-				MkTypLibCompatible="false"
-				TargetEnvironment="1"
-				GenerateStublessProxies="true"
-				TypeLibraryName="$(IntDir)/IECrossfireServer.tlb"
-				HeaderFileName="IECrossfireServer.h"
-				DLLDataFileName=""
-				InterfaceIdentifierFileName="IECrossfireServer_i.c"
-				ProxyFileName="IECrossfireServer_p.c"
-				ValidateParameters="false"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="2"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="_DEBUG"
-				Culture="1033"
-				AdditionalIncludeDirectories="$(IntDir)"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				IgnoreImportLibrary="true"
-				AdditionalDependencies="WS2_32.lib"
-				LinkIncremental="2"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-				Description="Performing registration"
-				CommandLine="&quot;$(TargetPath)&quot; /RegServer"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			UseOfATL="2"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				PreprocessorDefinitions="NDEBUG"
-				MkTypLibCompatible="false"
-				TargetEnvironment="1"
-				GenerateStublessProxies="true"
-				TypeLibraryName="$(IntDir)/IECrossfireServer.tlb"
-				HeaderFileName="IECrossfireServer.h"
-				DLLDataFileName=""
-				InterfaceIdentifierFileName="IECrossfireServer_i.c"
-				ProxyFileName="IECrossfireServer_p.c"
-				ValidateParameters="false"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="2"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="NDEBUG"
-				Culture="1033"
-				AdditionalIncludeDirectories="$(IntDir)"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				IgnoreImportLibrary="true"
-				AdditionalDependencies="WS2_32.lib"
-				LinkIncremental="1"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-				Description="Performing registration"
-				CommandLine="&quot;$(TargetPath)&quot; /RegServer"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\CrossfireBPManager.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireBreakpoint.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireContext.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireEvent.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireLineBreakpoint.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfirePacket.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireProcessor.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireRequest.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireResponse.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireServer.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireServerClass.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireServer.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireServer.idl"
-				>
-			</File>
-			<File
-				RelativePath=".\IEDebugger.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\JSEvalCallback.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\JSONParser.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\Logger.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\PendingBreakpoint.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\stdafx.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\Value.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\WindowsSocketConnection.cpp"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath=".\activdbg.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireBPManager.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireBreakpoint.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireContext.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireEvent.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireLineBreakpoint.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfirePacket.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireProcessor.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireRequest.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireResponse.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireServer.h"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireServerClass.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\..\..\..\Desktop\temp\dbgprop.h"
-				>
-			</File>
-			<File
-				RelativePath=".\IBreakpointTarget.h"
-				>
-			</File>
-			<File
-				RelativePath=".\IEDebugger.h"
-				>
-			</File>
-			<File
-				RelativePath=".\JSEvalCallback.h"
-				>
-			</File>
-			<File
-				RelativePath=".\JSONParser.h"
-				>
-			</File>
-			<File
-				RelativePath=".\Logger.h"
-				>
-			</File>
-			<File
-				RelativePath=".\PendingBreakpoint.h"
-				>
-			</File>
-			<File
-				RelativePath=".\Resource.h"
-				>
-			</File>
-			<File
-				RelativePath=".\stdafx.h"
-				>
-			</File>
-			<File
-				RelativePath=".\Value.h"
-				>
-			</File>
-			<File
-				RelativePath=".\WindowsSocketConnection.h"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath=".\CrossfireServer1.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\CrossfireServerClass.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireServer.rc"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireServer.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\IEDebugger.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\JSEvalCallback.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\PendingBreakpoint.rgs"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Generated Files"
-			SourceControlFiles="false"
-			>
-			<File
-				RelativePath=".\IECrossfireServer.h"
-				>
-			</File>
-			<File
-				RelativePath=".\IECrossfireServer_i.c"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-					/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcproj
deleted file mode 100644
index a0f583f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcproj
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="IECrossfireServerPS"
-	ProjectGUID="{668D1F72-89E4-47B7-AB3C-6851CDD0073D}"
-	RootNamespace="IECrossfireServerPS"
-	Keyword="AtlPSProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(ConfigurationName)PS"
-			IntermediateDirectory="$(ConfigurationName)PS"
-			ConfigurationType="2"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-				Description="Checking for required files"
-				CommandLine="if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				PreprocessorDefinitions="WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;_DEBUG"
-				RuntimeLibrary="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				RegisterOutput="true"
-				AdditionalDependencies="kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib"
-				ModuleDefinitionFile="OutOfProcessControllerPS.def"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(ConfigurationName)PS"
-			IntermediateDirectory="$(ConfigurationName)PS"
-			ConfigurationType="2"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-				Description="Checking for required files"
-				CommandLine="if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				PreprocessorDefinitions="WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG"
-				RuntimeLibrary="2"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				RegisterOutput="true"
-				AdditionalDependencies="kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib"
-				ModuleDefinitionFile="OutOfProcessControllerPS.def"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			>
-		</Filter>
-		<Filter
-			Name="Generated Files"
-			SourceControlFiles="false"
-			>
-			<File
-				RelativePath=".\dlldata.c"
-				>
-			</File>
-			<File
-				RelativePath=".\OutOfProcessController_i.c"
-				>
-			</File>
-			<File
-				RelativePath=".\OutOfProcessController_p.c"
-				>
-			</File>
-		</Filter>
-		<File
-			RelativePath=".\OutOfProcessControllerps.def"
-			>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer_i.c b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer_i.c
deleted file mode 100644
index 9f8290c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer_i.c
+++ /dev/null
@@ -1,109 +0,0 @@
-
-
-/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
-
-/* link this file in with the server and any clients */
-
-
- /* File created by MIDL compiler version 6.00.0366 */
-/* at Fri Mar 11 10:39:23 2011
- */
-/* Compiler settings for .\IECrossfireServer.idl:
-    Oicf, W1, Zp8, env=Win32 (32b run)
-    protocol : dce , ms_ext, c_ext
-    error checks: allocation ref bounds_check enum stub_data 
-    VC __declspec() decoration level: 
-         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
-         DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING(  )
-
-#pragma warning( disable: 4049 )  /* more than 64k source lines */
-
-
-#ifdef __cplusplus
-extern "C"{
-#endif 
-
-
-#include <rpc.h>
-#include <rpcndr.h>
-
-#ifdef _MIDL_USE_GUIDDEF_
-
-#ifndef INITGUID
-#define INITGUID
-#include <guiddef.h>
-#undef INITGUID
-#else
-#include <guiddef.h>
-#endif
-
-#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
-        DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
-
-#else // !_MIDL_USE_GUIDDEF_
-
-#ifndef __IID_DEFINED__
-#define __IID_DEFINED__
-
-typedef struct _IID
-{
-    unsigned long x;
-    unsigned short s1;
-    unsigned short s2;
-    unsigned char  c[8];
-} IID;
-
-#endif // __IID_DEFINED__
-
-#ifndef CLSID_DEFINED
-#define CLSID_DEFINED
-typedef IID CLSID;
-#endif // CLSID_DEFINED
-
-#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
-        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
-
-#endif !_MIDL_USE_GUIDDEF_
-
-MIDL_DEFINE_GUID(IID, IID_IJSEvalCallback,0x31DC44C3,0x7C98,0x4737,0x8D,0x62,0x0E,0x78,0xFC,0xCC,0x50,0x3C);
-
-
-MIDL_DEFINE_GUID(IID, IID_IIEDebugger,0x0F9DDD31,0x746A,0x4EBC,0x87,0x3D,0x7A,0x98,0x8B,0x5E,0xE0,0x88);
-
-
-MIDL_DEFINE_GUID(IID, IID_ICrossfireServer,0x031DB015,0xB1BE,0x4D39,0x84,0xD2,0xD7,0xF9,0x6D,0x2A,0xCB,0xFE);
-
-
-MIDL_DEFINE_GUID(IID, IID_ICrossfireServerClass,0xF48260BB,0xC061,0x4410,0x9C,0xE1,0x4C,0x5C,0x76,0x02,0x69,0x0E);
-
-
-MIDL_DEFINE_GUID(IID, IID_IPendingBreakpoint,0x56C1AD62,0x3E69,0x46BA,0xBE,0x6D,0xE1,0xD2,0xA0,0xD8,0x8A,0xB5);
-
-
-MIDL_DEFINE_GUID(IID, LIBID_IECrossfireServerLib,0xA8FFC284,0xCE2C,0x40B5,0x98,0xD1,0xD3,0x11,0x28,0x11,0xE9,0xD9);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_JSEvalCallback,0x4EC15DD3,0x9E2F,0x43A7,0xA6,0x86,0x3F,0xA9,0x0E,0x22,0xAB,0xB7);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_IEDebugger,0xB63BD92F,0x6C66,0x4AB2,0xA2,0x43,0xD5,0xAF,0xCC,0xF4,0xB5,0x87);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_CrossfireServer,0x47836AF4,0x3E0C,0x4995,0x80,0x29,0xFF,0x93,0x1C,0x5A,0x43,0xFC);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_CrossfireServerClass,0x7C3C5D7A,0xAF4D,0x4F32,0xA3,0xC9,0x46,0x2B,0xFB,0xAF,0xDC,0x25);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_PendingBreakpoint,0x88E7C480,0x7B7A,0x47C5,0x83,0x29,0xCE,0x1F,0xDF,0x41,0x55,0x27);
-
-#undef MIDL_DEFINE_GUID
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer_p.c b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer_p.c
deleted file mode 100644
index 5b808e9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer_p.c
+++ /dev/null
@@ -1,852 +0,0 @@
-
-
-/* this ALWAYS GENERATED file contains the proxy stub code */
-
-
- /* File created by MIDL compiler version 6.00.0366 */
-/* at Fri Mar 11 10:39:23 2011
- */
-/* Compiler settings for .\IECrossfireServer.idl:
-    Oicf, W1, Zp8, env=Win32 (32b run)
-    protocol : dce , ms_ext, c_ext
-    error checks: allocation ref bounds_check enum stub_data 
-    VC __declspec() decoration level: 
-         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
-         DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING(  )
-
-#if !defined(_M_IA64) && !defined(_M_AMD64)
-
-
-#pragma warning( disable: 4049 )  /* more than 64k source lines */
-#if _MSC_VER >= 1200
-#pragma warning(push)
-#endif
-#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */
-#pragma warning( disable: 4211 )  /* redefine extent to static */
-#pragma warning( disable: 4232 )  /* dllimport identity*/
-#pragma optimize("", off ) 
-
-#define USE_STUBLESS_PROXY
-
-
-/* verify that the <rpcproxy.h> version is high enough to compile this file*/
-#ifndef __REDQ_RPCPROXY_H_VERSION__
-#define __REQUIRED_RPCPROXY_H_VERSION__ 440
-#endif
-
-
-#include "rpcproxy.h"
-#ifndef __RPCPROXY_H_VERSION__
-#error this stub requires an updated version of <rpcproxy.h>
-#endif // __RPCPROXY_H_VERSION__
-
-
-#include "IECrossfireServer.h"
-
-#define TYPE_FORMAT_STRING_SIZE   33                                
-#define PROC_FORMAT_STRING_SIZE   265                               
-#define TRANSMIT_AS_TABLE_SIZE    0            
-#define WIRE_MARSHAL_TABLE_SIZE   0            
-
-typedef struct _MIDL_TYPE_FORMAT_STRING
-    {
-    short          Pad;
-    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];
-    } MIDL_TYPE_FORMAT_STRING;
-
-typedef struct _MIDL_PROC_FORMAT_STRING
-    {
-    short          Pad;
-    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];
-    } MIDL_PROC_FORMAT_STRING;
-
-
-static RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 
-{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
-
-
-extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString;
-extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString;
-
-
-extern const MIDL_STUB_DESC Object_StubDesc;
-
-
-extern const MIDL_SERVER_INFO IJSEvalCallback_ServerInfo;
-extern const MIDL_STUBLESS_PROXY_INFO IJSEvalCallback_ProxyInfo;
-
-
-extern const MIDL_STUB_DESC Object_StubDesc;
-
-
-extern const MIDL_SERVER_INFO IIEDebugger_ServerInfo;
-extern const MIDL_STUBLESS_PROXY_INFO IIEDebugger_ProxyInfo;
-
-
-extern const MIDL_STUB_DESC Object_StubDesc;
-
-
-extern const MIDL_SERVER_INFO ICrossfireServer_ServerInfo;
-extern const MIDL_STUBLESS_PROXY_INFO ICrossfireServer_ProxyInfo;
-
-
-extern const MIDL_STUB_DESC Object_StubDesc;
-
-
-extern const MIDL_SERVER_INFO ICrossfireServerClass_ServerInfo;
-extern const MIDL_STUBLESS_PROXY_INFO ICrossfireServerClass_ProxyInfo;
-
-
-extern const MIDL_STUB_DESC Object_StubDesc;
-
-
-extern const MIDL_SERVER_INFO IPendingBreakpoint_ServerInfo;
-extern const MIDL_STUBLESS_PROXY_INFO IPendingBreakpoint_ProxyInfo;
-
-
-
-#if !defined(__RPC_WIN32__)
-#error  Invalid build platform for this stub.
-#endif
-
-#if !(TARGET_IS_NT40_OR_LATER)
-#error You need a Windows NT 4.0 or later to run this stub because it uses these features:
-#error   -Oif or -Oicf.
-#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.
-#error This app will die there with the RPC_X_WRONG_STUB_VERSION error.
-#endif
-
-
-static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
-    {
-        0,
-        {
-
-	/* Procedure contextCreated */
-
-			0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/*  2 */	NdrFcLong( 0x0 ),	/* 0 */
-/*  6 */	NdrFcShort( 0x7 ),	/* 7 */
-/*  8 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */
-/* 10 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 12 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 14 */	0x6,		/* Oi2 Flags:  clt must size, has return, */
-			0x3,		/* 3 */
-
-	/* Parameter threadId */
-
-/* 16 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 18 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 20 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Parameter href */
-
-/* 22 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */
-/* 24 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 26 */	NdrFcShort( 0x4 ),	/* Type Offset=4 */
-
-	/* Return value */
-
-/* 28 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 30 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 32 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure RemoveServer */
-
-
-	/* Procedure contextDestroyed */
-
-/* 34 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 36 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 40 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 42 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 44 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 46 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 48 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter windowHandle */
-
-
-	/* Parameter threadId */
-
-/* 50 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 52 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 54 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-
-	/* Return value */
-
-/* 56 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 58 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 60 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure contextLoaded */
-
-/* 62 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 64 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 68 */	NdrFcShort( 0x9 ),	/* 9 */
-/* 70 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 72 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 74 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 76 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter threadId */
-
-/* 78 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 80 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 82 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-/* 84 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 86 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 88 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure isActive */
-
-/* 90 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 92 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 96 */	NdrFcShort( 0xa ),	/* 10 */
-/* 98 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 100 */	NdrFcShort( 0x0 ),	/* 0 */
-/* 102 */	NdrFcShort( 0x21 ),	/* 33 */
-/* 104 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter value */
-
-/* 106 */	NdrFcShort( 0x2150 ),	/* Flags:  out, base type, simple ref, srv alloc size=8 */
-/* 108 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 110 */	0x3,		/* FC_SMALL */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-/* 112 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 114 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 116 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure registerContext */
-
-/* 118 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 120 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 124 */	NdrFcShort( 0xb ),	/* 11 */
-/* 126 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */
-/* 128 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 130 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 132 */	0x6,		/* Oi2 Flags:  clt must size, has return, */
-			0x3,		/* 3 */
-
-	/* Parameter threadId */
-
-/* 134 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 136 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 138 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Parameter href */
-
-/* 140 */	NdrFcShort( 0x10b ),	/* Flags:  must size, must free, in, simple ref, */
-/* 142 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 144 */	NdrFcShort( 0x4 ),	/* Type Offset=4 */
-
-	/* Return value */
-
-/* 146 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 148 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 150 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure setCurrentContext */
-
-/* 152 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 154 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 158 */	NdrFcShort( 0xc ),	/* 12 */
-/* 160 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 162 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 164 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 166 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter threadId */
-
-/* 168 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 170 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 172 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-/* 174 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 176 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 178 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure start */
-
-/* 180 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 182 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 186 */	NdrFcShort( 0xd ),	/* 13 */
-/* 188 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 190 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 192 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 194 */	0x4,		/* Oi2 Flags:  has return, */
-			0x2,		/* 2 */
-
-	/* Parameter port */
-
-/* 196 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 198 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 200 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Return value */
-
-/* 202 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 204 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 206 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure stop */
-
-/* 208 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 210 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 214 */	NdrFcShort( 0xe ),	/* 14 */
-/* 216 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 218 */	NdrFcShort( 0x0 ),	/* 0 */
-/* 220 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 222 */	0x4,		/* Oi2 Flags:  has return, */
-			0x1,		/* 1 */
-
-	/* Return value */
-
-/* 224 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 226 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 228 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Procedure GetServer */
-
-/* 230 */	0x33,		/* FC_AUTO_HANDLE */
-			0x6c,		/* Old Flags:  object, Oi2 */
-/* 232 */	NdrFcLong( 0x0 ),	/* 0 */
-/* 236 */	NdrFcShort( 0x7 ),	/* 7 */
-/* 238 */	NdrFcShort( 0x10 ),	/* x86 Stack size/offset = 16 */
-/* 240 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 242 */	NdrFcShort( 0x8 ),	/* 8 */
-/* 244 */	0x5,		/* Oi2 Flags:  srv must size, has return, */
-			0x3,		/* 3 */
-
-	/* Parameter windowHandle */
-
-/* 246 */	NdrFcShort( 0x48 ),	/* Flags:  in, base type, */
-/* 248 */	NdrFcShort( 0x4 ),	/* x86 Stack size/offset = 4 */
-/* 250 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-	/* Parameter _value */
-
-/* 252 */	NdrFcShort( 0x13 ),	/* Flags:  must size, must free, out, */
-/* 254 */	NdrFcShort( 0x8 ),	/* x86 Stack size/offset = 8 */
-/* 256 */	NdrFcShort( 0xa ),	/* Type Offset=10 */
-
-	/* Return value */
-
-/* 258 */	NdrFcShort( 0x70 ),	/* Flags:  out, return, base type, */
-/* 260 */	NdrFcShort( 0xc ),	/* x86 Stack size/offset = 12 */
-/* 262 */	0x8,		/* FC_LONG */
-			0x0,		/* 0 */
-
-			0x0
-        }
-    };
-
-static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString =
-    {
-        0,
-        {
-			NdrFcShort( 0x0 ),	/* 0 */
-/*  2 */	
-			0x11, 0x8,	/* FC_RP [simple_pointer] */
-/*  4 */	
-			0x25,		/* FC_C_WSTRING */
-			0x5c,		/* FC_PAD */
-/*  6 */	
-			0x11, 0xc,	/* FC_RP [alloced_on_stack] [simple_pointer] */
-/*  8 */	0x3,		/* FC_SMALL */
-			0x5c,		/* FC_PAD */
-/* 10 */	
-			0x11, 0x10,	/* FC_RP [pointer_deref] */
-/* 12 */	NdrFcShort( 0x2 ),	/* Offset= 2 (14) */
-/* 14 */	
-			0x2f,		/* FC_IP */
-			0x5a,		/* FC_CONSTANT_IID */
-/* 16 */	NdrFcLong( 0x31db015 ),	/* 52277269 */
-/* 20 */	NdrFcShort( 0xb1be ),	/* -20034 */
-/* 22 */	NdrFcShort( 0x4d39 ),	/* 19769 */
-/* 24 */	0x84,		/* 132 */
-			0xd2,		/* 210 */
-/* 26 */	0xd7,		/* 215 */
-			0xf9,		/* 249 */
-/* 28 */	0x6d,		/* 109 */
-			0x2a,		/* 42 */
-/* 30 */	0xcb,		/* 203 */
-			0xfe,		/* 254 */
-
-			0x0
-        }
-    };
-
-
-/* Object interface: IUnknown, ver. 0.0,
-   GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
-
-
-/* Object interface: IJSEvalCallback, ver. 0.0,
-   GUID={0x31DC44C3,0x7C98,0x4737,{0x8D,0x62,0x0E,0x78,0xFC,0xCC,0x50,0x3C}} */
-
-#pragma code_seg(".orpc")
-static const unsigned short IJSEvalCallback_FormatStringOffsetTable[] =
-    {
-    0
-    };
-
-static const MIDL_STUBLESS_PROXY_INFO IJSEvalCallback_ProxyInfo =
-    {
-    &Object_StubDesc,
-    __MIDL_ProcFormatString.Format,
-    &IJSEvalCallback_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0
-    };
-
-
-static const MIDL_SERVER_INFO IJSEvalCallback_ServerInfo = 
-    {
-    &Object_StubDesc,
-    0,
-    __MIDL_ProcFormatString.Format,
-    &IJSEvalCallback_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0,
-    0};
-CINTERFACE_PROXY_VTABLE(3) _IJSEvalCallbackProxyVtbl = 
-{
-    0,
-    &IID_IJSEvalCallback,
-    IUnknown_QueryInterface_Proxy,
-    IUnknown_AddRef_Proxy,
-    IUnknown_Release_Proxy
-};
-
-const CInterfaceStubVtbl _IJSEvalCallbackStubVtbl =
-{
-    &IID_IJSEvalCallback,
-    &IJSEvalCallback_ServerInfo,
-    3,
-    0, /* pure interpreted */
-    CStdStubBuffer_METHODS
-};
-
-
-/* Object interface: IIEDebugger, ver. 0.0,
-   GUID={0x0F9DDD31,0x746A,0x4EBC,{0x87,0x3D,0x7A,0x98,0x8B,0x5E,0xE0,0x88}} */
-
-#pragma code_seg(".orpc")
-static const unsigned short IIEDebugger_FormatStringOffsetTable[] =
-    {
-    0
-    };
-
-static const MIDL_STUBLESS_PROXY_INFO IIEDebugger_ProxyInfo =
-    {
-    &Object_StubDesc,
-    __MIDL_ProcFormatString.Format,
-    &IIEDebugger_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0
-    };
-
-
-static const MIDL_SERVER_INFO IIEDebugger_ServerInfo = 
-    {
-    &Object_StubDesc,
-    0,
-    __MIDL_ProcFormatString.Format,
-    &IIEDebugger_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0,
-    0};
-CINTERFACE_PROXY_VTABLE(3) _IIEDebuggerProxyVtbl = 
-{
-    0,
-    &IID_IIEDebugger,
-    IUnknown_QueryInterface_Proxy,
-    IUnknown_AddRef_Proxy,
-    IUnknown_Release_Proxy
-};
-
-const CInterfaceStubVtbl _IIEDebuggerStubVtbl =
-{
-    &IID_IIEDebugger,
-    &IIEDebugger_ServerInfo,
-    3,
-    0, /* pure interpreted */
-    CStdStubBuffer_METHODS
-};
-
-
-/* Object interface: IDispatch, ver. 0.0,
-   GUID={0x00020400,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
-
-
-/* Object interface: ICrossfireServer, ver. 0.0,
-   GUID={0x031DB015,0xB1BE,0x4D39,{0x84,0xD2,0xD7,0xF9,0x6D,0x2A,0xCB,0xFE}} */
-
-#pragma code_seg(".orpc")
-static const unsigned short ICrossfireServer_FormatStringOffsetTable[] =
-    {
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    0,
-    34,
-    62,
-    90,
-    118,
-    152,
-    180,
-    208
-    };
-
-static const MIDL_STUBLESS_PROXY_INFO ICrossfireServer_ProxyInfo =
-    {
-    &Object_StubDesc,
-    __MIDL_ProcFormatString.Format,
-    &ICrossfireServer_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0
-    };
-
-
-static const MIDL_SERVER_INFO ICrossfireServer_ServerInfo = 
-    {
-    &Object_StubDesc,
-    0,
-    __MIDL_ProcFormatString.Format,
-    &ICrossfireServer_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0,
-    0};
-CINTERFACE_PROXY_VTABLE(15) _ICrossfireServerProxyVtbl = 
-{
-    &ICrossfireServer_ProxyInfo,
-    &IID_ICrossfireServer,
-    IUnknown_QueryInterface_Proxy,
-    IUnknown_AddRef_Proxy,
-    IUnknown_Release_Proxy ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfoCount */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfo */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetIDsOfNames */ ,
-    0 /* IDispatch_Invoke_Proxy */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::contextCreated */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::contextDestroyed */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::contextLoaded */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::isActive */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::registerContext */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::setCurrentContext */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::start */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServer::stop */
-};
-
-
-static const PRPC_STUB_FUNCTION ICrossfireServer_table[] =
-{
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2,
-    NdrStubCall2
-};
-
-CInterfaceStubVtbl _ICrossfireServerStubVtbl =
-{
-    &IID_ICrossfireServer,
-    &ICrossfireServer_ServerInfo,
-    15,
-    &ICrossfireServer_table[-3],
-    CStdStubBuffer_DELEGATING_METHODS
-};
-
-
-/* Object interface: ICrossfireServerClass, ver. 0.0,
-   GUID={0xF48260BB,0xC061,0x4410,{0x9C,0xE1,0x4C,0x5C,0x76,0x02,0x69,0x0E}} */
-
-#pragma code_seg(".orpc")
-static const unsigned short ICrossfireServerClass_FormatStringOffsetTable[] =
-    {
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    230,
-    34
-    };
-
-static const MIDL_STUBLESS_PROXY_INFO ICrossfireServerClass_ProxyInfo =
-    {
-    &Object_StubDesc,
-    __MIDL_ProcFormatString.Format,
-    &ICrossfireServerClass_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0
-    };
-
-
-static const MIDL_SERVER_INFO ICrossfireServerClass_ServerInfo = 
-    {
-    &Object_StubDesc,
-    0,
-    __MIDL_ProcFormatString.Format,
-    &ICrossfireServerClass_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0,
-    0};
-CINTERFACE_PROXY_VTABLE(9) _ICrossfireServerClassProxyVtbl = 
-{
-    &ICrossfireServerClass_ProxyInfo,
-    &IID_ICrossfireServerClass,
-    IUnknown_QueryInterface_Proxy,
-    IUnknown_AddRef_Proxy,
-    IUnknown_Release_Proxy ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfoCount */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfo */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetIDsOfNames */ ,
-    0 /* IDispatch_Invoke_Proxy */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServerClass::GetServer */ ,
-    (void *) (INT_PTR) -1 /* ICrossfireServerClass::RemoveServer */
-};
-
-
-static const PRPC_STUB_FUNCTION ICrossfireServerClass_table[] =
-{
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    NdrStubCall2,
-    NdrStubCall2
-};
-
-CInterfaceStubVtbl _ICrossfireServerClassStubVtbl =
-{
-    &IID_ICrossfireServerClass,
-    &ICrossfireServerClass_ServerInfo,
-    9,
-    &ICrossfireServerClass_table[-3],
-    CStdStubBuffer_DELEGATING_METHODS
-};
-
-
-/* Object interface: IPendingBreakpoint, ver. 0.0,
-   GUID={0x56C1AD62,0x3E69,0x46BA,{0xBE,0x6D,0xE1,0xD2,0xA0,0xD8,0x8A,0xB5}} */
-
-#pragma code_seg(".orpc")
-static const unsigned short IPendingBreakpoint_FormatStringOffsetTable[] =
-    {
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    (unsigned short) -1,
-    0
-    };
-
-static const MIDL_STUBLESS_PROXY_INFO IPendingBreakpoint_ProxyInfo =
-    {
-    &Object_StubDesc,
-    __MIDL_ProcFormatString.Format,
-    &IPendingBreakpoint_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0
-    };
-
-
-static const MIDL_SERVER_INFO IPendingBreakpoint_ServerInfo = 
-    {
-    &Object_StubDesc,
-    0,
-    __MIDL_ProcFormatString.Format,
-    &IPendingBreakpoint_FormatStringOffsetTable[-3],
-    0,
-    0,
-    0,
-    0};
-CINTERFACE_PROXY_VTABLE(7) _IPendingBreakpointProxyVtbl = 
-{
-    0,
-    &IID_IPendingBreakpoint,
-    IUnknown_QueryInterface_Proxy,
-    IUnknown_AddRef_Proxy,
-    IUnknown_Release_Proxy ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfoCount */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfo */ ,
-    0 /* (void *) (INT_PTR) -1 /* IDispatch::GetIDsOfNames */ ,
-    0 /* IDispatch_Invoke_Proxy */
-};
-
-
-static const PRPC_STUB_FUNCTION IPendingBreakpoint_table[] =
-{
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION,
-    STUB_FORWARDING_FUNCTION
-};
-
-CInterfaceStubVtbl _IPendingBreakpointStubVtbl =
-{
-    &IID_IPendingBreakpoint,
-    &IPendingBreakpoint_ServerInfo,
-    7,
-    &IPendingBreakpoint_table[-3],
-    CStdStubBuffer_DELEGATING_METHODS
-};
-
-static const MIDL_STUB_DESC Object_StubDesc = 
-    {
-    0,
-    NdrOleAllocate,
-    NdrOleFree,
-    0,
-    0,
-    0,
-    0,
-    0,
-    __MIDL_TypeFormatString.Format,
-    1, /* -error bounds_check flag */
-    0x20000, /* Ndr library version */
-    0,
-    0x600016e, /* MIDL Version 6.0.366 */
-    0,
-    0,
-    0,  /* notify & notify_flag routine table */
-    0x1, /* MIDL flag */
-    0, /* cs routines */
-    0,   /* proxy/server info */
-    0   /* Reserved5 */
-    };
-
-const CInterfaceProxyVtbl * _IECrossfireServer_ProxyVtblList[] = 
-{
-    ( CInterfaceProxyVtbl *) &_ICrossfireServerProxyVtbl,
-    ( CInterfaceProxyVtbl *) &_IIEDebuggerProxyVtbl,
-    ( CInterfaceProxyVtbl *) &_IPendingBreakpointProxyVtbl,
-    ( CInterfaceProxyVtbl *) &_ICrossfireServerClassProxyVtbl,
-    ( CInterfaceProxyVtbl *) &_IJSEvalCallbackProxyVtbl,
-    0
-};
-
-const CInterfaceStubVtbl * _IECrossfireServer_StubVtblList[] = 
-{
-    ( CInterfaceStubVtbl *) &_ICrossfireServerStubVtbl,
-    ( CInterfaceStubVtbl *) &_IIEDebuggerStubVtbl,
-    ( CInterfaceStubVtbl *) &_IPendingBreakpointStubVtbl,
-    ( CInterfaceStubVtbl *) &_ICrossfireServerClassStubVtbl,
-    ( CInterfaceStubVtbl *) &_IJSEvalCallbackStubVtbl,
-    0
-};
-
-PCInterfaceName const _IECrossfireServer_InterfaceNamesList[] = 
-{
-    "ICrossfireServer",
-    "IIEDebugger",
-    "IPendingBreakpoint",
-    "ICrossfireServerClass",
-    "IJSEvalCallback",
-    0
-};
-
-const IID *  _IECrossfireServer_BaseIIDList[] = 
-{
-    &IID_IDispatch,
-    0,
-    &IID_IDispatch,
-    &IID_IDispatch,
-    0,
-    0
-};
-
-
-#define _IECrossfireServer_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _IECrossfireServer, pIID, n)
-
-int __stdcall _IECrossfireServer_IID_Lookup( const IID * pIID, int * pIndex )
-{
-    IID_BS_LOOKUP_SETUP
-
-    IID_BS_LOOKUP_INITIAL_TEST( _IECrossfireServer, 5, 4 )
-    IID_BS_LOOKUP_NEXT_TEST( _IECrossfireServer, 2 )
-    IID_BS_LOOKUP_NEXT_TEST( _IECrossfireServer, 1 )
-    IID_BS_LOOKUP_RETURN_RESULT( _IECrossfireServer, 5, *pIndex )
-    
-}
-
-const ExtendedProxyFileInfo IECrossfireServer_ProxyFileInfo = 
-{
-    (PCInterfaceProxyVtblList *) & _IECrossfireServer_ProxyVtblList,
-    (PCInterfaceStubVtblList *) & _IECrossfireServer_StubVtblList,
-    (const PCInterfaceName * ) & _IECrossfireServer_InterfaceNamesList,
-    (const IID ** ) & _IECrossfireServer_BaseIIDList,
-    & _IECrossfireServer_IID_Lookup, 
-    5,
-    2,
-    0, /* table of [async_uuid] interfaces */
-    0, /* Filler1 */
-    0, /* Filler2 */
-    0  /* Filler3 */
-};
-#pragma optimize("", on )
-#if _MSC_VER >= 1200
-#pragma warning(pop)
-#endif
-
-
-#endif /* !defined(_M_IA64) && !defined(_M_AMD64)*/
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerps.def b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerps.def
deleted file mode 100644
index 2382c68..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerps.def
+++ /dev/null
@@ -1,20 +0,0 @@
-; *******************************************************************************
-; * Copyright (c) 2011 IBM Corporation and others.
-; * All rights reserved. This program and the accompanying materials
-; * are made available under the terms of the Eclipse Public License v1.0
-; * which accompanies this distribution, and is available at
-; * http://www.eclipse.org/legal/epl-v10.html
-; *
-; * Contributors:
-; *     IBM Corporation - initial API and implementation
-; *******************************************************************************
-
-
-LIBRARY      "OutOfProcessControllerPS"
-
-EXPORTS
-	DllGetClassObject       PRIVATE
-	DllCanUnloadNow         PRIVATE
-	GetProxyDllInfo         PRIVATE
-	DllRegisterServer		PRIVATE
-	DllUnregisterServer		PRIVATE
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.cpp
deleted file mode 100644
index 792822c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.cpp
+++ /dev/null
@@ -1,336 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "IEDebugger.h"
-
-/* event: onBreak */
-const wchar_t* IEDebugger::EVENT_ONBREAK = L"onBreak";
-const wchar_t* IEDebugger::KEY_LINE = L"line";
-const wchar_t* IEDebugger::KEY_URL = L"url";
-
-/* event: onConsoleError */
-const wchar_t* IEDebugger::EVENT_ONCONSOLEERROR = L"onConsoleError";
-const wchar_t* IEDebugger::KEY_FILENAME = L"fileName";
-const wchar_t* IEDebugger::KEY_LINENUMBER = L"lineNumber";
-const wchar_t* IEDebugger::KEY_MESSAGE = L"message";
-const wchar_t* IEDebugger::KEY_NAME = L"name";
-const wchar_t* IEDebugger::KEY_SOURCE = L"source";
-const wchar_t* IEDebugger::KEY_STACK = L"stack";
-
-/* event: onConsoleLog */
-const wchar_t* IEDebugger::EVENT_ONCONSOLELOG = L"onConsoleLog";
-
-/* event: onResume */
-const wchar_t* IEDebugger::EVENT_ONRESUME = L"onResume";
-
-/* event: onScript */
-const wchar_t* IEDebugger::EVENT_ONSCRIPT = L"onScript";
-const wchar_t* IEDebugger::KEY_CONTEXTHREF = L"context_href";
-const wchar_t* IEDebugger::KEY_HREF = L"href";
-
-
-IEDebugger::IEDebugger() {
-	m_context = NULL;
-	m_adviseCookies = new std::multimap<std::wstring, DWORD>;
-}
-
-IEDebugger::~IEDebugger() {
-	delete m_adviseCookies;
-}
-
-/* IApplicationDebugger */
-
-STDMETHODIMP IEDebugger::QueryAlive(void) {
-	Logger::log("QueryAlive invoked");
-    return S_OK;
-}
-
-STDMETHODIMP IEDebugger::CreateInstanceAtDebugger(REFCLSID rclsid, IUnknown *pUnkOuter, DWORD dwClsContext, REFIID riid, IUnknown **ppvObject) {
-	Logger::log("CreateInstanceAtDebugger invoked");
-    return E_NOTIMPL;
-}
-
-STDMETHODIMP IEDebugger::onDebugOutput(LPCOLESTR pstr) {
-	CrossfireEvent onConsoleLogEvent;
-	onConsoleLogEvent.setName(EVENT_ONCONSOLELOG);
-	Value data;
-	data.addObjectValue(L"0", &Value(pstr));
-	onConsoleLogEvent.setData(&data);
-	m_context->sendEvent(&onConsoleLogEvent);
-	return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onHandleBreakPoint(IRemoteDebugApplicationThread *pDebugAppThread, BREAKREASON br, IActiveScriptErrorDebug *pScriptErrorDebug) {
-	m_context->setRunning(false);
-
-	if (br == BREAKREASON_ERROR) {
-		return handleError(pScriptErrorDebug);
-	}
-
-	CComPtr<IEnumDebugStackFrames> stackFrames = NULL;
-	HRESULT hr = pDebugAppThread->EnumStackFrames(&stackFrames);
-	if (FAILED(hr)) {
-		Logger::error("'onHandleBreakPoint' EnumStackFrames() failed", hr);
-		return S_OK;
-	}
-
-	DebugStackFrameDescriptor stackFrameDescriptor;
-	ULONG numFetched = 0;
-	hr = stackFrames->Next(1,&stackFrameDescriptor,&numFetched);
-	if (FAILED(hr) || numFetched != 1) {
-		Logger::error("'onHandleBreakPoint' EnumStackFrames->Next() failed", hr);
-		return S_OK;
-	}
-
-	IDebugStackFrame* frame = stackFrameDescriptor.pdsf;
-	CComPtr<IDebugCodeContext> codeContext = NULL;
-	hr = frame->GetCodeContext(&codeContext);
-	// TODO This fails if the current position is not in a user document (eg.- following
-	// a return).  Not sure what to do here (send an event with no url/line?  Or no event?)
-	if (FAILED(hr)) {
-		Logger::error("'onHandleBreakPoint' GetCodeContext() failed", hr);
-		return S_OK;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = codeContext->GetDocumentContext(&documentContext);
-	if (FAILED(hr)) {
-		Logger::error("'onHandleBreakPoint' GetDocumentContext() failed", hr);
-		return S_OK;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	hr = documentContext->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("'onHandleBreakPoint' GetDocument() failed", hr);
-		return S_OK;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText,(void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("'onHandleBreakPoint' QueryInterface() failed", hr);
-		return S_OK;
-	}
-
-	ULONG position, numChars;
-	hr = documentText->GetPositionOfContext(documentContext, &position, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("'onHandleBreakPoint' GetPositionOfContext() failed", hr);
-		return S_OK;
-	}
-
-	ULONG lineNumber, column;
-	hr = documentText->GetLineOfPosition(position, &lineNumber, &column);
-	if (FAILED(hr)) {
-		Logger::error("'onHandleBreakPoint' GetLineOfContext() failed", hr);
-		return S_OK;
-	}
-
-	CComBSTR bstrUrl;
-	hr = document->GetName(DOCUMENTNAMETYPE_URL, &bstrUrl);
-	if (FAILED(hr)) {
-		Logger::error("'onHandleBreakPoint' GetName() failed", hr);
-		return S_OK;
-	}
-
-	/* Evaluate the the hit breakpoint's condition if it has one. */
-	if (br == BREAKREASON_BREAKPOINT) {
-
-	}
-
-	CrossfireEvent onBreakEvent;
-	onBreakEvent.setName(EVENT_ONBREAK);
-	Value data;
-	data.addObjectValue(KEY_LINE, &Value((double)lineNumber + 1));
-	data.addObjectValue(KEY_URL, &Value(bstrUrl));
-	onBreakEvent.setData(&data);
-	m_context->sendEvent(&onBreakEvent);
-	return S_OK;
-}
-
-HRESULT IEDebugger::handleError(IActiveScriptErrorDebug *pScriptErrorDebug) {
-	Value error;
-	CComBSTR sourceLine = NULL;
-	if (SUCCEEDED(pScriptErrorDebug->GetSourceLineText(&sourceLine))) {
-		error.addObjectValue(KEY_SOURCE, &Value(sourceLine));
-	} else {
-		error.addObjectValue(KEY_SOURCE, &Value(L"")); // TODO should this just be omitted?
-	}
-
-	EXCEPINFO excepInfo;
-	HRESULT hr = pScriptErrorDebug->GetExceptionInfo(&excepInfo);
-	if (FAILED(hr)) {
-		Logger::error("handleError GetExceptionInfo() failed", hr);
-		return S_OK;
-	}
-
-	if (excepInfo.bstrDescription) {
-		error.addObjectValue(KEY_NAME, &Value(excepInfo.bstrDescription));
-		error.addObjectValue(KEY_MESSAGE, &Value(excepInfo.bstrDescription)); // TODO can do better than this?
-	} else {
-		error.addObjectValue(KEY_NAME, &Value(L"")); // TODO should these just be omitted?
-		error.addObjectValue(KEY_MESSAGE, &Value(L"")); // TODO can do better than this?
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = pScriptErrorDebug->GetDocumentContext(&documentContext);
-	if (SUCCEEDED(hr)) {
-		CComPtr<IDebugDocument> document = NULL;
-		hr = documentContext->GetDocument(&document);
-		if (SUCCEEDED(hr)) {
-			CComBSTR bstrUrl;
-			hr = document->GetName(DOCUMENTNAMETYPE_URL, &bstrUrl);
-			if (SUCCEEDED(hr)) {
-				error.addObjectValue(KEY_FILENAME, &Value(bstrUrl));
-			}
-		}
-	}
-	if (FAILED(hr)) {			
-		/* fall back to trying the excepInfo struct */
-		if (excepInfo.bstrSource) {
-			error.addObjectValue(KEY_FILENAME, &Value(excepInfo.bstrSource));
-		} else {
-			error.addObjectValue(KEY_FILENAME, &Value(L"")); // TODO should this just be omitted?
-		}
-	}
-
-	DWORD sourceContext;
-	ULONG lineNumber;
-	LONG charPosition;
-	hr = pScriptErrorDebug->GetSourcePosition(&sourceContext, &lineNumber, &charPosition);
-	if (FAILED(hr)) {
-		Logger::error("handleError GetSourcePosition() failed", hr);
-		return S_OK;
-	}
-	error.addObjectValue(KEY_LINENUMBER, &Value((double)lineNumber));
-	Logger::error("scode", excepInfo.scode);
-	Logger::error("wcode", excepInfo.wCode);
-
-	CrossfireEvent onConsoleErrorEvent;
-	onConsoleErrorEvent.setName(EVENT_ONCONSOLEERROR);
-	Value data;
-	data.addObjectValue(L"0", &error);
-	onConsoleErrorEvent.setData(&data);
-	m_context->sendEvent(&onConsoleErrorEvent);
-	return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onClose(void) {
-	Logger::log("onClose invoked");
-	return E_NOTIMPL;
-}
-
-STDMETHODIMP IEDebugger::onDebuggerEvent(REFIID riid, IUnknown *punk) {
-	Logger::log("onDebuggerEvent invoked");
-    return E_NOTIMPL;
-}
-
-/* IApplicationDebuggerUI */
-
-STDMETHODIMP IEDebugger::BringDocumentToTop(IDebugDocumentText *pddt) {
-	Logger::log("BringDocumentToTop invoked");
-    return S_OK;
-}
-
-STDMETHODIMP IEDebugger::BringDocumentContextToTop(IDebugDocumentContext *pddc) {
-	Logger::log("BringDocumentContextToTop invoked");
-    return S_OK;
-}
-
-/* IDebugApplicationNodeEvents */
-
-STDMETHODIMP IEDebugger::onAddChild(IDebugApplicationNode *prddpChild) {
-	CComBSTR url = NULL;
-	if (FAILED(prddpChild->GetName(DOCUMENTNAMETYPE_URL, &url))) {
-		return S_OK;
-	}
-
-	m_context->scriptLoaded(&std::wstring(url), prddpChild, false);
-
-	CComPtr <IConnectionPointContainer> connectionPointContainer = NULL;
-	HRESULT hr = prddpChild->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.onAddChild failed to QI for IID_IConnectionPointContainer", hr);
-		return S_FALSE;
-	}
-	CComPtr <IConnectionPoint> nodeConnectionPoint = NULL;
-	hr = connectionPointContainer->FindConnectionPoint(IID_IDebugApplicationNodeEvents, &nodeConnectionPoint);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.onAddChild FindConnectionPoint failed", hr);
-		return S_FALSE;
-	}
-
-	DWORD connectionPointCookie = 0;
-	hr = nodeConnectionPoint->Advise(static_cast<IIEDebugger*>(this), &connectionPointCookie);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.onAddChild Advise failed", hr);
-		return S_FALSE;
-	}
-	m_adviseCookies->insert(std::pair<std::wstring,DWORD>(std::wstring(url), connectionPointCookie));
-	return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onRemoveChild(IDebugApplicationNode *prddpChild) {
-	CComBSTR url = NULL;
-	if (FAILED(prddpChild->GetName(DOCUMENTNAMETYPE_URL, &url))) {
-		return S_OK;
-	}
-
-	CComPtr <IConnectionPointContainer> connectionPointContainer = NULL;
-	HRESULT hr = prddpChild->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.onRemoveChild() failed to QI for IID_IConnectionPointContainer", hr);
-		return S_FALSE;
-	}
-	CComPtr <IConnectionPoint> nodeConnectionPoint = NULL;
-	hr = connectionPointContainer->FindConnectionPoint(IID_IDebugApplicationNodeEvents,&nodeConnectionPoint);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.onRemoveChild() FindConnectionPoint failed", hr);
-		return S_FALSE;
-	}
-
-	std::pair<std::multimap<std::wstring,DWORD>::iterator,std::multimap<std::wstring,DWORD>::iterator> range;
-	range = m_adviseCookies->equal_range(std::wstring(url));
-	std::multimap<std::wstring,DWORD>::iterator it;
-	for (it = range.first; it != range.second; ++it) {
-		if (SUCCEEDED(nodeConnectionPoint->Unadvise(it->second))) {
-			m_adviseCookies->erase(it);
-			break;
-		}
-	}
-
-	return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onDetach(void) {
-    return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onAttach(IDebugApplicationNode *prddpParent) {
-    return S_OK;
-}
-
-/* IDebugSessionProvider */
-
-STDMETHODIMP IEDebugger::StartDebugSession(IRemoteDebugApplication *pda) {
-	Logger::log("StartDebugSession invoked");
-    return S_OK;
-}
-
-/* IEDebugger */
-
-void IEDebugger::setContext(CrossfireContext* value) {
-	m_context = value;
-}
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.h
deleted file mode 100644
index 80c46d0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "activdbg.h"
-#include "CrossfireContext.h"
-#include "Logger.h"
-
-class ATL_NO_VTABLE IEDebugger :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<IEDebugger, &CLSID_IEDebugger>,
-	public IApplicationDebugger,
-    public IApplicationDebuggerUI,
-    public IDebugApplicationNodeEvents,
-	public IDebugSessionProvider,
-	public IIEDebugger {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_IEDEBUGGER)
-	BEGIN_COM_MAP(IEDebugger)
-		COM_INTERFACE_ENTRY2(IUnknown, IApplicationDebugger)
-		COM_INTERFACE_ENTRY(IIEDebugger)
-		COM_INTERFACE_ENTRY(IApplicationDebugger)
-		COM_INTERFACE_ENTRY(IApplicationDebuggerUI)
-		COM_INTERFACE_ENTRY(IDebugApplicationNodeEvents)
-		COM_INTERFACE_ENTRY(IDebugSessionProvider)
-		COM_INTERFACE_ENTRY(IIEDebugger)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	IEDebugger();
-	~IEDebugger();
-
-	/* interface definitions from activdbg.h */
-
-    /* IApplicationDebugger */
-    virtual HRESULT STDMETHODCALLTYPE QueryAlive();
-    virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtDebugger( 
-        /* [in] */ REFCLSID rclsid,
-        /* [in] */ IUnknown *pUnkOuter,
-        /* [in] */ DWORD dwClsContext,
-        /* [in] */ REFIID riid,
-        /* [iid_is][out] */ IUnknown **ppvObject);
-    virtual HRESULT STDMETHODCALLTYPE onDebugOutput( 
-        /* [in] */ LPCOLESTR pstr);
-    virtual HRESULT STDMETHODCALLTYPE onHandleBreakPoint( 
-        /* [in] */ IRemoteDebugApplicationThread *prpt,
-        /* [in] */ BREAKREASON br,
-        /* [in] */ IActiveScriptErrorDebug *pError);
-    virtual HRESULT STDMETHODCALLTYPE onClose();
-    virtual HRESULT STDMETHODCALLTYPE onDebuggerEvent( 
-        /* [in] */ REFIID riid,
-        /* [in] */ IUnknown *punk);
-
-    /* IApplicationDebuggerUI */
-    virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop( 
-        /* [in] */ IDebugDocumentText *pddt);
-    virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop( 
-        /* [in] */ IDebugDocumentContext *pddc);
-
-    /* IDebugApplicationNodeEvents */
-    virtual HRESULT STDMETHODCALLTYPE onAddChild( 
-        /* [in] */ IDebugApplicationNode *prddpChild);
-    virtual HRESULT STDMETHODCALLTYPE onRemoveChild( 
-        /* [in] */ IDebugApplicationNode *prddpChild);
-    virtual HRESULT STDMETHODCALLTYPE onDetach();
-    virtual HRESULT STDMETHODCALLTYPE onAttach( 
-        /* [in] */ IDebugApplicationNode *prddpParent);
-
-	/* IDebugSessionProvider */
-    virtual HRESULT STDMETHODCALLTYPE StartDebugSession( 
-        /* [in] */ IRemoteDebugApplication *pda);
-
-	/* IEDebugger */
-	virtual void setContext(CrossfireContext* value);
-
-private:
-	CrossfireContext* m_context;
-	std::multimap<std::wstring, DWORD>* m_adviseCookies;
-	
-	/* event: onBreak */
-	static const wchar_t* EVENT_ONBREAK;
-	static const wchar_t* KEY_LINE;
-	static const wchar_t* KEY_URL;
-	virtual HRESULT handleError(IActiveScriptErrorDebug *pScriptErrorDebug);
-
-	/* event: onConsoleError */
-	static const wchar_t* EVENT_ONCONSOLEERROR;
-	static const wchar_t* KEY_FILENAME;
-	static const wchar_t* KEY_LINENUMBER;
-	static const wchar_t* KEY_MESSAGE;
-	static const wchar_t* KEY_NAME;
-	static const wchar_t* KEY_SOURCE;
-	static const wchar_t* KEY_STACK;
-
-	/* event: onConsoleLog */
-	static const wchar_t* EVENT_ONCONSOLELOG;
-
-	/* event: onResume */
-	static const wchar_t* EVENT_ONRESUME;
-
-	/* event: onScript */
-	static const wchar_t* EVENT_ONSCRIPT;
-	static const wchar_t* KEY_CONTEXTHREF;
-	static const wchar_t* KEY_HREF;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(IEDebugger), IEDebugger)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.rgs
deleted file mode 100644
index 8d61801..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.rgs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR
-{
-	IECrossfireServer.IEDebugger.1 = s 'IEDebugger Class'
-	{
-		CLSID = s '{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}'
-	}
-	IECrossfireServer.IEDebugger = s 'IEDebugger Class'
-	{
-		CLSID = s '{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}'
-		CurVer = s 'IECrossfireServer.IEDebugger.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {B63BD92F-6C66-4AB2-A243-D5AFCCF4B587} = s 'IEDebugger Class'
-		{
-			ProgID = s 'IECrossfireServer.IEDebugger.1'
-			VersionIndependentProgID = s 'IECrossfireServer.IEDebugger'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.cpp
deleted file mode 100644
index cadb413..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "JSEvalCallback.h"
-
-JSEvalCallback::JSEvalCallback() {
-}
-
-JSEvalCallback::~JSEvalCallback() {
-}
-
-void JSEvalCallback::init(CrossfireResponse* response, IDebugExpression* expression) {
-	m_response = response;
-	m_expression = expression;
-}
-
-STDMETHODIMP JSEvalCallback::onComplete(void) {
-	HRESULT innerHR;
-	IDebugProperty* result = NULL;
-	HRESULT hr = m_expression->GetResultAsDebugProperty(&innerHR, &result);
-	// TODO
-	return S_OK;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.h
deleted file mode 100644
index 141287e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "activdbg.h"
-#include "resource.h"
-#include "CrossfireResponse.h"
-#include "IECrossfireServer.h"
-#include "Logger.h"
-
-class ATL_NO_VTABLE JSEvalCallback :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<JSEvalCallback, &CLSID_JSEvalCallback>,
-//	public IJSEvalCallback,
-	public IDebugExpressionCallBack {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_JSEVALCALLBACK)
-	DECLARE_NOT_AGGREGATABLE(JSEvalCallback)
-	BEGIN_COM_MAP(JSEvalCallback)
-		COM_INTERFACE_ENTRY2(IUnknown, IDebugExpressionCallBack)
-//		COM_INTERFACE_ENTRY(IJSEvalCallback)
-		COM_INTERFACE_ENTRY(IDebugExpressionCallBack)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	JSEvalCallback();
-	~JSEvalCallback();
-
-	/* IDebugExpressionCallBack */
-	virtual HRESULT STDMETHODCALLTYPE onComplete();
-
-	/* JSEvalCallback */
-	virtual void init(CrossfireResponse* response, IDebugExpression* expression);
-
-private:
-	IDebugExpression* m_expression;
-	CrossfireResponse* m_response;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(JSEvalCallback), JSEvalCallback)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.rgs
deleted file mode 100644
index 506e81e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.rgs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR
-{
-	IECrossfireServer.JSEvalCallback.1 = s 'JSEvalCallback Class'
-	{
-		CLSID = s '{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}'
-	}
-	IECrossfireServer.JSEvalCallback = s 'JSEvalCallback Class'
-	{
-		CLSID = s '{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}'
-		CurVer = s 'IECrossfireServer.JSEvalCallback.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7} = s 'JSEvalCallback Class'
-		{
-			ProgID = s 'IECrossfireServer.JSEvalCallback.1'
-			VersionIndependentProgID = s 'IECrossfireServer.JSEvalCallback'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.cpp
deleted file mode 100644
index 2de24d0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.cpp
+++ /dev/null
@@ -1,501 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "JSONParser.h"
-
-/* initialize statics */
-const wchar_t* JSONParser::VALUE_NULL = L"null";
-const wchar_t* JSONParser::VALUE_TRUE = L"true";
-const wchar_t* JSONParser::VALUE_FALSE = L"false";
-
-JSONParser::JSONParser(void) {
-}
-
-JSONParser::~JSONParser(void) {
-}
-
-void JSONParser::parse(std::wstring* jsonString, Value** _value) {
-	*_value = NULL;
-
-	std::wstringstream jsonStream(*jsonString);
-	parse(&jsonStream, _value);
-}
-
-void JSONParser::parse(std::wstringstream* jsonStream, Value** _value) {
-	*_value = NULL;
-
-	skipWhitespace(jsonStream);
-	wchar_t firstChar = jsonStream->peek();
-	if (firstChar == wchar_t('n')) {
-		size_t length = wcslen(VALUE_NULL);
-		wchar_t* streamChars = new wchar_t[length];
-		jsonStream->read(streamChars, (std::streamsize)length);
-		if (wcsncmp(VALUE_NULL, streamChars, length) == 0) {
-			*_value = new Value();
-			(*_value)->setType(TYPE_NULL);
-		} else {
-			Logger::error("JSON string has invalid value that starts with 'n' but is not \"null\"");
-		}
-		delete[] streamChars;
-		return;
-	}
-	if (firstChar == wchar_t('t')) {
-		size_t length = wcslen(VALUE_TRUE);
-		wchar_t* streamChars = new wchar_t[length];
-		jsonStream->read(streamChars, (std::streamsize)length);
-		if (wcsncmp(VALUE_TRUE, streamChars, length) == 0) {
-			Value* result = new Value(true);
-			*_value = result;
-		} else {
-			Logger::error("JSON string has invalid value that starts with 't' but is not \"true\"");
-		}
-		delete[] streamChars;
-		return;
-	}
-	if (firstChar == wchar_t('f')) {
-		size_t length = wcslen(VALUE_FALSE);
-		wchar_t* streamChars = new wchar_t[length];
-		jsonStream->read(streamChars, (std::streamsize)length);
-		if (wcsncmp(VALUE_FALSE, streamChars, length) == 0) {
-			Value* result = new Value(false);
-			*_value = result;
-		} else {
-			Logger::error("JSON string has invalid value that starts with 'f' but is not \"false\"");
-		}
-		delete[] streamChars;
-		return;
-	}
-	if (firstChar == wchar_t('\"')) {
-		std::wstring* stringValue = NULL;
-		parseString(jsonStream, &stringValue);
-		if (stringValue) {
-			Value* result = new Value(stringValue);
-			*_value = result;
-			delete stringValue;
-		} else {
-			/* parseString() already logs a detailed error message, so no error logged here */
-		}
-		return;
-	}
-
-	int index = 0;
-	switch (firstChar) {
-		case wchar_t('0'):
-		case wchar_t('1'):
-		case wchar_t('2'):
-		case wchar_t('3'):
-		case wchar_t('4'):
-		case wchar_t('5'):
-		case wchar_t('6'):
-		case wchar_t('7'):
-		case wchar_t('8'):
-		case wchar_t('9'):
-		case wchar_t('-'): {
-			double doubleValue = parseNumber(jsonStream);
-			if (doubleValue == -DBL_MAX) {
-				Logger::error("JSON string has a Number value with invalid character(s)");
-				return;
-			}
-			Value* result = new Value(doubleValue);
-			*_value = result;
-			return;
-		}
-	}
-	
-	if (firstChar == wchar_t('[')) {
-		parseArray(jsonStream, _value);
-		return;
-	}
-
-	if (firstChar == wchar_t('{')) {
-		parseObject(jsonStream, _value);
-		return;
-	}
-}
-
-void JSONParser::parseArray(std::wstringstream* jsonStream, Value** _value) {
-	*_value = NULL;
-
-	Value* result = new Value();
-	result->setType(TYPE_ARRAY);
-
-	jsonStream->ignore(1);
-	skipWhitespace(jsonStream);
-	if (jsonStream->peek() == wchar_t(']')) {
-		jsonStream->ignore(1);
-		*_value = result;
-		return;
-	}
-
-	while (true) {
-		Value* currentValue = NULL;
-		parse(jsonStream, &currentValue);
-		if (!currentValue) {
-			delete result;
-			return;
-		}
-		result->addArrayValue(currentValue);
-		delete currentValue;
-
-		skipWhitespace(jsonStream);
-		wchar_t nextChar = jsonStream->peek();
-		if (nextChar == wchar_t(',')) {
-			jsonStream->ignore(1);
-			skipWhitespace(jsonStream);
-			continue;
-		}
-		if (nextChar == wchar_t(']')) {
-			jsonStream->ignore(1);
-			*_value = result;
-		} else {
-			Logger::error("JSON string has an array without expected closing ']'");
-			delete result;
-		}
-		return;
-	}
-}
-
-double JSONParser::parseNumber(std::wstringstream* jsonStream) {
-	int count = 0;
-	bool looking = true;
-	bool nonZeroEncountered = false;
-	wchar_t currentChar = jsonStream->peek();
-	while (looking) {
-		if (jsonStream->eof()) {
-			looking = false;
-			break;
-		}
-		switch (currentChar) {
-			case wchar_t('1'):
-			case wchar_t('2'):
-			case wchar_t('3'):
-			case wchar_t('4'):
-			case wchar_t('5'):
-			case wchar_t('6'):
-			case wchar_t('7'):
-			case wchar_t('8'):
-			case wchar_t('9'):
-			case wchar_t('-'):
-			case wchar_t('+'):
-			case wchar_t('e'):
-			case wchar_t('E'): {
-				nonZeroEncountered = true;
-			}
-			// FALL THROUGH
-			case wchar_t('0'):
-			case wchar_t('.'): {
-				jsonStream->ignore(1);
-				count++;
-				break;
-			}
-			default: {
-				looking = false;
-				break;
-			}
-		}
-		currentChar = jsonStream->peek();
-	}
-	for (int i = 0; i < count; i++) {
-		jsonStream->unget();
-	}
-
-	wchar_t* numberChars = new wchar_t[count + 1];
-	jsonStream->read(numberChars, count);
-	numberChars[count] = wchar_t('\0');
-	wchar_t* endPoint;
-	double numberValue = wcstod(numberChars, &endPoint);
-	delete[] numberChars;
-	if (numberValue == 0 && nonZeroEncountered) {
-		return -DBL_MAX;
-	}
-	return numberValue;
-}
-
-void JSONParser::parseObject(std::wstringstream* jsonStream, Value** _value) {
-	*_value = NULL;
-
-	Value* result = new Value();
-	result->setType(TYPE_OBJECT);
-
-	jsonStream->ignore(1);
-	skipWhitespace(jsonStream);
-	if (jsonStream->peek() == wchar_t('}')) {
-		jsonStream->ignore(1);
-		*_value = result;
-		return;
-	}
-
-	while (true) {
-		if (jsonStream->peek() != wchar_t('\"')) {
-			Logger::error("JSON string has an object with a non-String key value");
-			delete result;
-			return;
-		}
-		std::wstring* key = NULL;
-		parseString(jsonStream, &key);
-		skipWhitespace(jsonStream);
-		if (jsonStream->get() != wchar_t(':')) {
-			Logger::error("JSON string has an object without a ':' separating a key from its _value");
-			delete key;
-			delete result;
-			return;
-		}
-		Value* assocValue = NULL;
-		skipWhitespace(jsonStream);
-		parse(jsonStream, &assocValue);
-		if (!assocValue) {
-			delete key;
-			delete result;
-			return;
-		}
-		bool success = result->addObjectValue(key, assocValue);
-		delete assocValue;
-		delete key;
-		if (!success) {
-			Logger::error("JSON string has an object with a duplicate key");
-			delete result;
-			return;
-		}
-
-		skipWhitespace(jsonStream);
-		wchar_t nextChar = jsonStream->peek();
-		if (nextChar == wchar_t(',')) {
-			jsonStream->ignore(1);
-			skipWhitespace(jsonStream);
-			continue;
-		}
-		if (nextChar == wchar_t('}')) {
-			jsonStream->ignore(1);
-			*_value = result;
-		} else {
-			Logger::error("JSON string has an object without an expected closing '}'");
-			delete result;
-		}
-		return;
-	}
-}
-
-void JSONParser::parseString(std::wstringstream* jsonStream, std::wstring** _value) {
-	*_value = NULL;
-
-	std::wstring* result = new std::wstring;
-	jsonStream->ignore(1);
-	const wchar_t charBackslash = wchar_t('\\');
-	wchar_t charQuote = wchar_t('\"');
-	wchar_t currentChar = NULL;
-	jsonStream->read(&currentChar, 1);
-	while (currentChar != charQuote) {
-		if (jsonStream->eof()) {
-			Logger::error("JSON string has string value that does not end");
-			return;
-		}
-		if (currentChar == charBackslash) {
-			jsonStream->read(&currentChar, 1);
-			if (jsonStream->eof()) {
-				Logger::error("JSON string has string value that does not end");
-				return;
-			}
-			switch (currentChar) {
-				case wchar_t('\"'):
-				case wchar_t('/'):
-				case charBackslash: {
-					result->push_back(currentChar);
-					break;
-				}
-				case wchar_t('b'): {
-					result->push_back(wchar_t('\b'));
-					break;
-				}
-				case wchar_t('f'): {
-					result->push_back(wchar_t('\f'));
-					break;
-				}
-				case wchar_t('n'): {
-					result->push_back(wchar_t('\n'));
-					break;
-				}
-				case wchar_t('r'): {
-					result->push_back(wchar_t('\r'));
-					break;
-				}
-				case wchar_t('t'): {
-					result->push_back(wchar_t('\t'));
-					break;
-				}
-				case wchar_t('u'): {
-					Logger::log("FYI: unicode value encountered, not parsed, still //TODO");
-					// TODO
-					break;
-				}
-				default: {
-					Logger::error("JSON string has string value with an invalid escape sequence");
-					return;
-				}
-			}
-		} else {
-			result->push_back(currentChar);
-		}
-		jsonStream->read(&currentChar, 1);
-	}
-
-	*_value = result;
-}
-
-void JSONParser::skipWhitespace(std::wstringstream* jsonStream) {
-	wchar_t current = jsonStream->peek();
-	while (current == wchar_t(' ') || current == wchar_t('\r') || current == wchar_t('\n') || current == wchar_t('\t')) {
-		jsonStream->ignore(1);
-		current = jsonStream->peek();
-	}
-}
-
-void JSONParser::stringify(Value* value, std::wstring** _jsonString) {
-	switch (value->getType()) {
-		case TYPE_NULL: {
-			std::wstring* result = new std::wstring;
-			result->assign(VALUE_NULL);
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_BOOLEAN: {
-			std::wstring* result = new std::wstring;
-			result->assign(value->getBooleanValue() ? VALUE_TRUE : VALUE_FALSE);
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_NUMBER: {
-			std::wstring* result = new std::wstring;
-			std::wstringstream stringStream;
-			stringStream << value->getNumberValue();
-			result->assign(stringStream.str());
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_STRING: {
-			static const wchar_t char_quote('\"');
-			static const wchar_t char_backslash('\\');
-			static const wchar_t char_forwardslash('/');
-			static const wchar_t char_backspace('\b');
-			static const wchar_t char_formfeed('\f');
-			static const wchar_t char_newline('\n');
-			static const wchar_t char_cr('\r');
-			static const wchar_t char_tab('\t');
-
-			std::wstring* source = value->getStringValue();
-			size_t length = source->length();
-			wchar_t* chars = (wchar_t*)source->c_str();
-
-			std::wstringstream stringStream;
-			stringStream << char_quote;
-			for (size_t i = 0; i < length; i++) {
-				switch (chars[i]) {
-					case char_quote:
-					case char_backslash:
-					case char_forwardslash: {
-						stringStream << char_backslash;
-						stringStream << chars[i];
-						break;
-					}
-					case char_backspace: {
-						stringStream << "\\b";
-						break;
-					}
-					case char_formfeed: {
-						stringStream << "\\f";
-						break;
-					}
-					case char_newline: {
-						stringStream << "\\n";
-						break;
-					}
-					case char_cr: {
-						stringStream << "\\r";
-						break;
-					}
-  					case char_tab: {
-						stringStream << "\\t";
-						break;
-					}
-					default: {
-						stringStream << chars[i];
-						break;
-					}
-				}
-			}
-			stringStream << char_quote;
-
-			std::wstring* result = new std::wstring;
-			result->assign(stringStream.str());
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_ARRAY: {
-			Value** arrayValues = NULL;
-			value->getArrayValues(&arrayValues);
-			std::wstring* result = new std::wstring;
-			result->push_back(wchar_t('['));
-			int index = 0;
-			Value* currentValue = arrayValues[index];
-			while (currentValue) {
-				std::wstring* serializedValue = NULL;
-				stringify(currentValue, &serializedValue);
-				result->append(*serializedValue);
-				result->push_back(wchar_t(','));
-				delete serializedValue;
-				currentValue = arrayValues[++index];
-			}
-			delete[] arrayValues;
-
-			if (index > 0) {
-				result->erase(result->end() - 1);
-			}
-			result->push_back(wchar_t(']'));
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_OBJECT: {
-			std::wstring** objectKeys = NULL;
-			Value** objectValues = NULL;
-			value->getObjectValues(&objectKeys, &objectValues);
-			std::wstring* result = new std::wstring;
-			result->push_back(wchar_t('{'));
-			int index = 0;
-			std::wstring* currentKey = objectKeys[index];
-			while (currentKey) {
-				result->push_back(wchar_t('\"'));
-				result->append(*currentKey);
-				result->push_back(wchar_t('\"'));
-				result->push_back(wchar_t(':'));
-				std::wstring* serializedValue = NULL;
-				stringify(objectValues[index], &serializedValue);
-				result->append(*serializedValue);
-				result->push_back(wchar_t(','));
-				delete serializedValue;
-				currentKey = objectKeys[++index];
-			}
-			delete[] objectValues;
-			delete[] objectKeys;
-
-			if (index > 0) {
-				result->erase(result->end() - 1);
-			}
-			result->push_back(wchar_t('}'));
-			*_jsonString = result;
-			break;
-		}
-		default: {
-			*_jsonString = NULL;
-			break;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.h
deleted file mode 100644
index c02ae85..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <float.h>
-
-#include "Value.h"
-#include "Logger.h"
-
-class JSONParser {
-
-public:
-	JSONParser();
-	~JSONParser();
-	virtual void parse(std::wstring* jsonString, Value** _value);
-	virtual void stringify(Value* value, std::wstring** _jsonString);
-
-private:
-	virtual void parse(std::wstringstream* jsonStream, Value** _value);
-	virtual void parseArray(std::wstringstream* jsonStream, Value** _value);
-	virtual double parseNumber(std::wstringstream* jsonStream);
-	virtual void parseObject(std::wstringstream* jsonStream, Value** _value);
-	virtual void parseString(std::wstringstream* jsonStream, std::wstring** _value);
-	virtual void skipWhitespace(std::wstringstream* jsonStream);
-
-	/* constants */
-	static const wchar_t* VALUE_NULL;
-	static const wchar_t* VALUE_TRUE;
-	static const wchar_t* VALUE_FALSE;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.cpp
deleted file mode 100644
index cc72e0e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "Logger.h"
-
-Logger::Logger() {
-}
-
-Logger::~Logger() {
-}
-
-void Logger::error(char* message) {
-	log(message);
-}
-
-void Logger::error(char* message, int errorCode) {
-	std::string result;
-	std::stringstream stringStream;
-	stringStream << message;
-	stringStream << ": ";
-	stringStream << errorCode;
-	result.assign(stringStream.str());
-	error((char *)result.c_str());
-}
-
-void Logger::log(char* message) {
-	SOCKET sock;
-	struct sockaddr_in server_addr;
-	struct hostent *host;
-	host = (struct hostent *)gethostbyname((char *)"127.0.0.1");
-	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
-		return;
-	}
-	server_addr.sin_family = AF_INET;
-	server_addr.sin_port = htons(54124); // TODO
-	server_addr.sin_addr = *((struct in_addr *)host->h_addr);
-    sendto(sock, message, (int)strlen(message), 0, (struct sockaddr *)&server_addr, sizeof(sockaddr_in));
-	closesocket(sock);
-}
-
-void Logger::log(wchar_t* message) {
-	size_t newSize = 0;
-	wcstombs_s(&newSize, NULL, 0, message, 0);
-    char* chars = new char[newSize];
-    wcstombs_s(&newSize, chars, newSize, message, newSize);
-	log(chars);
-	delete[] chars;
-}
-
-void Logger::log(std::wstring* message) {
-	log((wchar_t*)message->c_str());
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.h
deleted file mode 100644
index 13c49ce..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <sstream>
-#include <winsock2.h>
-
-class Logger {
-public:
-	static void error(char* message);
-	static void error(char* message, int errorCode);
-	static void log(char* message);
-	static void log(wchar_t* message);
-	static void log(std::wstring* message);
-
-protected:
-	Logger();
-	~Logger();
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.cpp
deleted file mode 100644
index 747426a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "PendingBreakpoint.h"
-
-PendingBreakpoint::PendingBreakpoint() {
-	m_breakpoint = NULL;
-	m_node = NULL;
-	m_cookie = 0;
-	m_document = NULL;
-	m_target = NULL;
-}
-
-PendingBreakpoint::~PendingBreakpoint() {
-	if (m_breakpoint) {
-		delete m_breakpoint;
-	}
-	if (m_node) {
-		m_node->Release();
-	}
-	if (m_cookie) {
-		unadvise();
-	}
-	if (m_document) {
-		m_document->Release();
-	}
-}
-
-/* IDebugDocumentTextEvents */
-
-STDMETHODIMP PendingBreakpoint::onDestroy() {
-	//Logger::error("PendingBreakpoint::onDestroy");
-	unadvise();
-	return S_OK;
-}
-
-STDMETHODIMP PendingBreakpoint::onInsertText(ULONG cCharacterPosition, ULONG cNumToInsert) {
-	if (m_target) {
-		// TODO for now always assuming line breakpoint
-		if (m_target->setLineBreakpoint((CrossfireLineBreakpoint*)m_breakpoint, true)) {
-			unadvise();
-		}
-	} else {
-		CComBSTR url = NULL;
-		HRESULT hr = m_document->GetName(DOCUMENTNAMETYPE_URL, &url);
-		if (FAILED(hr)) {
-			Logger::error("PendingBreakpoint::onInsertText(): GetName() failed", hr);
-			return S_OK;
-		}
-		
-		CComPtr<IDebugApplicationNode> node = NULL;
-		m_context->findNode(url, NULL, &node);
-		if (m_context->scriptLoaded(&std::wstring(url), node, true)) {
-			unadvise();
-		}
-	}
-	return S_OK;
-}
-
-STDMETHODIMP PendingBreakpoint::onRemoveText(ULONG cCharacterPosition, ULONG cNumToRemove) {
-	return S_OK;
-}
-
-STDMETHODIMP PendingBreakpoint::onReplaceText(ULONG cCharacterPosition, ULONG cNumToReplace) {
-	return S_OK;
-}
-
-STDMETHODIMP PendingBreakpoint::onUpdateTextAttributes(ULONG cCharacterPosition, ULONG cNumToUpdate) {
-	return S_OK;
-}
-
-STDMETHODIMP PendingBreakpoint::onUpdateDocumentAttributes(TEXT_DOC_ATTR textdocattr) {
-	return S_OK;
-}
-
-/* PendingBreakpoint */
-
-bool PendingBreakpoint::init(/*CrossfireBreakpoint* breakpoint*/ IDebugApplicationNode* node, IDebugDocument* document, /*IBreakpointTarget**/ CrossfireContext* context) {
-	CComPtr <IConnectionPointContainer> connectionPointContainer = NULL;
-	HRESULT hr = document->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.init(): QI(IConnectionPointContainer) failed", hr);
-		return false;
-	}
-
-	CComPtr<IConnectionPoint> connectionPoint = NULL;
-	hr = connectionPointContainer->FindConnectionPoint(IID_IDebugDocumentTextEvents, &connectionPoint);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.init(): FindConnectionPoint failed", hr);
-		return false;
-	}
-
-	hr = connectionPoint->Advise(static_cast<IPendingBreakpoint*>(this), &m_cookie);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.init(): Advise failed", hr);
-		return false;
-	}
-
-	//breakpoint->clone(&m_breakpoint);
-	node->AddRef();
-	m_node = node;
-	m_document = document;
-	m_document->AddRef();
-	m_context = context;
-	return true;
-}
-
-bool PendingBreakpoint::init(CrossfireBreakpoint* breakpoint /*IDebugApplicationNode* node*/, IDebugDocument* document, IBreakpointTarget* /*CrossfireContext**/ target) {
-	CComPtr <IConnectionPointContainer> connectionPointContainer = NULL;
-	HRESULT hr = document->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.init(): QI(IConnectionPointContainer) failed", hr);
-		return false;
-	}
-
-	CComPtr<IConnectionPoint> connectionPoint = NULL;
-	hr = connectionPointContainer->FindConnectionPoint(IID_IDebugDocumentTextEvents, &connectionPoint);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.init(): FindConnectionPoint failed", hr);
-		return false;
-	}
-
-	hr = connectionPoint->Advise(static_cast<IPendingBreakpoint*>(this), &m_cookie);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.init(): Advise failed", hr);
-		return false;
-	}
-
-	breakpoint->clone(&m_breakpoint);
-	//node->AddRef();
-	m_document = document;
-	m_document->AddRef();
-	m_target = target;
-	return true;
-}
-
-void PendingBreakpoint::unadvise() {
-	CComPtr <IConnectionPointContainer> connectionPointContainer = NULL;
-	HRESULT hr = m_document->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.unadvise() failed to QI for IID_IConnectionPointContainer", hr);
-		return;
-	}
-	CComPtr <IConnectionPoint> connectionPoint = NULL;
-	hr = connectionPointContainer->FindConnectionPoint(IID_IDebugDocumentTextEvents,&connectionPoint);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.unadvise(): FindConnectionPoint failed", hr);
-		return;
-	}
-	hr = connectionPoint->Unadvise(m_cookie);
-	if (FAILED(hr)) {
-		Logger::error("PendingBreakpoint.unadvise(): Unadvise failed", hr);
-		return;
-	}
-
-	m_cookie = 0;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.h
deleted file mode 100644
index 51746fa..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include "activdbg.h"
-
-//#include "CrossfireBreakpoint.h"
-#include "CrossfireContext.h"
-//#include "IECrossfireServer.h"
-//#include "IBreakpointTarget.h"
-
-class ATL_NO_VTABLE PendingBreakpoint :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<PendingBreakpoint, &CLSID_PendingBreakpoint>,
-	public IDispatchImpl<IPendingBreakpoint, &IID_IPendingBreakpoint, &LIBID_IECrossfireServerLib, 1, 0>,
-	public IDebugDocumentTextEvents {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_PENDINGBREAKPOINT)
-	DECLARE_NOT_AGGREGATABLE(PendingBreakpoint)
-	BEGIN_COM_MAP(PendingBreakpoint)
-		COM_INTERFACE_ENTRY(IPendingBreakpoint)
-		COM_INTERFACE_ENTRY(IDispatch)
-		COM_INTERFACE_ENTRY(IDebugDocumentTextEvents)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	PendingBreakpoint();
-	~PendingBreakpoint();
-
-	/* IDebugDocumentTextEvents */
-	virtual HRESULT STDMETHODCALLTYPE onDestroy();
-	virtual HRESULT STDMETHODCALLTYPE onInsertText(
-		/* [in] */ ULONG cCharacterPosition,
-		/* [in] */ ULONG cNumToInsert);
-	virtual HRESULT STDMETHODCALLTYPE onRemoveText(
-		/* [in] */ ULONG cCharacterPosition,
-		/* [in] */ ULONG cNumToRemove);
-	virtual HRESULT STDMETHODCALLTYPE onReplaceText(
-		/* [in] */ ULONG cCharacterPosition,
-		/* [in] */ ULONG cNumToReplace);
-	virtual HRESULT STDMETHODCALLTYPE onUpdateTextAttributes(
-		/* [in] */ ULONG cCharacterPosition,
-		/* [in] */ ULONG cNumToUpdate);
-	virtual HRESULT STDMETHODCALLTYPE onUpdateDocumentAttributes(
-		/* [in] */ TEXT_DOC_ATTR textdocattr);
-
-	/* PendingBreakpoint */
-	virtual bool init(/*CrossfireBreakpoint* breakpoint*/ IDebugApplicationNode* node, IDebugDocument* document, /*IBreakpointTarget**/ CrossfireContext* target);
-	virtual bool init(CrossfireBreakpoint* breakpoint /*IDebugApplicationNode* node*/, IDebugDocument* document, IBreakpointTarget* /*CrossfireContext**/ context);
-
-private:
-	void unadvise();
-
-	CrossfireBreakpoint* m_breakpoint;
-	IDebugApplicationNode* m_node;
-	DWORD m_cookie;
-	IDebugDocument* m_document;
-	IBreakpointTarget* m_target;
-	CrossfireContext* m_context;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(PendingBreakpoint), PendingBreakpoint)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.rgs
deleted file mode 100644
index 3cdd381..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingBreakpoint.rgs
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	IECrossfireServer.PendingBreakpoint.1 = s 'PendingBreakpoint Class' {
-		CLSID = s '{88E7C480-7B7A-47C5-8329-CE1FDF415527}'
-	}
-	IECrossfireServer.PendingBreakpoint = s 'PendingBreakpoint Class' {
-		CLSID = s '{88E7C480-7B7A-47C5-8329-CE1FDF415527}'
-		CurVer = s 'IECrossfireServer.PendingBreakpoint.1'
-	}
-	NoRemove CLSID {
-		ForceRemove {88E7C480-7B7A-47C5-8329-CE1FDF415527} = s 'PendingBreakpoint Class' {
-			ProgID = s 'IECrossfireServer.PendingBreakpoint.1'
-			VersionIndependentProgID = s 'IECrossfireServer.PendingBreakpoint'
-			ForceRemove 'Programmable'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.cpp
deleted file mode 100644
index ec99f90..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.cpp
+++ /dev/null
@@ -1,311 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "Value.h"
-
-Value::Value() {
-	m_type = TYPE_UNDEFINED;
-	m_arrayValue = NULL;
-	m_numberValue = 0;
-	m_objectValue = NULL;
-	m_stringValue = NULL;
-}
-
-Value::Value(bool value) {
-	setValue(value);
-}
-
-Value::Value(double value) {
-	setValue(value);
-}
-
-Value::Value(const wchar_t* value) {
-	setValue(value);
-}
-
-Value::Value(std::wstring* value) {
-	setValue(value);
-}
-
-Value::~Value() {
-	clearCurrentValue();
-}
-
-void Value::clearCurrentValue() {
-	switch (m_type) {
-		case TYPE_STRING: {
-			delete m_stringValue;
-			break;
-		}
-		case TYPE_ARRAY: {
-			std::vector<Value*>::iterator iterator = m_arrayValue->begin();
-			std::vector<Value*>::iterator end = m_arrayValue->end();
-			while (iterator != end) {
-				delete *iterator;
-				iterator++;
-			}
-			delete m_arrayValue;
-			break;
-		}
-		case TYPE_OBJECT: {
-			std::map<std::wstring, Value*>::iterator it = m_objectValue->begin();
-			std::map<std::wstring, Value*>::iterator end = m_objectValue->end();
-			while (it != end) {
-				delete (*it).second;
-				it++;
-			}
-			delete m_objectValue;
-			break;
-		}
-	}
-	m_type = TYPE_UNDEFINED;
-}
-
-void Value::clone(Value** _value) {
-	switch (getType()) {
-		case TYPE_NULL: {
-			Value* result = new Value();
-			result->setType(TYPE_NULL);
-			*_value = result;
-			break;
-		}
-		case TYPE_BOOLEAN: {
-			Value* result = new Value();
-			result->setValue(getBooleanValue());
-			*_value = result;
-			break;
-		}
-		case TYPE_NUMBER: {
-			Value* result = new Value();
-			result->setValue(getNumberValue());
-			*_value = result;
-			break;
-		}
-		case TYPE_STRING: {
-			Value* result = new Value();
-			result->setValue(getStringValue());
-			*_value = result;
-			break;
-		}
-		case TYPE_ARRAY: {
-			Value** values = NULL;
-			getArrayValues(&values);
-			Value* result = new Value();
-			result->setType(TYPE_ARRAY);
-			int index = 0;
-			while (values[index]) {
-				result->addArrayValue(values[index++]);
-			}
-			delete[] values;
-
-			*_value = result;
-			break;
-		}
-		case TYPE_OBJECT: {
-			std::wstring** keys = NULL;
-			Value** values = NULL;
-			getObjectValues(&keys, &values);
-			Value* result = new Value();
-			result->setType(TYPE_OBJECT);
-			int index = 0;
-			while (keys[index]) {
-				std::wstring keyCopy(*keys[index]);
-				result->addObjectValue(&keyCopy, values[index++]);
-			}
-			delete[] values;
-			delete[] keys;
-
-			*_value = result;
-			break;
-
-		}
-		// TYPE_UNDEFINED
-		default: {
-			*_value = NULL;
-			break;
-		}
-	}
-}
-
-void Value::addArrayValue(Value *value) {
-	setType(TYPE_ARRAY);
-	Value* result = NULL;
-	value->clone(&result);
-	m_arrayValue->push_back(result);
-}
-
-bool Value::addObjectValue(const wchar_t* key, Value* value) {
-	return addObjectValue(&std::wstring(key), value);
-}
-
-bool Value::addObjectValue(std::wstring* key, Value* value) {
-	return setObjectValue(key, value, false);
-}
-
-void Value::getArrayValues(Value*** __values) {
-	if (m_type != TYPE_ARRAY) {
-		*__values = NULL;
-		return;
-	}
-	size_t size = m_arrayValue->size();
-	Value** result = new Value*[size + 1];
-	for (int i = 0; i < (int)size; i++) {
-		result[i] = m_arrayValue->at(i);
-	}
-	result[size] = NULL;
-	*__values = result;
-}
-
-bool Value::getBooleanValue() {
-	if (m_type != TYPE_BOOLEAN) {
-		return false;
-	}
-	return m_numberValue != 0;
-}
-
-double Value::getNumberValue() {
-	if (m_type != TYPE_NUMBER) {
-		return 0;
-	}
-	return m_numberValue;
-}
-
-Value* Value::getObjectValue(const wchar_t* key) {
-	return getObjectValue(&std::wstring(key));
-}
-
-Value* Value::getObjectValue(std::wstring* key) {
-	if (m_type != TYPE_OBJECT) {
-		return NULL;
-	}
-
-	std::map<std::wstring, Value*>::iterator result = m_objectValue->find(*key);
-	if (result == m_objectValue->end()) {
-		/* not found */
-		return NULL;
-	}
-	return result->second;
-}
-
-void Value::getObjectValues(std::wstring*** __keys, Value*** __values) {
-	if (m_type != TYPE_OBJECT) {
-		*__keys = NULL;
-		*__values = NULL;
-		return;
-	}
-	size_t size = m_objectValue->size();
-	std::wstring** keysResult = new std::wstring*[size + 1];
-	Value** valuesResult = new Value*[size + 1];
-
-	std::map<std::wstring, Value*>::iterator it = m_objectValue->begin();
-	std::map<std::wstring, Value*>::iterator end = m_objectValue->end();
-	int index = 0;
-	while (it != end) {
-		keysResult[index] = (std::wstring*)&(*it).first;
-		valuesResult[index++] = (*it).second;
-		it++;
-	}
-	keysResult[index] = NULL;
-	valuesResult[index] = NULL;
-
-	*__keys = keysResult;
-	*__values = valuesResult;
-}
-
-bool Value::setObjectValue(const wchar_t* key, Value* value) {
-	return setObjectValue(&std::wstring(key), value);
-}
-
-bool Value::setObjectValue(std::wstring* key, Value* value) {
-	return setObjectValue(key, value, true);
-}
-
-bool Value::setObjectValue(std::wstring* key, Value* value, bool overwrite) {
-	setType(TYPE_OBJECT);
-	std::map<std::wstring, Value*>::iterator it = m_objectValue->find(*key);
-	if (it != m_objectValue->end()) {
-		/* value with this key already exists in map */
-		if (!overwrite) {
-			return false;
-		}
-		m_objectValue->erase(it);
-	}
-	Value* result = NULL;
-	value->clone(&result);
-	m_objectValue->insert(std::pair<std::wstring,Value*>(*key, result));
-	return true;
-}
-
-std::wstring* Value::getStringValue() {
-	if (m_type != TYPE_STRING) {
-		return NULL;
-	}
-	return m_stringValue;
-}
-
-int Value::getType() {
-	return m_type;
-}
-
-void Value::setValue(bool value) {
-	setType(TYPE_BOOLEAN);
-	if (value) {
-		m_numberValue = 1;
-	} else {
-		m_numberValue = 0;
-	}
-}
-
-void Value::setValue(double value) {
-	setType(TYPE_NUMBER);
-	m_numberValue = value;
-}
-
-void Value::setValue(const wchar_t* value) {
-	setType(TYPE_STRING);
-	m_stringValue = new std::wstring;
-	m_stringValue->assign(value);
-}
-
-void Value::setValue(std::wstring* value) {
-	setType(TYPE_STRING);
-	m_stringValue = new std::wstring;
-	m_stringValue->assign(*value);
-}
-
-void Value::setType(int value) {
-	if (m_type == value) {
-		/* nothing to do */
-		return;
-	}
-
-	clearCurrentValue();
-
-	if (value > TYPE_OBJECT) {
-		/* invalid value */
-		m_type = TYPE_UNDEFINED;
-		return;
-	}
-
-	m_type = value;
-	switch (m_type) {
-		case TYPE_ARRAY: {
-			m_arrayValue = new std::vector<Value*>;
-			break;
-		}
-		case TYPE_OBJECT: {
-			m_objectValue = new std::map<std::wstring, Value*>;
-			break;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.h
deleted file mode 100644
index 3ba0809..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <iostream>
-#include <map>
-#include <sstream>
-#include <vector>
-
-enum {
-	TYPE_UNDEFINED = 0x0,
-	TYPE_NULL = 0x1,
-	TYPE_BOOLEAN = 0x2,
-	TYPE_NUMBER = 0x4,
-	TYPE_STRING = 0x8,
-	TYPE_ARRAY = 0x10,
-	TYPE_OBJECT = 0x20,
-};
-
-class Value {
-
-public:
-	Value();
-	Value(bool value);
-	Value(double value);
-	Value(const wchar_t* value);
-	Value(std::wstring* value);
-	~Value();
-	virtual void addArrayValue(Value* value);
-	virtual bool addObjectValue(const wchar_t* key, Value* value);
-	virtual bool addObjectValue(std::wstring* key, Value* value);
-	virtual void clone(Value** _value);
-	virtual void getArrayValues(Value*** __values);
-	virtual bool getBooleanValue();
-	virtual double getNumberValue();
-	virtual Value* getObjectValue(const wchar_t* key);
-	virtual Value* getObjectValue(std::wstring* key);
-	virtual void getObjectValues(std::wstring*** __keys, Value*** __values);
-	virtual std::wstring* getStringValue();
-	virtual int getType();
-	virtual bool setObjectValue(const wchar_t* key, Value* value);
-	virtual bool setObjectValue(std::wstring* key, Value* value);
-	virtual void setType(int type);
-	virtual void setValue(bool value);
-	virtual void setValue(double value);
-	virtual void setValue(const wchar_t* value);
-	virtual void setValue(std::wstring* value);
-
-private:
-	virtual void clearCurrentValue();
-	virtual bool setObjectValue(std::wstring* key, Value* value, bool overwrite);
-
-	std::vector<Value*>* m_arrayValue;
-	double m_numberValue;
-	std::map<std::wstring, Value*>* m_objectValue;
-	std::wstring* m_stringValue;
-	int m_type;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.cpp
deleted file mode 100644
index 1f04159..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "WindowsSocketConnection.h"
-
-/* initialize statics */
-std::map<HWND, WindowsSocketConnection*>* WindowsSocketConnection::s_connections = new std::map<HWND, WindowsSocketConnection*>; /* leaked */
-
-WindowsSocketConnection::WindowsSocketConnection(CrossfireServer* server) {
-	m_clientSocket = INVALID_SOCKET;
-	m_server = server;
-	m_hWnd = NULL;
-	m_listenSocket = INVALID_SOCKET;	
-}
-
-WindowsSocketConnection::~WindowsSocketConnection() {
-}
-
-bool WindowsSocketConnection::acceptConnection() {
-	int rc = WSAAsyncSelect(m_listenSocket, m_hWnd, EW_SOCKET_MSG, FD_ACCEPT);
-	if (rc != 0) {
-		Logger::error("WindowsSocketConnection.acceptConnection(): WSAAsyncSelect() failed", rc);
-		return false;
-	}
-	return true;
-}
-
-bool WindowsSocketConnection::close() {
-	deregisterConnection(m_hWnd);
-	closesocket(m_clientSocket);
-	closesocket(m_listenSocket);
-	m_clientSocket = m_listenSocket = INVALID_SOCKET;
-	return true;
-}
-
-void WindowsSocketConnection::handleSocketAccept() {
-	m_clientSocket = accept(m_listenSocket, NULL, NULL);
-	if (m_clientSocket == INVALID_SOCKET) {
-		Logger::error("WindowsSocketConnection.handleSocketAccept(): accept() failed", WSAGetLastError());
-		return;
-	}
-
-	int rc = WSAAsyncSelect(m_clientSocket, m_hWnd, EW_SOCKET_MSG, FD_READ | FD_CLOSE);
-	if (rc == SOCKET_ERROR) {
-		closesocket(m_clientSocket);
-		m_clientSocket = INVALID_SOCKET;
-		Logger::error("WindowsSocketConnection.handleSocketAccept(): WSAAsyncSelect() failed", WSAGetLastError());
-		return;
-	}
-
-	/* remove the listenSocket listener */
-	WSAAsyncSelect(m_listenSocket, m_hWnd, EW_SOCKET_MSG, 0);
-}
-
-void WindowsSocketConnection::handleSocketClose() {
-	m_server->disconnected();
-}
-
-void WindowsSocketConnection::handleSocketRead() {
-	const int LENGTH_BUFFER = 4096;
-	char buffer[LENGTH_BUFFER];
-	ZeroMemory(buffer, LENGTH_BUFFER);
-
-	int length = recv(m_clientSocket, buffer, LENGTH_BUFFER, 0);
-	if (length == SOCKET_ERROR) {
-		Logger::error("WindowsSocketConnection.handleSocketRead(): recv() failed", errno);
-		return;
-	}
-	if (length == 0) {
-		/* connection closed */
-		Logger::log("WindowsSocketConnection.handleSocketRead(): recv() length 0, implies socket closed");
-		PostQuitMessage(0);
-		return;
-	}
-
-	length = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buffer, -1, NULL, 0);
-	wchar_t* content = new wchar_t[length];
-	MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buffer, -1, content, length);
-//Logger::log("-----\nReceived:");
-//Logger::log(content);
-	m_server->received(content);
-	delete[] content;
-}
-
-bool WindowsSocketConnection::init(unsigned int port) {
-	WSADATA wsaData;
-	int rc = WSAStartup(MAKEWORD(2,2), &wsaData);
-	if (rc != 0) {
-		Logger::error("WindowsSocketConnection.init(): WSAStartup() failed", rc);
-		return false;
-	}
-
-	char portString[6];
-	ZeroMemory(portString, 6);
-	_ltoa_s(port, portString, 6, 10);
-	struct addrinfo hints;
-	ZeroMemory(&hints, sizeof(hints));
-	hints.ai_flags = AI_PASSIVE;
-	hints.ai_family = AF_INET;
-	hints.ai_socktype = SOCK_STREAM;
-	hints.ai_protocol = IPPROTO_TCP;
-	struct addrinfo* result = NULL;
-	rc = getaddrinfo(NULL, portString, &hints, &result);
-	if (rc != 0) {
-		WSACleanup();
-		Logger::error("WindowsSocketConnection.init(): getaddrinfo() failed", rc);
-		return false;
-	}
-
-	m_listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
-	if (m_listenSocket == INVALID_SOCKET) {
-		freeaddrinfo(result);
-		WSACleanup();
-		Logger::error("WindowsSocketConnection.init(): socket() failed", WSAGetLastError());
-		return false;
-	}
-
-	if (bind(m_listenSocket, result->ai_addr, (int)result->ai_addrlen) == SOCKET_ERROR) {
-		closesocket(m_listenSocket);
-		m_listenSocket = INVALID_SOCKET;
-		freeaddrinfo(result);
-		WSACleanup();
-		Logger::error("WindowsSocketConnection.init(): bind() failed", WSAGetLastError());
-		return false;
-	}
-
-	rc = listen(m_listenSocket, SOMAXCONN); 
-	freeaddrinfo(result);
-	if (rc == SOCKET_ERROR) {
-		closesocket(m_listenSocket);
-		m_listenSocket = INVALID_SOCKET;
-		WSACleanup();
-		Logger::error("WindowsSocketConnection.init(): listen() failed", WSAGetLastError());
-		return false;
-	}
-
-	std::wstringstream stream;
-	stream << "Listening for a connection on localhost:";
-	stream << portString;
-	Logger::log((wchar_t*)stream.str().c_str());
-
-	static LPCWSTR s_windowClass = _T("CrossfireSocketConnection"); // TODO differentiate by port?
-	HINSTANCE module = GetModuleHandle(NULL);
-	WNDCLASS ex;
-	ex.style = 0;
-	ex.lpfnWndProc = WndProc;
-	ex.cbClsExtra = 0;
-	ex.cbWndExtra = 0;
-	ex.hInstance = module;
-	ex.hIcon = NULL;
-	ex.hCursor = NULL;
-	ex.hbrBackground = NULL;
-	ex.lpszMenuName = NULL;
-	ex.lpszClassName = s_windowClass;
-	RegisterClass(&ex);
-	m_hWnd = CreateWindow(s_windowClass, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, module, NULL);
-	if (!m_hWnd) {
-		Logger::error("WindowsSocketConnection.init(): CreateWindow() failed", GetLastError());
-		return false;
-	}
-	WindowsSocketConnection::registerConnection(m_hWnd, this);
-	return true;
-}
-
-bool WindowsSocketConnection::send(const wchar_t* msg) {
-//Logger::log("-----\nSent:");
-//Logger::log((wchar_t*)msg);
-	int length = WideCharToMultiByte(CP_UTF8, 0, msg, -1, NULL, 0, NULL, NULL);
-	char* content = new char[length];
-	WideCharToMultiByte(CP_UTF8, 0, msg, -1, content, length, NULL, NULL);
-	if (::send(m_clientSocket, content, length - 1, 0) == SOCKET_ERROR) { /* uses length - 1 to not send null terminator */
-		Logger::error("WindowsSocketConnection.send(): send() failed", errno);
-		return false;
-	}
-	return true;
-}
-
-bool WindowsSocketConnection::deregisterConnection(HWND hWnd) {
-	std::map<HWND, WindowsSocketConnection*>::iterator iterator = s_connections->find(hWnd);
-	if (iterator != s_connections->end()) {
-		s_connections->erase(iterator);
-		return true;
-	}
-
-	/* not found */
-	return false;
-}
-
-WindowsSocketConnection* WindowsSocketConnection::getConnection(HWND hWnd) {
-	std::map<HWND, WindowsSocketConnection*>::iterator iterator = s_connections->find(hWnd);
-	if (iterator == s_connections->end()) {
-		/* not found */
-		return NULL;
-	}
-	return iterator->second;
-}
-
-void WindowsSocketConnection::registerConnection(HWND hWnd, WindowsSocketConnection* connection) {
-	s_connections->insert(std::pair<HWND,WindowsSocketConnection*>(hWnd, connection));
-}
-
-LRESULT CALLBACK WindowsSocketConnection::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
-	switch (message) {
-		case EW_SOCKET_MSG: {
-			WindowsSocketConnection* instance = WindowsSocketConnection::getConnection(hWnd);
-			if (!instance) {
-				Logger::error("WindowsSocketConnection:WndProc(): received EW_SOCKET_MSG for unregistered hWnd");
-				break;
-			}
-			switch (WSAGETSELECTEVENT(lParam)) {
-				case FD_READ: {
-					instance->handleSocketRead();
-					break;
-				}
-				case FD_ACCEPT: {
-					instance->handleSocketAccept();
-					break;
-				}
-				case FD_CLOSE: {
-					instance->handleSocketClose();
-					break;
-				}
-				default: {
-					Logger::error("WindowsSocketConnection:WndProc(): received EW_SOCKET_MSG for unexpected event");
-					break;
-				}
-			}
-			break;
-		}
-		default: {
-			return DefWindowProc(hWnd, message, wParam, lParam);
-		}
-	}
-	return 0;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.h
deleted file mode 100644
index b7bbf63..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <iostream>
-#include <winsock2.h>
-#include <ws2tcpip.h>
-
-#include "Logger.h"
-
-class WindowsSocketConnection; // forward declaration
-#include "CrossfireServer.h"
-
-class WindowsSocketConnection {
-
-public:
-	WindowsSocketConnection(CrossfireServer* server);
-	~WindowsSocketConnection();
-	virtual bool acceptConnection();
-	virtual bool close();
-	virtual bool init(unsigned int port);
-	virtual bool send(const wchar_t* msg);
-
-private:
-	virtual void handleSocketAccept();
-	virtual void handleSocketClose();
-	virtual void handleSocketRead();
-
-	SOCKET m_clientSocket;
-	CrossfireServer* m_server;
-	HWND m_hWnd;
-	SOCKET m_listenSocket;
-
-	static bool deregisterConnection(HWND hWnd);
-	static WindowsSocketConnection* getConnection(HWND hWnd);
-	static void registerConnection(HWND hWnd, WindowsSocketConnection* connection);
-	static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
-
-	static std::map<HWND, WindowsSocketConnection*>* s_connections;
-
-	/* constants */
-	static const int EW_SOCKET_MSG = WM_APP + 1;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/activdbg.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/activdbg.h
deleted file mode 100644
index a004b1a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/activdbg.h
+++ /dev/null
@@ -1,9918 +0,0 @@
-/* this ALWAYS GENERATED file contains the definitions for the interfaces */
-
-
-/* File created by MIDL compiler version 3.01.75 */
-/* at Fri Sep 18 16:27:25 1998
- */
-/* Compiler settings for activdbg.idl:
-    Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext
-    error checks: none
-*/
-//@@MIDL_FILE_HEADING(  )
-#include "rpc.h"
-#include "rpcndr.h"
-#ifndef COM_NO_WINDOWS_H
-#include "windows.h"
-#include "ole2.h"
-#endif /*COM_NO_WINDOWS_H*/
-
-#ifndef __activdbg_h__
-#define __activdbg_h__
-
-#ifdef __cplusplus
-extern "C"{
-#endif 
-
-/* Forward Declarations */ 
-
-#ifndef __IActiveScriptDebug_FWD_DEFINED__
-#define __IActiveScriptDebug_FWD_DEFINED__
-typedef interface IActiveScriptDebug IActiveScriptDebug;
-#endif 	/* __IActiveScriptDebug_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptSiteDebug_FWD_DEFINED__
-#define __IActiveScriptSiteDebug_FWD_DEFINED__
-typedef interface IActiveScriptSiteDebug IActiveScriptSiteDebug;
-#endif 	/* __IActiveScriptSiteDebug_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
-#define __IActiveScriptErrorDebug_FWD_DEFINED__
-typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
-#endif 	/* __IActiveScriptErrorDebug_FWD_DEFINED__ */
-
-
-#ifndef __IDebugCodeContext_FWD_DEFINED__
-#define __IDebugCodeContext_FWD_DEFINED__
-typedef interface IDebugCodeContext IDebugCodeContext;
-#endif 	/* __IDebugCodeContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpression_FWD_DEFINED__
-#define __IDebugExpression_FWD_DEFINED__
-typedef interface IDebugExpression IDebugExpression;
-#endif 	/* __IDebugExpression_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpressionContext_FWD_DEFINED__
-#define __IDebugExpressionContext_FWD_DEFINED__
-typedef interface IDebugExpressionContext IDebugExpressionContext;
-#endif 	/* __IDebugExpressionContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
-#define __IDebugExpressionCallBack_FWD_DEFINED__
-typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
-#endif 	/* __IDebugExpressionCallBack_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrame_FWD_DEFINED__
-#define __IDebugStackFrame_FWD_DEFINED__
-typedef interface IDebugStackFrame IDebugStackFrame;
-#endif 	/* __IDebugStackFrame_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
-#define __IDebugStackFrameSniffer_FWD_DEFINED__
-typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
-#endif 	/* __IDebugStackFrameSniffer_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSnifferEx_FWD_DEFINED__
-#define __IDebugStackFrameSnifferEx_FWD_DEFINED__
-typedef interface IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx;
-#endif 	/* __IDebugStackFrameSnifferEx_FWD_DEFINED__ */
-
-
-#ifndef __IDebugSyncOperation_FWD_DEFINED__
-#define __IDebugSyncOperation_FWD_DEFINED__
-typedef interface IDebugSyncOperation IDebugSyncOperation;
-#endif 	/* __IDebugSyncOperation_FWD_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperation_FWD_DEFINED__
-#define __IDebugAsyncOperation_FWD_DEFINED__
-typedef interface IDebugAsyncOperation IDebugAsyncOperation;
-#endif 	/* __IDebugAsyncOperation_FWD_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
-#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
-typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
-#endif 	/* __IDebugAsyncOperationCallBack_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
-#define __IEnumDebugCodeContexts_FWD_DEFINED__
-typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
-#endif 	/* __IEnumDebugCodeContexts_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
-#define __IEnumDebugStackFrames_FWD_DEFINED__
-typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
-#endif 	/* __IEnumDebugStackFrames_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentInfo_FWD_DEFINED__
-#define __IDebugDocumentInfo_FWD_DEFINED__
-typedef interface IDebugDocumentInfo IDebugDocumentInfo;
-#endif 	/* __IDebugDocumentInfo_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentProvider_FWD_DEFINED__
-#define __IDebugDocumentProvider_FWD_DEFINED__
-typedef interface IDebugDocumentProvider IDebugDocumentProvider;
-#endif 	/* __IDebugDocumentProvider_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocument_FWD_DEFINED__
-#define __IDebugDocument_FWD_DEFINED__
-typedef interface IDebugDocument IDebugDocument;
-#endif 	/* __IDebugDocument_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentText_FWD_DEFINED__
-#define __IDebugDocumentText_FWD_DEFINED__
-typedef interface IDebugDocumentText IDebugDocumentText;
-#endif 	/* __IDebugDocumentText_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
-#define __IDebugDocumentTextEvents_FWD_DEFINED__
-typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
-#endif 	/* __IDebugDocumentTextEvents_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
-#define __IDebugDocumentTextAuthor_FWD_DEFINED__
-typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
-#endif 	/* __IDebugDocumentTextAuthor_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
-#define __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
-typedef interface IDebugDocumentTextExternalAuthor IDebugDocumentTextExternalAuthor;
-#endif 	/* __IDebugDocumentTextExternalAuthor_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHelper_FWD_DEFINED__
-#define __IDebugDocumentHelper_FWD_DEFINED__
-typedef interface IDebugDocumentHelper IDebugDocumentHelper;
-#endif 	/* __IDebugDocumentHelper_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHost_FWD_DEFINED__
-#define __IDebugDocumentHost_FWD_DEFINED__
-typedef interface IDebugDocumentHost IDebugDocumentHost;
-#endif 	/* __IDebugDocumentHost_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentContext_FWD_DEFINED__
-#define __IDebugDocumentContext_FWD_DEFINED__
-typedef interface IDebugDocumentContext IDebugDocumentContext;
-#endif 	/* __IDebugDocumentContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugSessionProvider_FWD_DEFINED__
-#define __IDebugSessionProvider_FWD_DEFINED__
-typedef interface IDebugSessionProvider IDebugSessionProvider;
-#endif 	/* __IDebugSessionProvider_FWD_DEFINED__ */
-
-
-#ifndef __IApplicationDebugger_FWD_DEFINED__
-#define __IApplicationDebugger_FWD_DEFINED__
-typedef interface IApplicationDebugger IApplicationDebugger;
-#endif 	/* __IApplicationDebugger_FWD_DEFINED__ */
-
-
-#ifndef __IApplicationDebuggerUI_FWD_DEFINED__
-#define __IApplicationDebuggerUI_FWD_DEFINED__
-typedef interface IApplicationDebuggerUI IApplicationDebuggerUI;
-#endif 	/* __IApplicationDebuggerUI_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManager_FWD_DEFINED__
-#define __IMachineDebugManager_FWD_DEFINED__
-typedef interface IMachineDebugManager IMachineDebugManager;
-#endif 	/* __IMachineDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
-#define __IMachineDebugManagerCookie_FWD_DEFINED__
-typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
-#endif 	/* __IMachineDebugManagerCookie_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
-#define __IMachineDebugManagerEvents_FWD_DEFINED__
-typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
-#endif 	/* __IMachineDebugManagerEvents_FWD_DEFINED__ */
-
-
-#ifndef __IProcessDebugManager_FWD_DEFINED__
-#define __IProcessDebugManager_FWD_DEFINED__
-typedef interface IProcessDebugManager IProcessDebugManager;
-#endif 	/* __IProcessDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplication_FWD_DEFINED__
-#define __IRemoteDebugApplication_FWD_DEFINED__
-typedef interface IRemoteDebugApplication IRemoteDebugApplication;
-#endif 	/* __IRemoteDebugApplication_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplication_FWD_DEFINED__
-#define __IDebugApplication_FWD_DEFINED__
-typedef interface IDebugApplication IDebugApplication;
-#endif 	/* __IDebugApplication_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationEvents_FWD_DEFINED__
-#define __IRemoteDebugApplicationEvents_FWD_DEFINED__
-typedef interface IRemoteDebugApplicationEvents IRemoteDebugApplicationEvents;
-#endif 	/* __IRemoteDebugApplicationEvents_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNode_FWD_DEFINED__
-#define __IDebugApplicationNode_FWD_DEFINED__
-typedef interface IDebugApplicationNode IDebugApplicationNode;
-#endif 	/* __IDebugApplicationNode_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
-#define __IDebugApplicationNodeEvents_FWD_DEFINED__
-typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
-#endif 	/* __IDebugApplicationNodeEvents_FWD_DEFINED__ */
-
-
-#ifndef __IDebugThreadCall_FWD_DEFINED__
-#define __IDebugThreadCall_FWD_DEFINED__
-typedef interface IDebugThreadCall IDebugThreadCall;
-#endif 	/* __IDebugThreadCall_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
-#define __IRemoteDebugApplicationThread_FWD_DEFINED__
-typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
-#endif 	/* __IRemoteDebugApplicationThread_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationThread_FWD_DEFINED__
-#define __IDebugApplicationThread_FWD_DEFINED__
-typedef interface IDebugApplicationThread IDebugApplicationThread;
-#endif 	/* __IDebugApplicationThread_FWD_DEFINED__ */
-
-
-#ifndef __IDebugCookie_FWD_DEFINED__
-#define __IDebugCookie_FWD_DEFINED__
-typedef interface IDebugCookie IDebugCookie;
-#endif 	/* __IDebugCookie_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
-#define __IEnumDebugApplicationNodes_FWD_DEFINED__
-typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
-#endif 	/* __IEnumDebugApplicationNodes_FWD_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
-#define __IEnumRemoteDebugApplications_FWD_DEFINED__
-typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
-#endif 	/* __IEnumRemoteDebugApplications_FWD_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
-#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
-typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
-#endif 	/* __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__ */
-
-
-#ifndef __IDebugFormatter_FWD_DEFINED__
-#define __IDebugFormatter_FWD_DEFINED__
-typedef interface IDebugFormatter IDebugFormatter;
-#endif 	/* __IDebugFormatter_FWD_DEFINED__ */
-
-
-#ifndef __ISimpleConnectionPoint_FWD_DEFINED__
-#define __ISimpleConnectionPoint_FWD_DEFINED__
-typedef interface ISimpleConnectionPoint ISimpleConnectionPoint;
-#endif 	/* __ISimpleConnectionPoint_FWD_DEFINED__ */
-
-
-#ifndef __IDebugHelper_FWD_DEFINED__
-#define __IDebugHelper_FWD_DEFINED__
-typedef interface IDebugHelper IDebugHelper;
-#endif 	/* __IDebugHelper_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
-#define __IEnumDebugExpressionContexts_FWD_DEFINED__
-typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
-#endif 	/* __IEnumDebugExpressionContexts_FWD_DEFINED__ */
-
-
-#ifndef __IProvideExpressionContexts_FWD_DEFINED__
-#define __IProvideExpressionContexts_FWD_DEFINED__
-typedef interface IProvideExpressionContexts IProvideExpressionContexts;
-#endif 	/* __IProvideExpressionContexts_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptDebug_FWD_DEFINED__
-#define __IActiveScriptDebug_FWD_DEFINED__
-typedef interface IActiveScriptDebug IActiveScriptDebug;
-#endif 	/* __IActiveScriptDebug_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
-#define __IActiveScriptErrorDebug_FWD_DEFINED__
-typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
-#endif 	/* __IActiveScriptErrorDebug_FWD_DEFINED__ */
-
-
-#ifndef __IActiveScriptSiteDebug_FWD_DEFINED__
-#define __IActiveScriptSiteDebug_FWD_DEFINED__
-typedef interface IActiveScriptSiteDebug IActiveScriptSiteDebug;
-#endif 	/* __IActiveScriptSiteDebug_FWD_DEFINED__ */
-
-
-#ifndef __IApplicationDebugger_FWD_DEFINED__
-#define __IApplicationDebugger_FWD_DEFINED__
-typedef interface IApplicationDebugger IApplicationDebugger;
-#endif 	/* __IApplicationDebugger_FWD_DEFINED__ */
-
-
-#ifndef __IApplicationDebuggerUI_FWD_DEFINED__
-#define __IApplicationDebuggerUI_FWD_DEFINED__
-typedef interface IApplicationDebuggerUI IApplicationDebuggerUI;
-#endif 	/* __IApplicationDebuggerUI_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplication_FWD_DEFINED__
-#define __IRemoteDebugApplication_FWD_DEFINED__
-typedef interface IRemoteDebugApplication IRemoteDebugApplication;
-#endif 	/* __IRemoteDebugApplication_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplication_FWD_DEFINED__
-#define __IDebugApplication_FWD_DEFINED__
-typedef interface IDebugApplication IDebugApplication;
-#endif 	/* __IDebugApplication_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentInfo_FWD_DEFINED__
-#define __IDebugDocumentInfo_FWD_DEFINED__
-typedef interface IDebugDocumentInfo IDebugDocumentInfo;
-#endif 	/* __IDebugDocumentInfo_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentProvider_FWD_DEFINED__
-#define __IDebugDocumentProvider_FWD_DEFINED__
-typedef interface IDebugDocumentProvider IDebugDocumentProvider;
-#endif 	/* __IDebugDocumentProvider_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNode_FWD_DEFINED__
-#define __IDebugApplicationNode_FWD_DEFINED__
-typedef interface IDebugApplicationNode IDebugApplicationNode;
-#endif 	/* __IDebugApplicationNode_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
-#define __IDebugApplicationNodeEvents_FWD_DEFINED__
-typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
-#endif 	/* __IDebugApplicationNodeEvents_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
-#define __IRemoteDebugApplicationThread_FWD_DEFINED__
-typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
-#endif 	/* __IRemoteDebugApplicationThread_FWD_DEFINED__ */
-
-
-#ifndef __IDebugApplicationThread_FWD_DEFINED__
-#define __IDebugApplicationThread_FWD_DEFINED__
-typedef interface IDebugApplicationThread IDebugApplicationThread;
-#endif 	/* __IDebugApplicationThread_FWD_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperation_FWD_DEFINED__
-#define __IDebugAsyncOperation_FWD_DEFINED__
-typedef interface IDebugAsyncOperation IDebugAsyncOperation;
-#endif 	/* __IDebugAsyncOperation_FWD_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
-#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
-typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
-#endif 	/* __IDebugAsyncOperationCallBack_FWD_DEFINED__ */
-
-
-#ifndef __IDebugCodeContext_FWD_DEFINED__
-#define __IDebugCodeContext_FWD_DEFINED__
-typedef interface IDebugCodeContext IDebugCodeContext;
-#endif 	/* __IDebugCodeContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugCookie_FWD_DEFINED__
-#define __IDebugCookie_FWD_DEFINED__
-typedef interface IDebugCookie IDebugCookie;
-#endif 	/* __IDebugCookie_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocument_FWD_DEFINED__
-#define __IDebugDocument_FWD_DEFINED__
-typedef interface IDebugDocument IDebugDocument;
-#endif 	/* __IDebugDocument_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentContext_FWD_DEFINED__
-#define __IDebugDocumentContext_FWD_DEFINED__
-typedef interface IDebugDocumentContext IDebugDocumentContext;
-#endif 	/* __IDebugDocumentContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHelper_FWD_DEFINED__
-#define __IDebugDocumentHelper_FWD_DEFINED__
-typedef interface IDebugDocumentHelper IDebugDocumentHelper;
-#endif 	/* __IDebugDocumentHelper_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHost_FWD_DEFINED__
-#define __IDebugDocumentHost_FWD_DEFINED__
-typedef interface IDebugDocumentHost IDebugDocumentHost;
-#endif 	/* __IDebugDocumentHost_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentText_FWD_DEFINED__
-#define __IDebugDocumentText_FWD_DEFINED__
-typedef interface IDebugDocumentText IDebugDocumentText;
-#endif 	/* __IDebugDocumentText_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
-#define __IDebugDocumentTextAuthor_FWD_DEFINED__
-typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
-#endif 	/* __IDebugDocumentTextAuthor_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
-#define __IDebugDocumentTextEvents_FWD_DEFINED__
-typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
-#endif 	/* __IDebugDocumentTextEvents_FWD_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
-#define __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
-typedef interface IDebugDocumentTextExternalAuthor IDebugDocumentTextExternalAuthor;
-#endif 	/* __IDebugDocumentTextExternalAuthor_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpression_FWD_DEFINED__
-#define __IDebugExpression_FWD_DEFINED__
-typedef interface IDebugExpression IDebugExpression;
-#endif 	/* __IDebugExpression_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
-#define __IDebugExpressionCallBack_FWD_DEFINED__
-typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
-#endif 	/* __IDebugExpressionCallBack_FWD_DEFINED__ */
-
-
-#ifndef __IDebugExpressionContext_FWD_DEFINED__
-#define __IDebugExpressionContext_FWD_DEFINED__
-typedef interface IDebugExpressionContext IDebugExpressionContext;
-#endif 	/* __IDebugExpressionContext_FWD_DEFINED__ */
-
-
-#ifndef __IDebugFormatter_FWD_DEFINED__
-#define __IDebugFormatter_FWD_DEFINED__
-typedef interface IDebugFormatter IDebugFormatter;
-#endif 	/* __IDebugFormatter_FWD_DEFINED__ */
-
-
-#ifndef __IDebugHelper_FWD_DEFINED__
-#define __IDebugHelper_FWD_DEFINED__
-typedef interface IDebugHelper IDebugHelper;
-#endif 	/* __IDebugHelper_FWD_DEFINED__ */
-
-
-#ifndef __IDebugSessionProvider_FWD_DEFINED__
-#define __IDebugSessionProvider_FWD_DEFINED__
-typedef interface IDebugSessionProvider IDebugSessionProvider;
-#endif 	/* __IDebugSessionProvider_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrame_FWD_DEFINED__
-#define __IDebugStackFrame_FWD_DEFINED__
-typedef interface IDebugStackFrame IDebugStackFrame;
-#endif 	/* __IDebugStackFrame_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
-#define __IDebugStackFrameSniffer_FWD_DEFINED__
-typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
-#endif 	/* __IDebugStackFrameSniffer_FWD_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSnifferEx_FWD_DEFINED__
-#define __IDebugStackFrameSnifferEx_FWD_DEFINED__
-typedef interface IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx;
-#endif 	/* __IDebugStackFrameSnifferEx_FWD_DEFINED__ */
-
-
-#ifndef __IDebugSyncOperation_FWD_DEFINED__
-#define __IDebugSyncOperation_FWD_DEFINED__
-typedef interface IDebugSyncOperation IDebugSyncOperation;
-#endif 	/* __IDebugSyncOperation_FWD_DEFINED__ */
-
-
-#ifndef __IDebugThreadCall_FWD_DEFINED__
-#define __IDebugThreadCall_FWD_DEFINED__
-typedef interface IDebugThreadCall IDebugThreadCall;
-#endif 	/* __IDebugThreadCall_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
-#define __IEnumDebugApplicationNodes_FWD_DEFINED__
-typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
-#endif 	/* __IEnumDebugApplicationNodes_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
-#define __IEnumDebugCodeContexts_FWD_DEFINED__
-typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
-#endif 	/* __IEnumDebugCodeContexts_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
-#define __IEnumDebugExpressionContexts_FWD_DEFINED__
-typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
-#endif 	/* __IEnumDebugExpressionContexts_FWD_DEFINED__ */
-
-
-#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
-#define __IEnumDebugStackFrames_FWD_DEFINED__
-typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
-#endif 	/* __IEnumDebugStackFrames_FWD_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
-#define __IEnumRemoteDebugApplications_FWD_DEFINED__
-typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
-#endif 	/* __IEnumRemoteDebugApplications_FWD_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
-#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
-typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
-#endif 	/* __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__ */
-
-
-#ifndef __IProcessDebugManager_FWD_DEFINED__
-#define __IProcessDebugManager_FWD_DEFINED__
-typedef interface IProcessDebugManager IProcessDebugManager;
-#endif 	/* __IProcessDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __IProvideExpressionContexts_FWD_DEFINED__
-#define __IProvideExpressionContexts_FWD_DEFINED__
-typedef interface IProvideExpressionContexts IProvideExpressionContexts;
-#endif 	/* __IProvideExpressionContexts_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManager_FWD_DEFINED__
-#define __IMachineDebugManager_FWD_DEFINED__
-typedef interface IMachineDebugManager IMachineDebugManager;
-#endif 	/* __IMachineDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
-#define __IMachineDebugManagerCookie_FWD_DEFINED__
-typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
-#endif 	/* __IMachineDebugManagerCookie_FWD_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
-#define __IMachineDebugManagerEvents_FWD_DEFINED__
-typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
-#endif 	/* __IMachineDebugManagerEvents_FWD_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationEvents_FWD_DEFINED__
-#define __IRemoteDebugApplicationEvents_FWD_DEFINED__
-typedef interface IRemoteDebugApplicationEvents IRemoteDebugApplicationEvents;
-#endif 	/* __IRemoteDebugApplicationEvents_FWD_DEFINED__ */
-
-
-#ifndef __ISimpleConnectionPoint_FWD_DEFINED__
-#define __ISimpleConnectionPoint_FWD_DEFINED__
-typedef interface ISimpleConnectionPoint ISimpleConnectionPoint;
-#endif 	/* __ISimpleConnectionPoint_FWD_DEFINED__ */
-
-
-#ifndef __ProcessDebugManager_FWD_DEFINED__
-#define __ProcessDebugManager_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class ProcessDebugManager ProcessDebugManager;
-#else
-typedef struct ProcessDebugManager ProcessDebugManager;
-#endif /* __cplusplus */
-
-#endif 	/* __ProcessDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __DebugHelper_FWD_DEFINED__
-#define __DebugHelper_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class DebugHelper DebugHelper;
-#else
-typedef struct DebugHelper DebugHelper;
-#endif /* __cplusplus */
-
-#endif 	/* __DebugHelper_FWD_DEFINED__ */
-
-
-#ifndef __CDebugDocumentHelper_FWD_DEFINED__
-#define __CDebugDocumentHelper_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class CDebugDocumentHelper CDebugDocumentHelper;
-#else
-typedef struct CDebugDocumentHelper CDebugDocumentHelper;
-#endif /* __cplusplus */
-
-#endif 	/* __CDebugDocumentHelper_FWD_DEFINED__ */
-
-
-#ifndef __MachineDebugManager_FWD_DEFINED__
-#define __MachineDebugManager_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class MachineDebugManager MachineDebugManager;
-#else
-typedef struct MachineDebugManager MachineDebugManager;
-#endif /* __cplusplus */
-
-#endif 	/* __MachineDebugManager_FWD_DEFINED__ */
-
-
-#ifndef __DefaultDebugSessionProvider_FWD_DEFINED__
-#define __DefaultDebugSessionProvider_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class DefaultDebugSessionProvider DefaultDebugSessionProvider;
-#else
-typedef struct DefaultDebugSessionProvider DefaultDebugSessionProvider;
-#endif /* __cplusplus */
-
-#endif 	/* __DefaultDebugSessionProvider_FWD_DEFINED__ */
-
-
-/* header files for imported files */
-#include "ocidl.h"
-#include "activscp.h"
-#include "dbgprop.h"
-
-void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t);
-void __RPC_USER MIDL_user_free( void __RPC_FAR * ); 
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0000
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-//=--------------------------------------------------------------------------=
-// ActivDbg.h
-//=--------------------------------------------------------------------------=
-// (C) Copyright 1996 Microsoft Corporation.  All Rights Reserved.
-//
-// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
-// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
-// PARTICULAR PURPOSE.
-//=--------------------------------------------------------------------------=
-//
-#pragma comment(lib,"uuid.lib")
-//
-// Declarations for ActiveX Script authoring/Debugging.
-//
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagBREAKPOINT_STATE
-    {	BREAKPOINT_DELETED	= 0,
-	BREAKPOINT_DISABLED	= 1,
-	BREAKPOINT_ENABLED	= 2
-    }	BREAKPOINT_STATE;
-
-typedef DWORD APPBREAKFLAGS;
-
-#define	APPBREAKFLAG_DEBUGGER_BLOCK	( 0x1 )
-
-#define	APPBREAKFLAG_DEBUGGER_HALT	( 0x2 )
-
-#define	APPBREAKFLAG_STEP	( 0x10000 )
-
-#define	APPBREAKFLAG_NESTED	( 0x20000 )
-
-#define	APPBREAKFLAG_STEPTYPE_SOURCE	( 0 )
-
-#define	APPBREAKFLAG_STEPTYPE_BYTECODE	( 0x100000 )
-
-#define	APPBREAKFLAG_STEPTYPE_MACHINE	( 0x200000 )
-
-#define	APPBREAKFLAG_STEPTYPE_MASK	( 0xf00000 )
-
-#define	APPBREAKFLAG_IN_BREAKPOINT	( 0x80000000 )
-
-typedef 
-enum tagBREAKREASON
-    {	BREAKREASON_STEP	= 0,
-	BREAKREASON_BREAKPOINT	= BREAKREASON_STEP + 1,
-	BREAKREASON_DEBUGGER_BLOCK	= BREAKREASON_BREAKPOINT + 1,
-	BREAKREASON_HOST_INITIATED	= BREAKREASON_DEBUGGER_BLOCK + 1,
-	BREAKREASON_LANGUAGE_INITIATED	= BREAKREASON_HOST_INITIATED + 1,
-	BREAKREASON_DEBUGGER_HALT	= BREAKREASON_LANGUAGE_INITIATED + 1,
-	BREAKREASON_ERROR	= BREAKREASON_DEBUGGER_HALT + 1,
-	BREAKREASON_JIT	= BREAKREASON_ERROR + 1
-    }	BREAKREASON;
-
-typedef 
-enum tagBREAKRESUME_ACTION
-    {	BREAKRESUMEACTION_ABORT	= 0,
-	BREAKRESUMEACTION_CONTINUE	= BREAKRESUMEACTION_ABORT + 1,
-	BREAKRESUMEACTION_STEP_INTO	= BREAKRESUMEACTION_CONTINUE + 1,
-	BREAKRESUMEACTION_STEP_OVER	= BREAKRESUMEACTION_STEP_INTO + 1,
-	BREAKRESUMEACTION_STEP_OUT	= BREAKRESUMEACTION_STEP_OVER + 1,
-	BREAKRESUMEACTION_IGNORE	= BREAKRESUMEACTION_STEP_OUT + 1
-    }	BREAKRESUMEACTION;
-
-typedef 
-enum tagERRORRESUMEACTION
-    {	ERRORRESUMEACTION_ReexecuteErrorStatement	= 0,
-	ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller	= ERRORRESUMEACTION_ReexecuteErrorStatement + 1,
-	ERRORRESUMEACTION_SkipErrorStatement	= ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller + 1
-    }	ERRORRESUMEACTION;
-
-typedef 
-enum tagDOCUMENTNAMETYPE
-    {	DOCUMENTNAMETYPE_APPNODE	= 0,
-	DOCUMENTNAMETYPE_TITLE	= DOCUMENTNAMETYPE_APPNODE + 1,
-	DOCUMENTNAMETYPE_FILE_TAIL	= DOCUMENTNAMETYPE_TITLE + 1,
-	DOCUMENTNAMETYPE_URL	= DOCUMENTNAMETYPE_FILE_TAIL + 1
-    }	DOCUMENTNAMETYPE;
-
-typedef WORD SOURCE_TEXT_ATTR;
-
-#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 )
-
-typedef DWORD TEXT_DOC_ATTR;
-
-#define	TEXT_DOC_ATTR_READONLY	( 0x1 )
-
-#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 )
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0000_v0_0_s_ifspec;
-
-#ifndef __IActiveScriptDebug_INTERFACE_DEFINED__
-#define __IActiveScriptDebug_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IActiveScriptDebug
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IActiveScriptDebug;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C10-CB0C-11d0-B5C9-00A0244A0E7A")
-    IActiveScriptDebug : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes( 
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetScriptletTextAttributes( 
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumCodeContextsOfPosition( 
-            /* [in] */ DWORD dwSourceContext,
-            /* [in] */ ULONG uCharacterOffset,
-            /* [in] */ ULONG uNumChars,
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IActiveScriptDebugVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IActiveScriptDebug __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IActiveScriptDebug __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IActiveScriptDebug __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScriptTextAttributes )( 
-            IActiveScriptDebug __RPC_FAR * This,
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScriptletTextAttributes )( 
-            IActiveScriptDebug __RPC_FAR * This,
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumCodeContextsOfPosition )( 
-            IActiveScriptDebug __RPC_FAR * This,
-            /* [in] */ DWORD dwSourceContext,
-            /* [in] */ ULONG uCharacterOffset,
-            /* [in] */ ULONG uNumChars,
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-        
-        END_INTERFACE
-    } IActiveScriptDebugVtbl;
-
-    interface IActiveScriptDebug
-    {
-        CONST_VTBL struct IActiveScriptDebugVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IActiveScriptDebug_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IActiveScriptDebug_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IActiveScriptDebug_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IActiveScriptDebug_GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)	\
-    (This)->lpVtbl -> GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
-
-#define IActiveScriptDebug_GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)	\
-    (This)->lpVtbl -> GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
-
-#define IActiveScriptDebug_EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc)	\
-    (This)->lpVtbl -> EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptDebug_GetScriptTextAttributes_Proxy( 
-    IActiveScriptDebug __RPC_FAR * This,
-    /* [size_is][in] */ LPCOLESTR pstrCode,
-    /* [in] */ ULONG uNumCodeChars,
-    /* [in] */ LPCOLESTR pstrDelimiter,
-    /* [in] */ DWORD dwFlags,
-    /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-
-
-void __RPC_STUB IActiveScriptDebug_GetScriptTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptDebug_GetScriptletTextAttributes_Proxy( 
-    IActiveScriptDebug __RPC_FAR * This,
-    /* [size_is][in] */ LPCOLESTR pstrCode,
-    /* [in] */ ULONG uNumCodeChars,
-    /* [in] */ LPCOLESTR pstrDelimiter,
-    /* [in] */ DWORD dwFlags,
-    /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-
-
-void __RPC_STUB IActiveScriptDebug_GetScriptletTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptDebug_EnumCodeContextsOfPosition_Proxy( 
-    IActiveScriptDebug __RPC_FAR * This,
-    /* [in] */ DWORD dwSourceContext,
-    /* [in] */ ULONG uCharacterOffset,
-    /* [in] */ ULONG uNumChars,
-    /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-
-
-void __RPC_STUB IActiveScriptDebug_EnumCodeContextsOfPosition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IActiveScriptDebug_INTERFACE_DEFINED__ */
-
-
-#ifndef __IActiveScriptSiteDebug_INTERFACE_DEFINED__
-#define __IActiveScriptSiteDebug_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IActiveScriptSiteDebug
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IActiveScriptSiteDebug;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C11-CB0C-11d0-B5C9-00A0244A0E7A")
-    IActiveScriptSiteDebug : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentContextFromPosition( 
-            /* [in] */ DWORD dwSourceContext,
-            /* [in] */ ULONG uCharacterOffset,
-            /* [in] */ ULONG uNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetApplication( 
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetRootApplicationNode( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnScriptErrorDebug( 
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-            /* [out] */ BOOL __RPC_FAR *pfEnterDebugger,
-            /* [out] */ BOOL __RPC_FAR *pfCallOnScriptErrorWhenContinuing) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IActiveScriptSiteDebugVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IActiveScriptSiteDebug __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IActiveScriptSiteDebug __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentContextFromPosition )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [in] */ DWORD dwSourceContext,
-            /* [in] */ ULONG uCharacterOffset,
-            /* [in] */ ULONG uNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetApplication )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetRootApplicationNode )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnScriptErrorDebug )( 
-            IActiveScriptSiteDebug __RPC_FAR * This,
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-            /* [out] */ BOOL __RPC_FAR *pfEnterDebugger,
-            /* [out] */ BOOL __RPC_FAR *pfCallOnScriptErrorWhenContinuing);
-        
-        END_INTERFACE
-    } IActiveScriptSiteDebugVtbl;
-
-    interface IActiveScriptSiteDebug
-    {
-        CONST_VTBL struct IActiveScriptSiteDebugVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IActiveScriptSiteDebug_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IActiveScriptSiteDebug_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IActiveScriptSiteDebug_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IActiveScriptSiteDebug_GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc)	\
-    (This)->lpVtbl -> GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc)
-
-#define IActiveScriptSiteDebug_GetApplication(This,ppda)	\
-    (This)->lpVtbl -> GetApplication(This,ppda)
-
-#define IActiveScriptSiteDebug_GetRootApplicationNode(This,ppdanRoot)	\
-    (This)->lpVtbl -> GetRootApplicationNode(This,ppdanRoot)
-
-#define IActiveScriptSiteDebug_OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing)	\
-    (This)->lpVtbl -> OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug_GetDocumentContextFromPosition_Proxy( 
-    IActiveScriptSiteDebug __RPC_FAR * This,
-    /* [in] */ DWORD dwSourceContext,
-    /* [in] */ ULONG uCharacterOffset,
-    /* [in] */ ULONG uNumChars,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-
-
-void __RPC_STUB IActiveScriptSiteDebug_GetDocumentContextFromPosition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug_GetApplication_Proxy( 
-    IActiveScriptSiteDebug __RPC_FAR * This,
-    /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-
-
-void __RPC_STUB IActiveScriptSiteDebug_GetApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug_GetRootApplicationNode_Proxy( 
-    IActiveScriptSiteDebug __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-
-
-void __RPC_STUB IActiveScriptSiteDebug_GetRootApplicationNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug_OnScriptErrorDebug_Proxy( 
-    IActiveScriptSiteDebug __RPC_FAR * This,
-    /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-    /* [out] */ BOOL __RPC_FAR *pfEnterDebugger,
-    /* [out] */ BOOL __RPC_FAR *pfCallOnScriptErrorWhenContinuing);
-
-
-void __RPC_STUB IActiveScriptSiteDebug_OnScriptErrorDebug_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IActiveScriptSiteDebug_INTERFACE_DEFINED__ */
-
-
-#ifndef __IActiveScriptErrorDebug_INTERFACE_DEFINED__
-#define __IActiveScriptErrorDebug_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IActiveScriptErrorDebug
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IActiveScriptErrorDebug;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C12-CB0C-11d0-B5C9-00A0244A0E7A")
-    IActiveScriptErrorDebug : public IActiveScriptError
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentContext( 
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppssc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetStackFrame( 
-            /* [out] */ IDebugStackFrame __RPC_FAR *__RPC_FAR *ppdsf) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IActiveScriptErrorDebugVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IActiveScriptErrorDebug __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IActiveScriptErrorDebug __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetExceptionInfo )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ EXCEPINFO __RPC_FAR *pexcepinfo);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourcePosition )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwSourceContext,
-            /* [out] */ ULONG __RPC_FAR *pulLineNumber,
-            /* [out] */ LONG __RPC_FAR *plCharacterPosition);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSourceLineText )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrSourceLine);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentContext )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppssc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetStackFrame )( 
-            IActiveScriptErrorDebug __RPC_FAR * This,
-            /* [out] */ IDebugStackFrame __RPC_FAR *__RPC_FAR *ppdsf);
-        
-        END_INTERFACE
-    } IActiveScriptErrorDebugVtbl;
-
-    interface IActiveScriptErrorDebug
-    {
-        CONST_VTBL struct IActiveScriptErrorDebugVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-
-#define IActiveScriptErrorDebug_GetDocumentContext(This,ppssc)	\
-    (This)->lpVtbl -> GetDocumentContext(This,ppssc)
-
-#define IActiveScriptErrorDebug_GetStackFrame(This,ppdsf)	\
-    (This)->lpVtbl -> GetStackFrame(This,ppdsf)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptErrorDebug_GetDocumentContext_Proxy( 
-    IActiveScriptErrorDebug __RPC_FAR * This,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppssc);
-
-
-void __RPC_STUB IActiveScriptErrorDebug_GetDocumentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IActiveScriptErrorDebug_GetStackFrame_Proxy( 
-    IActiveScriptErrorDebug __RPC_FAR * This,
-    /* [out] */ IDebugStackFrame __RPC_FAR *__RPC_FAR *ppdsf);
-
-
-void __RPC_STUB IActiveScriptErrorDebug_GetStackFrame_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IActiveScriptErrorDebug_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugCodeContext_INTERFACE_DEFINED__
-#define __IDebugCodeContext_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugCodeContext
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugCodeContext;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C13-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugCodeContext : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentContext( 
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetBreakPoint( 
-            /* [in] */ BREAKPOINT_STATE bps) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugCodeContextVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugCodeContext __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugCodeContext __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugCodeContext __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentContext )( 
-            IDebugCodeContext __RPC_FAR * This,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetBreakPoint )( 
-            IDebugCodeContext __RPC_FAR * This,
-            /* [in] */ BREAKPOINT_STATE bps);
-        
-        END_INTERFACE
-    } IDebugCodeContextVtbl;
-
-    interface IDebugCodeContext
-    {
-        CONST_VTBL struct IDebugCodeContextVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugCodeContext_GetDocumentContext(This,ppsc)	\
-    (This)->lpVtbl -> GetDocumentContext(This,ppsc)
-
-#define IDebugCodeContext_SetBreakPoint(This,bps)	\
-    (This)->lpVtbl -> SetBreakPoint(This,bps)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugCodeContext_GetDocumentContext_Proxy( 
-    IDebugCodeContext __RPC_FAR * This,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-
-
-void __RPC_STUB IDebugCodeContext_GetDocumentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugCodeContext_SetBreakPoint_Proxy( 
-    IDebugCodeContext __RPC_FAR * This,
-    /* [in] */ BREAKPOINT_STATE bps);
-
-
-void __RPC_STUB IDebugCodeContext_SetBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugCodeContext_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugExpression_INTERFACE_DEFINED__
-#define __IDebugExpression_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugExpression
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugExpression;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C14-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugExpression : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE Start( 
-            /* [in] */ IDebugExpressionCallBack __RPC_FAR *pdecb) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryIsComplete( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetResultAsString( 
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ BSTR __RPC_FAR *pbstrResult) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetResultAsDebugProperty( 
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdp) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugExpressionVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugExpression __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugExpression __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugExpression __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Start )( 
-            IDebugExpression __RPC_FAR * This,
-            /* [in] */ IDebugExpressionCallBack __RPC_FAR *pdecb);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Abort )( 
-            IDebugExpression __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryIsComplete )( 
-            IDebugExpression __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetResultAsString )( 
-            IDebugExpression __RPC_FAR * This,
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ BSTR __RPC_FAR *pbstrResult);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetResultAsDebugProperty )( 
-            IDebugExpression __RPC_FAR * This,
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdp);
-        
-        END_INTERFACE
-    } IDebugExpressionVtbl;
-
-    interface IDebugExpression
-    {
-        CONST_VTBL struct IDebugExpressionVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_Start_Proxy( 
-    IDebugExpression __RPC_FAR * This,
-    /* [in] */ IDebugExpressionCallBack __RPC_FAR *pdecb);
-
-
-void __RPC_STUB IDebugExpression_Start_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_Abort_Proxy( 
-    IDebugExpression __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugExpression_Abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_QueryIsComplete_Proxy( 
-    IDebugExpression __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugExpression_QueryIsComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_GetResultAsString_Proxy( 
-    IDebugExpression __RPC_FAR * This,
-    /* [out] */ HRESULT __RPC_FAR *phrResult,
-    /* [out] */ BSTR __RPC_FAR *pbstrResult);
-
-
-void __RPC_STUB IDebugExpression_GetResultAsString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpression_GetResultAsDebugProperty_Proxy( 
-    IDebugExpression __RPC_FAR * This,
-    /* [out] */ HRESULT __RPC_FAR *phrResult,
-    /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdp);
-
-
-void __RPC_STUB IDebugExpression_GetResultAsDebugProperty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugExpression_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugExpressionContext_INTERFACE_DEFINED__
-#define __IDebugExpressionContext_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugExpressionContext
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugExpressionContext;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C15-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugExpressionContext : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE ParseLanguageText( 
-            /* [in] */ LPCOLESTR pstrCode,
-            /* [in] */ UINT nRadix,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [out] */ IDebugExpression __RPC_FAR *__RPC_FAR *ppe) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetLanguageInfo( 
-            /* [out] */ BSTR __RPC_FAR *pbstrLanguageName,
-            /* [out] */ GUID __RPC_FAR *pLanguageID) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugExpressionContextVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugExpressionContext __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugExpressionContext __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugExpressionContext __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ParseLanguageText )( 
-            IDebugExpressionContext __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrCode,
-            /* [in] */ UINT nRadix,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [out] */ IDebugExpression __RPC_FAR *__RPC_FAR *ppe);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLanguageInfo )( 
-            IDebugExpressionContext __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrLanguageName,
-            /* [out] */ GUID __RPC_FAR *pLanguageID);
-        
-        END_INTERFACE
-    } IDebugExpressionContextVtbl;
-
-    interface IDebugExpressionContext
-    {
-        CONST_VTBL struct IDebugExpressionContextVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpressionContext_ParseLanguageText_Proxy( 
-    IDebugExpressionContext __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrCode,
-    /* [in] */ UINT nRadix,
-    /* [in] */ LPCOLESTR pstrDelimiter,
-    /* [in] */ DWORD dwFlags,
-    /* [out] */ IDebugExpression __RPC_FAR *__RPC_FAR *ppe);
-
-
-void __RPC_STUB IDebugExpressionContext_ParseLanguageText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpressionContext_GetLanguageInfo_Proxy( 
-    IDebugExpressionContext __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrLanguageName,
-    /* [out] */ GUID __RPC_FAR *pLanguageID);
-
-
-void __RPC_STUB IDebugExpressionContext_GetLanguageInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugExpressionContext_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugExpressionCallBack_INTERFACE_DEFINED__
-#define __IDebugExpressionCallBack_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugExpressionCallBack
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugExpressionCallBack;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C16-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugExpressionCallBack : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onComplete( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugExpressionCallBackVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugExpressionCallBack __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugExpressionCallBack __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugExpressionCallBack __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onComplete )( 
-            IDebugExpressionCallBack __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugExpressionCallBackVtbl;
-
-    interface IDebugExpressionCallBack
-    {
-        CONST_VTBL struct IDebugExpressionCallBackVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugExpressionCallBack_onComplete(This)	\
-    (This)->lpVtbl -> onComplete(This)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugExpressionCallBack_onComplete_Proxy( 
-    IDebugExpressionCallBack __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugExpressionCallBack_onComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugExpressionCallBack_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugStackFrame_INTERFACE_DEFINED__
-#define __IDebugStackFrame_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugStackFrame
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugStackFrame;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C17-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugStackFrame : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetCodeContext( 
-            /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *ppcc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDescriptionString( 
-            /* [in] */ BOOL fLong,
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetLanguageString( 
-            /* [in] */ BOOL fLong,
-            /* [out] */ BSTR __RPC_FAR *pbstrLanguage) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetThread( 
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDebugProperty( 
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppDebugProp) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugStackFrameVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugStackFrame __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugStackFrame __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetCodeContext )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *ppcc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDescriptionString )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [in] */ BOOL fLong,
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLanguageString )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [in] */ BOOL fLong,
-            /* [out] */ BSTR __RPC_FAR *pbstrLanguage);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetThread )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDebugProperty )( 
-            IDebugStackFrame __RPC_FAR * This,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppDebugProp);
-        
-        END_INTERFACE
-    } IDebugStackFrameVtbl;
-
-    interface IDebugStackFrame
-    {
-        CONST_VTBL struct IDebugStackFrameVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetCodeContext_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *ppcc);
-
-
-void __RPC_STUB IDebugStackFrame_GetCodeContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetDescriptionString_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [in] */ BOOL fLong,
-    /* [out] */ BSTR __RPC_FAR *pbstrDescription);
-
-
-void __RPC_STUB IDebugStackFrame_GetDescriptionString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetLanguageString_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [in] */ BOOL fLong,
-    /* [out] */ BSTR __RPC_FAR *pbstrLanguage);
-
-
-void __RPC_STUB IDebugStackFrame_GetLanguageString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetThread_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppat);
-
-
-void __RPC_STUB IDebugStackFrame_GetThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetDebugProperty_Proxy( 
-    IDebugStackFrame __RPC_FAR * This,
-    /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppDebugProp);
-
-
-void __RPC_STUB IDebugStackFrame_GetDebugProperty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugStackFrame_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSniffer_INTERFACE_DEFINED__
-#define __IDebugStackFrameSniffer_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugStackFrameSniffer
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugStackFrameSniffer;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C18-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugStackFrameSniffer : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE EnumStackFrames( 
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugStackFrameSnifferVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugStackFrameSniffer __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugStackFrameSniffer __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugStackFrameSniffer __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFrames )( 
-            IDebugStackFrameSniffer __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        END_INTERFACE
-    } IDebugStackFrameSnifferVtbl;
-
-    interface IDebugStackFrameSniffer
-    {
-        CONST_VTBL struct IDebugStackFrameSnifferVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugStackFrameSniffer_EnumStackFrames(This,ppedsf)	\
-    (This)->lpVtbl -> EnumStackFrames(This,ppedsf)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrameSniffer_EnumStackFrames_Proxy( 
-    IDebugStackFrameSniffer __RPC_FAR * This,
-    /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-
-
-void __RPC_STUB IDebugStackFrameSniffer_EnumStackFrames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugStackFrameSniffer_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugStackFrameSnifferEx_INTERFACE_DEFINED__
-#define __IDebugStackFrameSnifferEx_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugStackFrameSnifferEx
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugStackFrameSnifferEx;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C19-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugStackFrameSnifferEx : public IDebugStackFrameSniffer
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE EnumStackFramesEx( 
-            /* [in] */ DWORD dwSpMin,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugStackFrameSnifferExVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFrames )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFramesEx )( 
-            IDebugStackFrameSnifferEx __RPC_FAR * This,
-            /* [in] */ DWORD dwSpMin,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        END_INTERFACE
-    } IDebugStackFrameSnifferExVtbl;
-
-    interface IDebugStackFrameSnifferEx
-    {
-        CONST_VTBL struct IDebugStackFrameSnifferExVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IDebugStackFrameSnifferEx_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IDebugStackFrameSnifferEx_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IDebugStackFrameSnifferEx_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IDebugStackFrameSnifferEx_EnumStackFrames(This,ppedsf)	\
-    (This)->lpVtbl -> EnumStackFrames(This,ppedsf)
-
-
-#define IDebugStackFrameSnifferEx_EnumStackFramesEx(This,dwSpMin,ppedsf)	\
-    (This)->lpVtbl -> EnumStackFramesEx(This,dwSpMin,ppedsf)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugStackFrameSnifferEx_EnumStackFramesEx_Proxy( 
-    IDebugStackFrameSnifferEx __RPC_FAR * This,
-    /* [in] */ DWORD dwSpMin,
-    /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-
-
-void __RPC_STUB IDebugStackFrameSnifferEx_EnumStackFramesEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugStackFrameSnifferEx_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugSyncOperation_INTERFACE_DEFINED__
-#define __IDebugSyncOperation_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugSyncOperation
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugSyncOperation;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1a-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugSyncOperation : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetTargetThread( 
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppatTarget) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Execute( 
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE InProgressAbort( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugSyncOperationVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugSyncOperation __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugSyncOperation __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugSyncOperation __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTargetThread )( 
-            IDebugSyncOperation __RPC_FAR * This,
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppatTarget);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Execute )( 
-            IDebugSyncOperation __RPC_FAR * This,
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *InProgressAbort )( 
-            IDebugSyncOperation __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugSyncOperationVtbl;
-
-    interface IDebugSyncOperation
-    {
-        CONST_VTBL struct IDebugSyncOperationVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugSyncOperation_GetTargetThread_Proxy( 
-    IDebugSyncOperation __RPC_FAR * This,
-    /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *ppatTarget);
-
-
-void __RPC_STUB IDebugSyncOperation_GetTargetThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugSyncOperation_Execute_Proxy( 
-    IDebugSyncOperation __RPC_FAR * This,
-    /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult);
-
-
-void __RPC_STUB IDebugSyncOperation_Execute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugSyncOperation_InProgressAbort_Proxy( 
-    IDebugSyncOperation __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugSyncOperation_InProgressAbort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugSyncOperation_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperation_INTERFACE_DEFINED__
-#define __IDebugAsyncOperation_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugAsyncOperation
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugAsyncOperation;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1b-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugAsyncOperation : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetSyncDebugOperation( 
-            /* [out] */ IDebugSyncOperation __RPC_FAR *__RPC_FAR *ppsdo) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Start( 
-            IDebugAsyncOperationCallBack __RPC_FAR *padocb) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryIsComplete( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetResult( 
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugAsyncOperationVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugAsyncOperation __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugAsyncOperation __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugAsyncOperation __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSyncDebugOperation )( 
-            IDebugAsyncOperation __RPC_FAR * This,
-            /* [out] */ IDebugSyncOperation __RPC_FAR *__RPC_FAR *ppsdo);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Start )( 
-            IDebugAsyncOperation __RPC_FAR * This,
-            IDebugAsyncOperationCallBack __RPC_FAR *padocb);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Abort )( 
-            IDebugAsyncOperation __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryIsComplete )( 
-            IDebugAsyncOperation __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetResult )( 
-            IDebugAsyncOperation __RPC_FAR * This,
-            /* [out] */ HRESULT __RPC_FAR *phrResult,
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult);
-        
-        END_INTERFACE
-    } IDebugAsyncOperationVtbl;
-
-    interface IDebugAsyncOperation
-    {
-        CONST_VTBL struct IDebugAsyncOperationVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_GetSyncDebugOperation_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This,
-    /* [out] */ IDebugSyncOperation __RPC_FAR *__RPC_FAR *ppsdo);
-
-
-void __RPC_STUB IDebugAsyncOperation_GetSyncDebugOperation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_Start_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This,
-    IDebugAsyncOperationCallBack __RPC_FAR *padocb);
-
-
-void __RPC_STUB IDebugAsyncOperation_Start_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_Abort_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugAsyncOperation_Abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_QueryIsComplete_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugAsyncOperation_QueryIsComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_GetResult_Proxy( 
-    IDebugAsyncOperation __RPC_FAR * This,
-    /* [out] */ HRESULT __RPC_FAR *phrResult,
-    /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkResult);
-
-
-void __RPC_STUB IDebugAsyncOperation_GetResult_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugAsyncOperation_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__
-#define __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugAsyncOperationCallBack
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugAsyncOperationCallBack;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1c-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugAsyncOperationCallBack : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onComplete( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugAsyncOperationCallBackVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugAsyncOperationCallBack __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugAsyncOperationCallBack __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugAsyncOperationCallBack __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onComplete )( 
-            IDebugAsyncOperationCallBack __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugAsyncOperationCallBackVtbl;
-
-    interface IDebugAsyncOperationCallBack
-    {
-        CONST_VTBL struct IDebugAsyncOperationCallBackVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugAsyncOperationCallBack_onComplete(This)	\
-    (This)->lpVtbl -> onComplete(This)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugAsyncOperationCallBack_onComplete_Proxy( 
-    IDebugAsyncOperationCallBack __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugAsyncOperationCallBack_onComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumDebugCodeContexts_INTERFACE_DEFINED__
-#define __IEnumDebugCodeContexts_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumDebugCodeContexts
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumDebugCodeContexts;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1d-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumDebugCodeContexts : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumDebugCodeContextsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumDebugCodeContexts __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumDebugCodeContexts __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumDebugCodeContexts __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumDebugCodeContexts __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumDebugCodeContexts __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumDebugCodeContexts __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumDebugCodeContexts __RPC_FAR * This,
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-        
-        END_INTERFACE
-    } IEnumDebugCodeContextsVtbl;
-
-    interface IEnumDebugCodeContexts
-    {
-        CONST_VTBL struct IEnumDebugCodeContextsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugCodeContexts_RemoteNext_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumDebugCodeContexts_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Skip_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumDebugCodeContexts_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Reset_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumDebugCodeContexts_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Clone_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-
-
-void __RPC_STUB IEnumDebugCodeContexts_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumDebugCodeContexts_INTERFACE_DEFINED__ */
-
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0177
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-typedef struct  tagDebugStackFrameDescriptor
-    {
-    IDebugStackFrame __RPC_FAR *pdsf;
-    DWORD dwMin;
-    DWORD dwLim;
-    BOOL fFinal;
-    IUnknown __RPC_FAR *punkFinal;
-    }	DebugStackFrameDescriptor;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0177_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0177_v0_0_s_ifspec;
-
-#ifndef __IEnumDebugStackFrames_INTERFACE_DEFINED__
-#define __IEnumDebugStackFrames_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumDebugStackFrames
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumDebugStackFrames;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1e-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumDebugStackFrames : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumDebugStackFramesVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumDebugStackFrames __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumDebugStackFrames __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumDebugStackFrames __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumDebugStackFrames __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumDebugStackFrames __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumDebugStackFrames __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumDebugStackFrames __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        END_INTERFACE
-    } IEnumDebugStackFramesVtbl;
-
-    interface IEnumDebugStackFrames
-    {
-        CONST_VTBL struct IEnumDebugStackFramesVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugStackFrames_RemoteNext_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumDebugStackFrames_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Skip_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumDebugStackFrames_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Reset_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumDebugStackFrames_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Clone_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-
-
-void __RPC_STUB IEnumDebugStackFrames_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumDebugStackFrames_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentInfo_INTERFACE_DEFINED__
-#define __IDebugDocumentInfo_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentInfo
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [optimize][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentInfo;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C1f-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetName( 
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentClassId( 
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentInfoVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentInfo __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentInfo __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentInfo __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocumentInfo __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocumentInfo __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        END_INTERFACE
-    } IDebugDocumentInfoVtbl;
-
-    interface IDebugDocumentInfo
-    {
-        CONST_VTBL struct IDebugDocumentInfoVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentInfo_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocumentInfo_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentInfo_GetName_Proxy( 
-    IDebugDocumentInfo __RPC_FAR * This,
-    /* [in] */ DOCUMENTNAMETYPE dnt,
-    /* [out] */ BSTR __RPC_FAR *pbstrName);
-
-
-void __RPC_STUB IDebugDocumentInfo_GetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentInfo_GetDocumentClassId_Proxy( 
-    IDebugDocumentInfo __RPC_FAR * This,
-    /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-
-
-void __RPC_STUB IDebugDocumentInfo_GetDocumentClassId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentInfo_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentProvider_INTERFACE_DEFINED__
-#define __IDebugDocumentProvider_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentProvider
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentProvider;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C20-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentProvider : public IDebugDocumentInfo
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocument( 
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppssd) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentProviderVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentProvider __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentProvider __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentProvider __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocumentProvider __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocumentProvider __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocument )( 
-            IDebugDocumentProvider __RPC_FAR * This,
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppssd);
-        
-        END_INTERFACE
-    } IDebugDocumentProviderVtbl;
-
-    interface IDebugDocumentProvider
-    {
-        CONST_VTBL struct IDebugDocumentProviderVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentProvider_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocumentProvider_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-#define IDebugDocumentProvider_GetDocument(This,ppssd)	\
-    (This)->lpVtbl -> GetDocument(This,ppssd)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentProvider_GetDocument_Proxy( 
-    IDebugDocumentProvider __RPC_FAR * This,
-    /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppssd);
-
-
-void __RPC_STUB IDebugDocumentProvider_GetDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentProvider_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocument_INTERFACE_DEFINED__
-#define __IDebugDocument_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocument
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocument;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C21-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocument : public IDebugDocumentInfo
-    {
-    public:
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocument __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocument __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocument __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocument __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocument __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        END_INTERFACE
-    } IDebugDocumentVtbl;
-
-    interface IDebugDocument
-    {
-        CONST_VTBL struct IDebugDocumentVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocument_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocument_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-
-#endif 	/* __IDebugDocument_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentText_INTERFACE_DEFINED__
-#define __IDebugDocumentText_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentText
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentText;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C22-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentText : public IDebugDocument
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocumentAttributes( 
-            /* [out] */ TEXT_DOC_ATTR __RPC_FAR *ptextdocattr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetSize( 
-            /* [out] */ ULONG __RPC_FAR *pcNumLines,
-            /* [out] */ ULONG __RPC_FAR *pcNumChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetPositionOfLine( 
-            /* [in] */ ULONG cLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetLineOfPosition( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *pcLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterOffsetInLine) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [full][size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetPositionOfContext( 
-            /* [in] */ IDebugDocumentContext __RPC_FAR *psc,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *cNumChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetContextOfPosition( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentTextVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentText __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentText __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentAttributes )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [out] */ TEXT_DOC_ATTR __RPC_FAR *ptextdocattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSize )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [out] */ ULONG __RPC_FAR *pcNumLines,
-            /* [out] */ ULONG __RPC_FAR *pcNumChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPositionOfLine )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ ULONG cLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLineOfPosition )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *pcLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterOffsetInLine);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetText )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [full][size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPositionOfContext )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ IDebugDocumentContext __RPC_FAR *psc,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *cNumChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetContextOfPosition )( 
-            IDebugDocumentText __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-        
-        END_INTERFACE
-    } IDebugDocumentTextVtbl;
-
-    interface IDebugDocumentText
-    {
-        CONST_VTBL struct IDebugDocumentTextVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentText_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocumentText_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetDocumentAttributes_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [out] */ TEXT_DOC_ATTR __RPC_FAR *ptextdocattr);
-
-
-void __RPC_STUB IDebugDocumentText_GetDocumentAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetSize_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [out] */ ULONG __RPC_FAR *pcNumLines,
-    /* [out] */ ULONG __RPC_FAR *pcNumChars);
-
-
-void __RPC_STUB IDebugDocumentText_GetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetPositionOfLine_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ ULONG cLineNumber,
-    /* [out] */ ULONG __RPC_FAR *pcCharacterPosition);
-
-
-void __RPC_STUB IDebugDocumentText_GetPositionOfLine_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetLineOfPosition_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [out] */ ULONG __RPC_FAR *pcLineNumber,
-    /* [out] */ ULONG __RPC_FAR *pcCharacterOffsetInLine);
-
-
-void __RPC_STUB IDebugDocumentText_GetLineOfPosition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetText_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-    /* [full][size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-    /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-    /* [in] */ ULONG cMaxChars);
-
-
-void __RPC_STUB IDebugDocumentText_GetText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetPositionOfContext_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ IDebugDocumentContext __RPC_FAR *psc,
-    /* [out] */ ULONG __RPC_FAR *pcCharacterPosition,
-    /* [out] */ ULONG __RPC_FAR *cNumChars);
-
-
-void __RPC_STUB IDebugDocumentText_GetPositionOfContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetContextOfPosition_Proxy( 
-    IDebugDocumentText __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumChars,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-
-
-void __RPC_STUB IDebugDocumentText_GetContextOfPosition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentText_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextEvents_INTERFACE_DEFINED__
-#define __IDebugDocumentTextEvents_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentTextEvents
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentTextEvents;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C23-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentTextEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onDestroy( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onInsertText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToInsert) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onRemoveText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToRemove) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onReplaceText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToReplace) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onUpdateTextAttributes( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToUpdate) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onUpdateDocumentAttributes( 
-            /* [in] */ TEXT_DOC_ATTR textdocattr) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentTextEventsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentTextEvents __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentTextEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onDestroy )( 
-            IDebugDocumentTextEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onInsertText )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToInsert);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onRemoveText )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToRemove);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onReplaceText )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToReplace);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onUpdateTextAttributes )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToUpdate);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onUpdateDocumentAttributes )( 
-            IDebugDocumentTextEvents __RPC_FAR * This,
-            /* [in] */ TEXT_DOC_ATTR textdocattr);
-        
-        END_INTERFACE
-    } IDebugDocumentTextEventsVtbl;
-
-    interface IDebugDocumentTextEvents
-    {
-        CONST_VTBL struct IDebugDocumentTextEventsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onDestroy_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onDestroy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onInsertText_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToInsert);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onInsertText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onRemoveText_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToRemove);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onRemoveText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onReplaceText_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToReplace);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onReplaceText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onUpdateTextAttributes_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToUpdate);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onUpdateTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onUpdateDocumentAttributes_Proxy( 
-    IDebugDocumentTextEvents __RPC_FAR * This,
-    /* [in] */ TEXT_DOC_ATTR textdocattr);
-
-
-void __RPC_STUB IDebugDocumentTextEvents_onUpdateDocumentAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentTextEvents_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextAuthor_INTERFACE_DEFINED__
-#define __IDebugDocumentTextAuthor_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentTextAuthor
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentTextAuthor;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C24-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentTextAuthor : public IDebugDocumentText
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE InsertText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToInsert,
-            /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToRemove) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE ReplaceText( 
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToReplace,
-            /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentTextAuthorVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentAttributes )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [out] */ TEXT_DOC_ATTR __RPC_FAR *ptextdocattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSize )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [out] */ ULONG __RPC_FAR *pcNumLines,
-            /* [out] */ ULONG __RPC_FAR *pcNumChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPositionOfLine )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLineOfPosition )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *pcLineNumber,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterOffsetInLine);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetText )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [full][size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPositionOfContext )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ IDebugDocumentContext __RPC_FAR *psc,
-            /* [out] */ ULONG __RPC_FAR *pcCharacterPosition,
-            /* [out] */ ULONG __RPC_FAR *cNumChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetContextOfPosition )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppsc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *InsertText )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToInsert,
-            /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveText )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToRemove);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ReplaceText )( 
-            IDebugDocumentTextAuthor __RPC_FAR * This,
-            /* [in] */ ULONG cCharacterPosition,
-            /* [in] */ ULONG cNumToReplace,
-            /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]);
-        
-        END_INTERFACE
-    } IDebugDocumentTextAuthorVtbl;
-
-    interface IDebugDocumentTextAuthor
-    {
-        CONST_VTBL struct IDebugDocumentTextAuthorVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentTextAuthor_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugDocumentTextAuthor_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_InsertText_Proxy( 
-    IDebugDocumentTextAuthor __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToInsert,
-    /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]);
-
-
-void __RPC_STUB IDebugDocumentTextAuthor_InsertText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_RemoveText_Proxy( 
-    IDebugDocumentTextAuthor __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToRemove);
-
-
-void __RPC_STUB IDebugDocumentTextAuthor_RemoveText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_ReplaceText_Proxy( 
-    IDebugDocumentTextAuthor __RPC_FAR * This,
-    /* [in] */ ULONG cCharacterPosition,
-    /* [in] */ ULONG cNumToReplace,
-    /* [size_is][in] */ OLECHAR __RPC_FAR pcharText[  ]);
-
-
-void __RPC_STUB IDebugDocumentTextAuthor_ReplaceText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentTextAuthor_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__
-#define __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentTextExternalAuthor
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentTextExternalAuthor;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C25-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentTextExternalAuthor : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetPathName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-            /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetFileName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrShortName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE NotifyChanged( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentTextExternalAuthorVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPathName )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-            /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetFileName )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrShortName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *NotifyChanged )( 
-            IDebugDocumentTextExternalAuthor __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugDocumentTextExternalAuthorVtbl;
-
-    interface IDebugDocumentTextExternalAuthor
-    {
-        CONST_VTBL struct IDebugDocumentTextExternalAuthorVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_GetPathName_Proxy( 
-    IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-    /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile);
-
-
-void __RPC_STUB IDebugDocumentTextExternalAuthor_GetPathName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_GetFileName_Proxy( 
-    IDebugDocumentTextExternalAuthor __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrShortName);
-
-
-void __RPC_STUB IDebugDocumentTextExternalAuthor_GetFileName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_NotifyChanged_Proxy( 
-    IDebugDocumentTextExternalAuthor __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentTextExternalAuthor_NotifyChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHelper_INTERFACE_DEFINED__
-#define __IDebugDocumentHelper_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentHelper
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentHelper;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C26-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentHelper : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE Init( 
-            /* [in] */ IDebugApplication __RPC_FAR *pda,
-            /* [string][in] */ LPCOLESTR pszShortName,
-            /* [string][in] */ LPCOLESTR pszLongName,
-            /* [in] */ TEXT_DOC_ATTR docAttr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Attach( 
-            /* [in] */ IDebugDocumentHelper __RPC_FAR *pddhParent) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Detach( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddUnicodeText( 
-            /* [string][in] */ LPCOLESTR pszText) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddDBCSText( 
-            /* [string][in] */ LPCSTR pszText) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDebugDocumentHost( 
-            /* [in] */ IDebugDocumentHost __RPC_FAR *pddh) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddDeferredText( 
-            /* [in] */ ULONG cChars,
-            /* [in] */ DWORD dwTextStartCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE DefineScriptBlock( 
-            /* [in] */ ULONG ulCharOffset,
-            /* [in] */ ULONG cChars,
-            /* [in] */ IActiveScript __RPC_FAR *pas,
-            /* [in] */ BOOL fScriptlet,
-            /* [out] */ DWORD __RPC_FAR *pdwSourceContext) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDefaultTextAttr( 
-            SOURCE_TEXT_ATTR staTextAttr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetTextAttributes( 
-            /* [in] */ ULONG ulCharOffset,
-            /* [in] */ ULONG cChars,
-            /* [size_is][length_is][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetLongName( 
-            /* [string][in] */ LPCOLESTR pszLongName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetShortName( 
-            /* [string][in] */ LPCOLESTR pszShortName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDocumentAttr( 
-            /* [in] */ TEXT_DOC_ATTR pszAttributes) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDebugApplicationNode( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdan) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetScriptBlockInfo( 
-            /* [in] */ DWORD dwSourceContext,
-            /* [out] */ IActiveScript __RPC_FAR *__RPC_FAR *ppasd,
-            /* [out] */ ULONG __RPC_FAR *piCharPos,
-            /* [out] */ ULONG __RPC_FAR *pcChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentContext( 
-            /* [in] */ ULONG iCharPos,
-            /* [in] */ ULONG cChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppddc) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop( 
-            IDebugDocumentContext __RPC_FAR *pddc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentHelperVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentHelper __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentHelper __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Init )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ IDebugApplication __RPC_FAR *pda,
-            /* [string][in] */ LPCOLESTR pszShortName,
-            /* [string][in] */ LPCOLESTR pszLongName,
-            /* [in] */ TEXT_DOC_ATTR docAttr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Attach )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ IDebugDocumentHelper __RPC_FAR *pddhParent);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Detach )( 
-            IDebugDocumentHelper __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddUnicodeText )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [string][in] */ LPCOLESTR pszText);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddDBCSText )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [string][in] */ LPCSTR pszText);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDebugDocumentHost )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ IDebugDocumentHost __RPC_FAR *pddh);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddDeferredText )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ ULONG cChars,
-            /* [in] */ DWORD dwTextStartCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DefineScriptBlock )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ ULONG ulCharOffset,
-            /* [in] */ ULONG cChars,
-            /* [in] */ IActiveScript __RPC_FAR *pas,
-            /* [in] */ BOOL fScriptlet,
-            /* [out] */ DWORD __RPC_FAR *pdwSourceContext);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDefaultTextAttr )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            SOURCE_TEXT_ATTR staTextAttr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetTextAttributes )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ ULONG ulCharOffset,
-            /* [in] */ ULONG cChars,
-            /* [size_is][length_is][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetLongName )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [string][in] */ LPCOLESTR pszLongName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetShortName )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [string][in] */ LPCOLESTR pszShortName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDocumentAttr )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ TEXT_DOC_ATTR pszAttributes);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDebugApplicationNode )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdan);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScriptBlockInfo )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ DWORD dwSourceContext,
-            /* [out] */ IActiveScript __RPC_FAR *__RPC_FAR *ppasd,
-            /* [out] */ ULONG __RPC_FAR *piCharPos,
-            /* [out] */ ULONG __RPC_FAR *pcChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateDebugDocumentContext )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            /* [in] */ ULONG iCharPos,
-            /* [in] */ ULONG cChars,
-            /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppddc);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *BringDocumentToTop )( 
-            IDebugDocumentHelper __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *BringDocumentContextToTop )( 
-            IDebugDocumentHelper __RPC_FAR * This,
-            IDebugDocumentContext __RPC_FAR *pddc);
-        
-        END_INTERFACE
-    } IDebugDocumentHelperVtbl;
-
-    interface IDebugDocumentHelper
-    {
-        CONST_VTBL struct IDebugDocumentHelperVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IDebugDocumentHelper_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IDebugDocumentHelper_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IDebugDocumentHelper_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IDebugDocumentHelper_Init(This,pda,pszShortName,pszLongName,docAttr)	\
-    (This)->lpVtbl -> Init(This,pda,pszShortName,pszLongName,docAttr)
-
-#define IDebugDocumentHelper_Attach(This,pddhParent)	\
-    (This)->lpVtbl -> Attach(This,pddhParent)
-
-#define IDebugDocumentHelper_Detach(This)	\
-    (This)->lpVtbl -> Detach(This)
-
-#define IDebugDocumentHelper_AddUnicodeText(This,pszText)	\
-    (This)->lpVtbl -> AddUnicodeText(This,pszText)
-
-#define IDebugDocumentHelper_AddDBCSText(This,pszText)	\
-    (This)->lpVtbl -> AddDBCSText(This,pszText)
-
-#define IDebugDocumentHelper_SetDebugDocumentHost(This,pddh)	\
-    (This)->lpVtbl -> SetDebugDocumentHost(This,pddh)
-
-#define IDebugDocumentHelper_AddDeferredText(This,cChars,dwTextStartCookie)	\
-    (This)->lpVtbl -> AddDeferredText(This,cChars,dwTextStartCookie)
-
-#define IDebugDocumentHelper_DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext)	\
-    (This)->lpVtbl -> DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext)
-
-#define IDebugDocumentHelper_SetDefaultTextAttr(This,staTextAttr)	\
-    (This)->lpVtbl -> SetDefaultTextAttr(This,staTextAttr)
-
-#define IDebugDocumentHelper_SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr)	\
-    (This)->lpVtbl -> SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr)
-
-#define IDebugDocumentHelper_SetLongName(This,pszLongName)	\
-    (This)->lpVtbl -> SetLongName(This,pszLongName)
-
-#define IDebugDocumentHelper_SetShortName(This,pszShortName)	\
-    (This)->lpVtbl -> SetShortName(This,pszShortName)
-
-#define IDebugDocumentHelper_SetDocumentAttr(This,pszAttributes)	\
-    (This)->lpVtbl -> SetDocumentAttr(This,pszAttributes)
-
-#define IDebugDocumentHelper_GetDebugApplicationNode(This,ppdan)	\
-    (This)->lpVtbl -> GetDebugApplicationNode(This,ppdan)
-
-#define IDebugDocumentHelper_GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars)	\
-    (This)->lpVtbl -> GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars)
-
-#define IDebugDocumentHelper_CreateDebugDocumentContext(This,iCharPos,cChars,ppddc)	\
-    (This)->lpVtbl -> CreateDebugDocumentContext(This,iCharPos,cChars,ppddc)
-
-#define IDebugDocumentHelper_BringDocumentToTop(This)	\
-    (This)->lpVtbl -> BringDocumentToTop(This)
-
-#define IDebugDocumentHelper_BringDocumentContextToTop(This,pddc)	\
-    (This)->lpVtbl -> BringDocumentContextToTop(This,pddc)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_Init_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ IDebugApplication __RPC_FAR *pda,
-    /* [string][in] */ LPCOLESTR pszShortName,
-    /* [string][in] */ LPCOLESTR pszLongName,
-    /* [in] */ TEXT_DOC_ATTR docAttr);
-
-
-void __RPC_STUB IDebugDocumentHelper_Init_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_Attach_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ IDebugDocumentHelper __RPC_FAR *pddhParent);
-
-
-void __RPC_STUB IDebugDocumentHelper_Attach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_Detach_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentHelper_Detach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_AddUnicodeText_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [string][in] */ LPCOLESTR pszText);
-
-
-void __RPC_STUB IDebugDocumentHelper_AddUnicodeText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_AddDBCSText_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [string][in] */ LPCSTR pszText);
-
-
-void __RPC_STUB IDebugDocumentHelper_AddDBCSText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetDebugDocumentHost_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ IDebugDocumentHost __RPC_FAR *pddh);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetDebugDocumentHost_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_AddDeferredText_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ ULONG cChars,
-    /* [in] */ DWORD dwTextStartCookie);
-
-
-void __RPC_STUB IDebugDocumentHelper_AddDeferredText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_DefineScriptBlock_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ ULONG ulCharOffset,
-    /* [in] */ ULONG cChars,
-    /* [in] */ IActiveScript __RPC_FAR *pas,
-    /* [in] */ BOOL fScriptlet,
-    /* [out] */ DWORD __RPC_FAR *pdwSourceContext);
-
-
-void __RPC_STUB IDebugDocumentHelper_DefineScriptBlock_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetDefaultTextAttr_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    SOURCE_TEXT_ATTR staTextAttr);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetDefaultTextAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetTextAttributes_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ ULONG ulCharOffset,
-    /* [in] */ ULONG cChars,
-    /* [size_is][length_is][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetLongName_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [string][in] */ LPCOLESTR pszLongName);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetLongName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetShortName_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [string][in] */ LPCOLESTR pszShortName);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetShortName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_SetDocumentAttr_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ TEXT_DOC_ATTR pszAttributes);
-
-
-void __RPC_STUB IDebugDocumentHelper_SetDocumentAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_GetDebugApplicationNode_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdan);
-
-
-void __RPC_STUB IDebugDocumentHelper_GetDebugApplicationNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_GetScriptBlockInfo_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ DWORD dwSourceContext,
-    /* [out] */ IActiveScript __RPC_FAR *__RPC_FAR *ppasd,
-    /* [out] */ ULONG __RPC_FAR *piCharPos,
-    /* [out] */ ULONG __RPC_FAR *pcChars);
-
-
-void __RPC_STUB IDebugDocumentHelper_GetScriptBlockInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_CreateDebugDocumentContext_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    /* [in] */ ULONG iCharPos,
-    /* [in] */ ULONG cChars,
-    /* [out] */ IDebugDocumentContext __RPC_FAR *__RPC_FAR *ppddc);
-
-
-void __RPC_STUB IDebugDocumentHelper_CreateDebugDocumentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_BringDocumentToTop_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentHelper_BringDocumentToTop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHelper_BringDocumentContextToTop_Proxy( 
-    IDebugDocumentHelper __RPC_FAR * This,
-    IDebugDocumentContext __RPC_FAR *pddc);
-
-
-void __RPC_STUB IDebugDocumentHelper_BringDocumentContextToTop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentHelper_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentHost_INTERFACE_DEFINED__
-#define __IDebugDocumentHost_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentHost
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentHost;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C27-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentHost : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDeferredText( 
-            /* [in] */ DWORD dwTextStartCookie,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes( 
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnCreateDocumentContext( 
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkOuter) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetPathName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-            /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetFileName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrShortName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE NotifyChanged( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentHostVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentHost __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentHost __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDeferredText )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [in] */ DWORD dwTextStartCookie,
-            /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-            /* [size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-            /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-            /* [in] */ ULONG cMaxChars);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScriptTextAttributes )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [size_is][in] */ LPCOLESTR pstrCode,
-            /* [in] */ ULONG uNumCodeChars,
-            /* [in] */ LPCOLESTR pstrDelimiter,
-            /* [in] */ DWORD dwFlags,
-            /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnCreateDocumentContext )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkOuter);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPathName )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-            /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetFileName )( 
-            IDebugDocumentHost __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrShortName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *NotifyChanged )( 
-            IDebugDocumentHost __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugDocumentHostVtbl;
-
-    interface IDebugDocumentHost
-    {
-        CONST_VTBL struct IDebugDocumentHostVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetDeferredText_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [in] */ DWORD dwTextStartCookie,
-    /* [size_is][length_is][out][in] */ WCHAR __RPC_FAR *pcharText,
-    /* [size_is][length_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pstaTextAttr,
-    /* [out][in] */ ULONG __RPC_FAR *pcNumChars,
-    /* [in] */ ULONG cMaxChars);
-
-
-void __RPC_STUB IDebugDocumentHost_GetDeferredText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetScriptTextAttributes_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [size_is][in] */ LPCOLESTR pstrCode,
-    /* [in] */ ULONG uNumCodeChars,
-    /* [in] */ LPCOLESTR pstrDelimiter,
-    /* [in] */ DWORD dwFlags,
-    /* [size_is][out][in] */ SOURCE_TEXT_ATTR __RPC_FAR *pattr);
-
-
-void __RPC_STUB IDebugDocumentHost_GetScriptTextAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_OnCreateDocumentContext_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunkOuter);
-
-
-void __RPC_STUB IDebugDocumentHost_OnCreateDocumentContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetPathName_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrLongName,
-    /* [out] */ BOOL __RPC_FAR *pfIsOriginalFile);
-
-
-void __RPC_STUB IDebugDocumentHost_GetPathName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetFileName_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrShortName);
-
-
-void __RPC_STUB IDebugDocumentHost_GetFileName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentHost_NotifyChanged_Proxy( 
-    IDebugDocumentHost __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugDocumentHost_NotifyChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentHost_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugDocumentContext_INTERFACE_DEFINED__
-#define __IDebugDocumentContext_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugDocumentContext
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugDocumentContext;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C28-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugDocumentContext : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetDocument( 
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppsd) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumCodeContexts( 
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugDocumentContextVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugDocumentContext __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugDocumentContext __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugDocumentContext __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocument )( 
-            IDebugDocumentContext __RPC_FAR * This,
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppsd);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumCodeContexts )( 
-            IDebugDocumentContext __RPC_FAR * This,
-            /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-        
-        END_INTERFACE
-    } IDebugDocumentContextVtbl;
-
-    interface IDebugDocumentContext
-    {
-        CONST_VTBL struct IDebugDocumentContextVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugDocumentContext_GetDocument(This,ppsd)	\
-    (This)->lpVtbl -> GetDocument(This,ppsd)
-
-#define IDebugDocumentContext_EnumCodeContexts(This,ppescc)	\
-    (This)->lpVtbl -> EnumCodeContexts(This,ppescc)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentContext_GetDocument_Proxy( 
-    IDebugDocumentContext __RPC_FAR * This,
-    /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppsd);
-
-
-void __RPC_STUB IDebugDocumentContext_GetDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugDocumentContext_EnumCodeContexts_Proxy( 
-    IDebugDocumentContext __RPC_FAR * This,
-    /* [out] */ IEnumDebugCodeContexts __RPC_FAR *__RPC_FAR *ppescc);
-
-
-void __RPC_STUB IDebugDocumentContext_EnumCodeContexts_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugDocumentContext_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugSessionProvider_INTERFACE_DEFINED__
-#define __IDebugSessionProvider_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugSessionProvider
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugSessionProvider;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C29-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugSessionProvider : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE StartDebugSession( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugSessionProviderVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugSessionProvider __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugSessionProvider __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugSessionProvider __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StartDebugSession )( 
-            IDebugSessionProvider __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda);
-        
-        END_INTERFACE
-    } IDebugSessionProviderVtbl;
-
-    interface IDebugSessionProvider
-    {
-        CONST_VTBL struct IDebugSessionProviderVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugSessionProvider_StartDebugSession(This,pda)	\
-    (This)->lpVtbl -> StartDebugSession(This,pda)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugSessionProvider_StartDebugSession_Proxy( 
-    IDebugSessionProvider __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda);
-
-
-void __RPC_STUB IDebugSessionProvider_StartDebugSession_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugSessionProvider_INTERFACE_DEFINED__ */
-
-
-#ifndef __IApplicationDebugger_INTERFACE_DEFINED__
-#define __IApplicationDebugger_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IApplicationDebugger
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IApplicationDebugger;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2a-CB0C-11d0-B5C9-00A0244A0E7A")
-    IApplicationDebugger : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE QueryAlive( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtDebugger( 
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onDebugOutput( 
-            /* [in] */ LPCOLESTR pstr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onHandleBreakPoint( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prpt,
-            /* [in] */ BREAKREASON br,
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pError) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onClose( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onDebuggerEvent( 
-            /* [in] */ REFIID riid,
-            /* [in] */ IUnknown __RPC_FAR *punk) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IApplicationDebuggerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IApplicationDebugger __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IApplicationDebugger __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryAlive )( 
-            IApplicationDebugger __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateInstanceAtDebugger )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onDebugOutput )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onHandleBreakPoint )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prpt,
-            /* [in] */ BREAKREASON br,
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pError);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onClose )( 
-            IApplicationDebugger __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onDebuggerEvent )( 
-            IApplicationDebugger __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [in] */ IUnknown __RPC_FAR *punk);
-        
-        END_INTERFACE
-    } IApplicationDebuggerVtbl;
-
-    interface IApplicationDebugger
-    {
-        CONST_VTBL struct IApplicationDebuggerVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_QueryAlive_Proxy( 
-    IApplicationDebugger __RPC_FAR * This);
-
-
-void __RPC_STUB IApplicationDebugger_QueryAlive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_CreateInstanceAtDebugger_Proxy( 
-    IApplicationDebugger __RPC_FAR * This,
-    /* [in] */ REFCLSID rclsid,
-    /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-    /* [in] */ DWORD dwClsContext,
-    /* [in] */ REFIID riid,
-    /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-
-
-void __RPC_STUB IApplicationDebugger_CreateInstanceAtDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_onDebugOutput_Proxy( 
-    IApplicationDebugger __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstr);
-
-
-void __RPC_STUB IApplicationDebugger_onDebugOutput_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_onHandleBreakPoint_Proxy( 
-    IApplicationDebugger __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prpt,
-    /* [in] */ BREAKREASON br,
-    /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pError);
-
-
-void __RPC_STUB IApplicationDebugger_onHandleBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_onClose_Proxy( 
-    IApplicationDebugger __RPC_FAR * This);
-
-
-void __RPC_STUB IApplicationDebugger_onClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebugger_onDebuggerEvent_Proxy( 
-    IApplicationDebugger __RPC_FAR * This,
-    /* [in] */ REFIID riid,
-    /* [in] */ IUnknown __RPC_FAR *punk);
-
-
-void __RPC_STUB IApplicationDebugger_onDebuggerEvent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IApplicationDebugger_INTERFACE_DEFINED__ */
-
-
-#ifndef __IApplicationDebuggerUI_INTERFACE_DEFINED__
-#define __IApplicationDebuggerUI_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IApplicationDebuggerUI
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IApplicationDebuggerUI;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2b-CB0C-11d0-B5C9-00A0244A0E7A")
-    IApplicationDebuggerUI : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop( 
-            /* [in] */ IDebugDocumentText __RPC_FAR *pddt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop( 
-            /* [in] */ IDebugDocumentContext __RPC_FAR *pddc) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IApplicationDebuggerUIVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IApplicationDebuggerUI __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IApplicationDebuggerUI __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IApplicationDebuggerUI __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *BringDocumentToTop )( 
-            IApplicationDebuggerUI __RPC_FAR * This,
-            /* [in] */ IDebugDocumentText __RPC_FAR *pddt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *BringDocumentContextToTop )( 
-            IApplicationDebuggerUI __RPC_FAR * This,
-            /* [in] */ IDebugDocumentContext __RPC_FAR *pddc);
-        
-        END_INTERFACE
-    } IApplicationDebuggerUIVtbl;
-
-    interface IApplicationDebuggerUI
-    {
-        CONST_VTBL struct IApplicationDebuggerUIVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IApplicationDebuggerUI_BringDocumentToTop(This,pddt)	\
-    (This)->lpVtbl -> BringDocumentToTop(This,pddt)
-
-#define IApplicationDebuggerUI_BringDocumentContextToTop(This,pddc)	\
-    (This)->lpVtbl -> BringDocumentContextToTop(This,pddc)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebuggerUI_BringDocumentToTop_Proxy( 
-    IApplicationDebuggerUI __RPC_FAR * This,
-    /* [in] */ IDebugDocumentText __RPC_FAR *pddt);
-
-
-void __RPC_STUB IApplicationDebuggerUI_BringDocumentToTop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IApplicationDebuggerUI_BringDocumentContextToTop_Proxy( 
-    IApplicationDebuggerUI __RPC_FAR * This,
-    /* [in] */ IDebugDocumentContext __RPC_FAR *pddc);
-
-
-void __RPC_STUB IApplicationDebuggerUI_BringDocumentContextToTop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IApplicationDebuggerUI_INTERFACE_DEFINED__ */
-
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0191
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-EXTERN_C const CLSID CLSID_MachineDebugManager;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0191_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0191_v0_0_s_ifspec;
-
-#ifndef __IMachineDebugManager_INTERFACE_DEFINED__
-#define __IMachineDebugManager_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IMachineDebugManager
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IMachineDebugManager;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2c-CB0C-11d0-B5C9-00A0244A0E7A")
-    IMachineDebugManager : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE AddApplication( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveApplication( 
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumApplications( 
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IMachineDebugManagerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IMachineDebugManager __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IMachineDebugManager __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IMachineDebugManager __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddApplication )( 
-            IMachineDebugManager __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveApplication )( 
-            IMachineDebugManager __RPC_FAR * This,
-            /* [in] */ DWORD dwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumApplications )( 
-            IMachineDebugManager __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda);
-        
-        END_INTERFACE
-    } IMachineDebugManagerVtbl;
-
-    interface IMachineDebugManager
-    {
-        CONST_VTBL struct IMachineDebugManagerVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManager_AddApplication_Proxy( 
-    IMachineDebugManager __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-    /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManager_AddApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManager_RemoveApplication_Proxy( 
-    IMachineDebugManager __RPC_FAR * This,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManager_RemoveApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManager_EnumApplications_Proxy( 
-    IMachineDebugManager __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda);
-
-
-void __RPC_STUB IMachineDebugManager_EnumApplications_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IMachineDebugManager_INTERFACE_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerCookie_INTERFACE_DEFINED__
-#define __IMachineDebugManagerCookie_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IMachineDebugManagerCookie
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IMachineDebugManagerCookie;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2d-CB0C-11d0-B5C9-00A0244A0E7A")
-    IMachineDebugManagerCookie : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE AddApplication( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwDebugAppCookie,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveApplication( 
-            /* [in] */ DWORD dwDebugAppCookie,
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumApplications( 
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IMachineDebugManagerCookieVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IMachineDebugManagerCookie __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IMachineDebugManagerCookie __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IMachineDebugManagerCookie __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddApplication )( 
-            IMachineDebugManagerCookie __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwDebugAppCookie,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveApplication )( 
-            IMachineDebugManagerCookie __RPC_FAR * This,
-            /* [in] */ DWORD dwDebugAppCookie,
-            /* [in] */ DWORD dwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumApplications )( 
-            IMachineDebugManagerCookie __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda);
-        
-        END_INTERFACE
-    } IMachineDebugManagerCookieVtbl;
-
-    interface IMachineDebugManagerCookie
-    {
-        CONST_VTBL struct IMachineDebugManagerCookieVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_AddApplication_Proxy( 
-    IMachineDebugManagerCookie __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-    /* [in] */ DWORD dwDebugAppCookie,
-    /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManagerCookie_AddApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_RemoveApplication_Proxy( 
-    IMachineDebugManagerCookie __RPC_FAR * This,
-    /* [in] */ DWORD dwDebugAppCookie,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManagerCookie_RemoveApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_EnumApplications_Proxy( 
-    IMachineDebugManagerCookie __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppeda);
-
-
-void __RPC_STUB IMachineDebugManagerCookie_EnumApplications_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IMachineDebugManagerCookie_INTERFACE_DEFINED__ */
-
-
-#ifndef __IMachineDebugManagerEvents_INTERFACE_DEFINED__
-#define __IMachineDebugManagerEvents_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IMachineDebugManagerEvents
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IMachineDebugManagerEvents;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2e-CB0C-11d0-B5C9-00A0244A0E7A")
-    IMachineDebugManagerEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onAddApplication( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onRemoveApplication( 
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IMachineDebugManagerEventsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IMachineDebugManagerEvents __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IMachineDebugManagerEvents __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IMachineDebugManagerEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onAddApplication )( 
-            IMachineDebugManagerEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onRemoveApplication )( 
-            IMachineDebugManagerEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-            /* [in] */ DWORD dwAppCookie);
-        
-        END_INTERFACE
-    } IMachineDebugManagerEventsVtbl;
-
-    interface IMachineDebugManagerEvents
-    {
-        CONST_VTBL struct IMachineDebugManagerEventsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IMachineDebugManagerEvents_onAddApplication(This,pda,dwAppCookie)	\
-    (This)->lpVtbl -> onAddApplication(This,pda,dwAppCookie)
-
-#define IMachineDebugManagerEvents_onRemoveApplication(This,pda,dwAppCookie)	\
-    (This)->lpVtbl -> onRemoveApplication(This,pda,dwAppCookie)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerEvents_onAddApplication_Proxy( 
-    IMachineDebugManagerEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManagerEvents_onAddApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IMachineDebugManagerEvents_onRemoveApplication_Proxy( 
-    IMachineDebugManagerEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplication __RPC_FAR *pda,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IMachineDebugManagerEvents_onRemoveApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IMachineDebugManagerEvents_INTERFACE_DEFINED__ */
-
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0194
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-EXTERN_C const CLSID CLSID_ProcessDebugManager;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0194_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0194_v0_0_s_ifspec;
-
-#ifndef __IProcessDebugManager_INTERFACE_DEFINED__
-#define __IProcessDebugManager_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IProcessDebugManager
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IProcessDebugManager;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C2f-CB0C-11d0-B5C9-00A0244A0E7A")
-    IProcessDebugManager : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE CreateApplication( 
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDefaultApplication( 
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddApplication( 
-            /* [in] */ IDebugApplication __RPC_FAR *pda,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveApplication( 
-            /* [in] */ DWORD dwAppCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentHelper( 
-            /* [in] */ IUnknown __RPC_FAR *punkOuter,
-            /* [out] */ IDebugDocumentHelper __RPC_FAR *__RPC_FAR *pddh) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IProcessDebugManagerVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IProcessDebugManager __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IProcessDebugManager __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateApplication )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDefaultApplication )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddApplication )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [in] */ IDebugApplication __RPC_FAR *pda,
-            /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveApplication )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [in] */ DWORD dwAppCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateDebugDocumentHelper )( 
-            IProcessDebugManager __RPC_FAR * This,
-            /* [in] */ IUnknown __RPC_FAR *punkOuter,
-            /* [out] */ IDebugDocumentHelper __RPC_FAR *__RPC_FAR *pddh);
-        
-        END_INTERFACE
-    } IProcessDebugManagerVtbl;
-
-    interface IProcessDebugManager
-    {
-        CONST_VTBL struct IProcessDebugManagerVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IProcessDebugManager_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IProcessDebugManager_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IProcessDebugManager_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IProcessDebugManager_CreateApplication(This,ppda)	\
-    (This)->lpVtbl -> CreateApplication(This,ppda)
-
-#define IProcessDebugManager_GetDefaultApplication(This,ppda)	\
-    (This)->lpVtbl -> GetDefaultApplication(This,ppda)
-
-#define IProcessDebugManager_AddApplication(This,pda,pdwAppCookie)	\
-    (This)->lpVtbl -> AddApplication(This,pda,pdwAppCookie)
-
-#define IProcessDebugManager_RemoveApplication(This,dwAppCookie)	\
-    (This)->lpVtbl -> RemoveApplication(This,dwAppCookie)
-
-#define IProcessDebugManager_CreateDebugDocumentHelper(This,punkOuter,pddh)	\
-    (This)->lpVtbl -> CreateDebugDocumentHelper(This,punkOuter,pddh)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_CreateApplication_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-
-
-void __RPC_STUB IProcessDebugManager_CreateApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_GetDefaultApplication_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [out] */ IDebugApplication __RPC_FAR *__RPC_FAR *ppda);
-
-
-void __RPC_STUB IProcessDebugManager_GetDefaultApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_AddApplication_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [in] */ IDebugApplication __RPC_FAR *pda,
-    /* [out] */ DWORD __RPC_FAR *pdwAppCookie);
-
-
-void __RPC_STUB IProcessDebugManager_AddApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_RemoveApplication_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [in] */ DWORD dwAppCookie);
-
-
-void __RPC_STUB IProcessDebugManager_RemoveApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IProcessDebugManager_CreateDebugDocumentHelper_Proxy( 
-    IProcessDebugManager __RPC_FAR * This,
-    /* [in] */ IUnknown __RPC_FAR *punkOuter,
-    /* [out] */ IDebugDocumentHelper __RPC_FAR *__RPC_FAR *pddh);
-
-
-void __RPC_STUB IProcessDebugManager_CreateDebugDocumentHelper_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IProcessDebugManager_INTERFACE_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplication_INTERFACE_DEFINED__
-#define __IRemoteDebugApplication_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IRemoteDebugApplication
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IRemoteDebugApplication;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C30-CB0C-11d0-B5C9-00A0244A0E7A")
-    IRemoteDebugApplication : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE ResumeFromBreakPoint( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prptFocus,
-            /* [in] */ BREAKRESUMEACTION bra,
-            /* [in] */ ERRORRESUMEACTION era) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CauseBreak( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE ConnectDebugger( 
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE DisconnectDebugger( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDebugger( 
-            /* [out] */ IApplicationDebugger __RPC_FAR *__RPC_FAR *pad) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtApplication( 
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryAlive( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumThreads( 
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetName( 
-            /* [out] */ BSTR __RPC_FAR *pbstrName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetRootNode( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumGlobalExpressionContexts( 
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IRemoteDebugApplicationVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ResumeFromBreakPoint )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prptFocus,
-            /* [in] */ BREAKRESUMEACTION bra,
-            /* [in] */ ERRORRESUMEACTION era);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CauseBreak )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ConnectDebugger )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DisconnectDebugger )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDebugger )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ IApplicationDebugger __RPC_FAR *__RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateInstanceAtApplication )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryAlive )( 
-            IRemoteDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumThreads )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetRootNode )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumGlobalExpressionContexts )( 
-            IRemoteDebugApplication __RPC_FAR * This,
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-        
-        END_INTERFACE
-    } IRemoteDebugApplicationVtbl;
-
-    interface IRemoteDebugApplication
-    {
-        CONST_VTBL struct IRemoteDebugApplicationVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_ResumeFromBreakPoint_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prptFocus,
-    /* [in] */ BREAKRESUMEACTION bra,
-    /* [in] */ ERRORRESUMEACTION era);
-
-
-void __RPC_STUB IRemoteDebugApplication_ResumeFromBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_CauseBreak_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplication_CauseBreak_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_ConnectDebugger_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-
-
-void __RPC_STUB IRemoteDebugApplication_ConnectDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_DisconnectDebugger_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplication_DisconnectDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetDebugger_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ IApplicationDebugger __RPC_FAR *__RPC_FAR *pad);
-
-
-void __RPC_STUB IRemoteDebugApplication_GetDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_CreateInstanceAtApplication_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [in] */ REFCLSID rclsid,
-    /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-    /* [in] */ DWORD dwClsContext,
-    /* [in] */ REFIID riid,
-    /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-
-
-void __RPC_STUB IRemoteDebugApplication_CreateInstanceAtApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_QueryAlive_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplication_QueryAlive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_EnumThreads_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-
-
-void __RPC_STUB IRemoteDebugApplication_EnumThreads_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetName_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrName);
-
-
-void __RPC_STUB IRemoteDebugApplication_GetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetRootNode_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-
-
-void __RPC_STUB IRemoteDebugApplication_GetRootNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_EnumGlobalExpressionContexts_Proxy( 
-    IRemoteDebugApplication __RPC_FAR * This,
-    /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-
-
-void __RPC_STUB IRemoteDebugApplication_EnumGlobalExpressionContexts_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IRemoteDebugApplication_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugApplication_INTERFACE_DEFINED__
-#define __IDebugApplication_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugApplication
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugApplication;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C32-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugApplication : public IRemoteDebugApplication
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE SetName( 
-            /* [in] */ LPCOLESTR pstrName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE StepOutComplete( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE DebugOutput( 
-            /* [in] */ LPCOLESTR pstr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE StartDebugSession( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE HandleBreakPoint( 
-            /* [in] */ BREAKREASON br,
-            /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetBreakFlags( 
-            /* [out] */ APPBREAKFLAGS __RPC_FAR *pabf,
-            /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdatSteppingThread) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetCurrentThread( 
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *pat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateAsyncDebugOperation( 
-            /* [in] */ IDebugSyncOperation __RPC_FAR *psdo,
-            /* [out] */ IDebugAsyncOperation __RPC_FAR *__RPC_FAR *ppado) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddStackFrameSniffer( 
-            /* [in] */ IDebugStackFrameSniffer __RPC_FAR *pdsfs,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveStackFrameSniffer( 
-            /* [in] */ DWORD dwCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryCurrentThreadIsDebuggerThread( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SynchronousCallInDebuggerThread( 
-            /* [in] */ IDebugThreadCall __RPC_FAR *pptc,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateApplicationNode( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanNew) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE FireDebuggerEvent( 
-            /* [in] */ REFGUID riid,
-            /* [in] */ IUnknown __RPC_FAR *punk) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE HandleRuntimeError( 
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-            /* [in] */ IActiveScriptSite __RPC_FAR *pScriptSite,
-            /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra,
-            /* [out] */ ERRORRESUMEACTION __RPC_FAR *perra,
-            /* [out] */ BOOL __RPC_FAR *pfCallOnScriptError) = 0;
-        
-        virtual BOOL STDMETHODCALLTYPE FCanJitDebug( void) = 0;
-        
-        virtual BOOL STDMETHODCALLTYPE FIsAutoJitDebugEnabled( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE AddGlobalExpressionContextProvider( 
-            /* [in] */ IProvideExpressionContexts __RPC_FAR *pdsfs,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE RemoveGlobalExpressionContextProvider( 
-            /* [in] */ DWORD dwCookie) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugApplicationVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ResumeFromBreakPoint )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prptFocus,
-            /* [in] */ BREAKRESUMEACTION bra,
-            /* [in] */ ERRORRESUMEACTION era);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CauseBreak )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ConnectDebugger )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DisconnectDebugger )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDebugger )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IApplicationDebugger __RPC_FAR *__RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateInstanceAtApplication )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ REFCLSID rclsid,
-            /* [in] */ IUnknown __RPC_FAR *pUnkOuter,
-            /* [in] */ DWORD dwClsContext,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ IUnknown __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryAlive )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumThreads )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetRootNode )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanRoot);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumGlobalExpressionContexts )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetName )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StepOutComplete )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DebugOutput )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StartDebugSession )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HandleBreakPoint )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ BREAKREASON br,
-            /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Close )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetBreakFlags )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ APPBREAKFLAGS __RPC_FAR *pabf,
-            /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdatSteppingThread);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetCurrentThread )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *pat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateAsyncDebugOperation )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IDebugSyncOperation __RPC_FAR *psdo,
-            /* [out] */ IDebugAsyncOperation __RPC_FAR *__RPC_FAR *ppado);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddStackFrameSniffer )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IDebugStackFrameSniffer __RPC_FAR *pdsfs,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveStackFrameSniffer )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ DWORD dwCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryCurrentThreadIsDebuggerThread )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SynchronousCallInDebuggerThread )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IDebugThreadCall __RPC_FAR *pptc,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateApplicationNode )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanNew);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *FireDebuggerEvent )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ REFGUID riid,
-            /* [in] */ IUnknown __RPC_FAR *punk);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HandleRuntimeError )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-            /* [in] */ IActiveScriptSite __RPC_FAR *pScriptSite,
-            /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra,
-            /* [out] */ ERRORRESUMEACTION __RPC_FAR *perra,
-            /* [out] */ BOOL __RPC_FAR *pfCallOnScriptError);
-        
-        BOOL ( STDMETHODCALLTYPE __RPC_FAR *FCanJitDebug )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        BOOL ( STDMETHODCALLTYPE __RPC_FAR *FIsAutoJitDebugEnabled )( 
-            IDebugApplication __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddGlobalExpressionContextProvider )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ IProvideExpressionContexts __RPC_FAR *pdsfs,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveGlobalExpressionContextProvider )( 
-            IDebugApplication __RPC_FAR * This,
-            /* [in] */ DWORD dwCookie);
-        
-        END_INTERFACE
-    } IDebugApplicationVtbl;
-
-    interface IDebugApplication
-    {
-        CONST_VTBL struct IDebugApplicationVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IDebugApplication_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IDebugApplication_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IDebugApplication_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IDebugApplication_ResumeFromBreakPoint(This,prptFocus,bra,era)	\
-    (This)->lpVtbl -> ResumeFromBreakPoint(This,prptFocus,bra,era)
-
-#define IDebugApplication_CauseBreak(This)	\
-    (This)->lpVtbl -> CauseBreak(This)
-
-#define IDebugApplication_ConnectDebugger(This,pad)	\
-    (This)->lpVtbl -> ConnectDebugger(This,pad)
-
-#define IDebugApplication_DisconnectDebugger(This)	\
-    (This)->lpVtbl -> DisconnectDebugger(This)
-
-#define IDebugApplication_GetDebugger(This,pad)	\
-    (This)->lpVtbl -> GetDebugger(This,pad)
-
-#define IDebugApplication_CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)	\
-    (This)->lpVtbl -> CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
-
-#define IDebugApplication_QueryAlive(This)	\
-    (This)->lpVtbl -> QueryAlive(This)
-
-#define IDebugApplication_EnumThreads(This,pperdat)	\
-    (This)->lpVtbl -> EnumThreads(This,pperdat)
-
-#define IDebugApplication_GetName(This,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,pbstrName)
-
-#define IDebugApplication_GetRootNode(This,ppdanRoot)	\
-    (This)->lpVtbl -> GetRootNode(This,ppdanRoot)
-
-#define IDebugApplication_EnumGlobalExpressionContexts(This,ppedec)	\
-    (This)->lpVtbl -> EnumGlobalExpressionContexts(This,ppedec)
-
-
-#define IDebugApplication_SetName(This,pstrName)	\
-    (This)->lpVtbl -> SetName(This,pstrName)
-
-#define IDebugApplication_StepOutComplete(This)	\
-    (This)->lpVtbl -> StepOutComplete(This)
-
-#define IDebugApplication_DebugOutput(This,pstr)	\
-    (This)->lpVtbl -> DebugOutput(This,pstr)
-
-#define IDebugApplication_StartDebugSession(This)	\
-    (This)->lpVtbl -> StartDebugSession(This)
-
-#define IDebugApplication_HandleBreakPoint(This,br,pbra)	\
-    (This)->lpVtbl -> HandleBreakPoint(This,br,pbra)
-
-#define IDebugApplication_Close(This)	\
-    (This)->lpVtbl -> Close(This)
-
-#define IDebugApplication_GetBreakFlags(This,pabf,pprdatSteppingThread)	\
-    (This)->lpVtbl -> GetBreakFlags(This,pabf,pprdatSteppingThread)
-
-#define IDebugApplication_GetCurrentThread(This,pat)	\
-    (This)->lpVtbl -> GetCurrentThread(This,pat)
-
-#define IDebugApplication_CreateAsyncDebugOperation(This,psdo,ppado)	\
-    (This)->lpVtbl -> CreateAsyncDebugOperation(This,psdo,ppado)
-
-#define IDebugApplication_AddStackFrameSniffer(This,pdsfs,pdwCookie)	\
-    (This)->lpVtbl -> AddStackFrameSniffer(This,pdsfs,pdwCookie)
-
-#define IDebugApplication_RemoveStackFrameSniffer(This,dwCookie)	\
-    (This)->lpVtbl -> RemoveStackFrameSniffer(This,dwCookie)
-
-#define IDebugApplication_QueryCurrentThreadIsDebuggerThread(This)	\
-    (This)->lpVtbl -> QueryCurrentThreadIsDebuggerThread(This)
-
-#define IDebugApplication_SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3)	\
-    (This)->lpVtbl -> SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3)
-
-#define IDebugApplication_CreateApplicationNode(This,ppdanNew)	\
-    (This)->lpVtbl -> CreateApplicationNode(This,ppdanNew)
-
-#define IDebugApplication_FireDebuggerEvent(This,riid,punk)	\
-    (This)->lpVtbl -> FireDebuggerEvent(This,riid,punk)
-
-#define IDebugApplication_HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError)	\
-    (This)->lpVtbl -> HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError)
-
-#define IDebugApplication_FCanJitDebug(This)	\
-    (This)->lpVtbl -> FCanJitDebug(This)
-
-#define IDebugApplication_FIsAutoJitDebugEnabled(This)	\
-    (This)->lpVtbl -> FIsAutoJitDebugEnabled(This)
-
-#define IDebugApplication_AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie)	\
-    (This)->lpVtbl -> AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie)
-
-#define IDebugApplication_RemoveGlobalExpressionContextProvider(This,dwCookie)	\
-    (This)->lpVtbl -> RemoveGlobalExpressionContextProvider(This,dwCookie)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_SetName_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrName);
-
-
-void __RPC_STUB IDebugApplication_SetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_StepOutComplete_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_StepOutComplete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_DebugOutput_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstr);
-
-
-void __RPC_STUB IDebugApplication_DebugOutput_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_StartDebugSession_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_StartDebugSession_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_HandleBreakPoint_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ BREAKREASON br,
-    /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra);
-
-
-void __RPC_STUB IDebugApplication_HandleBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_Close_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_GetBreakFlags_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [out] */ APPBREAKFLAGS __RPC_FAR *pabf,
-    /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdatSteppingThread);
-
-
-void __RPC_STUB IDebugApplication_GetBreakFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_GetCurrentThread_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [out] */ IDebugApplicationThread __RPC_FAR *__RPC_FAR *pat);
-
-
-void __RPC_STUB IDebugApplication_GetCurrentThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_CreateAsyncDebugOperation_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IDebugSyncOperation __RPC_FAR *psdo,
-    /* [out] */ IDebugAsyncOperation __RPC_FAR *__RPC_FAR *ppado);
-
-
-void __RPC_STUB IDebugApplication_CreateAsyncDebugOperation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_AddStackFrameSniffer_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IDebugStackFrameSniffer __RPC_FAR *pdsfs,
-    /* [out] */ DWORD __RPC_FAR *pdwCookie);
-
-
-void __RPC_STUB IDebugApplication_AddStackFrameSniffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_RemoveStackFrameSniffer_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ DWORD dwCookie);
-
-
-void __RPC_STUB IDebugApplication_RemoveStackFrameSniffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_QueryCurrentThreadIsDebuggerThread_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_QueryCurrentThreadIsDebuggerThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_SynchronousCallInDebuggerThread_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IDebugThreadCall __RPC_FAR *pptc,
-    /* [in] */ DWORD dwParam1,
-    /* [in] */ DWORD dwParam2,
-    /* [in] */ DWORD dwParam3);
-
-
-void __RPC_STUB IDebugApplication_SynchronousCallInDebuggerThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_CreateApplicationNode_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *ppdanNew);
-
-
-void __RPC_STUB IDebugApplication_CreateApplicationNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_FireDebuggerEvent_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ REFGUID riid,
-    /* [in] */ IUnknown __RPC_FAR *punk);
-
-
-void __RPC_STUB IDebugApplication_FireDebuggerEvent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_HandleRuntimeError_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pErrorDebug,
-    /* [in] */ IActiveScriptSite __RPC_FAR *pScriptSite,
-    /* [out] */ BREAKRESUMEACTION __RPC_FAR *pbra,
-    /* [out] */ ERRORRESUMEACTION __RPC_FAR *perra,
-    /* [out] */ BOOL __RPC_FAR *pfCallOnScriptError);
-
-
-void __RPC_STUB IDebugApplication_HandleRuntimeError_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-BOOL STDMETHODCALLTYPE IDebugApplication_FCanJitDebug_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_FCanJitDebug_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-BOOL STDMETHODCALLTYPE IDebugApplication_FIsAutoJitDebugEnabled_Proxy( 
-    IDebugApplication __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplication_FIsAutoJitDebugEnabled_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_AddGlobalExpressionContextProvider_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ IProvideExpressionContexts __RPC_FAR *pdsfs,
-    /* [out] */ DWORD __RPC_FAR *pdwCookie);
-
-
-void __RPC_STUB IDebugApplication_AddGlobalExpressionContextProvider_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplication_RemoveGlobalExpressionContextProvider_Proxy( 
-    IDebugApplication __RPC_FAR * This,
-    /* [in] */ DWORD dwCookie);
-
-
-void __RPC_STUB IDebugApplication_RemoveGlobalExpressionContextProvider_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugApplication_INTERFACE_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__
-#define __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IRemoteDebugApplicationEvents
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IRemoteDebugApplicationEvents;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C33-CB0C-11d0-B5C9-00A0244A0E7A")
-    IRemoteDebugApplicationEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE OnConnectDebugger( 
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnDisconnectDebugger( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnSetName( 
-            /* [in] */ LPCOLESTR pstrName) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnDebugOutput( 
-            /* [in] */ LPCOLESTR pstr) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnClose( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnEnterBreakPoint( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnLeaveBreakPoint( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnCreateThread( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnDestroyThread( 
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE OnBreakFlagChange( 
-            /* [in] */ APPBREAKFLAGS abf,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdatSteppingThread) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IRemoteDebugApplicationEventsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnConnectDebugger )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnDisconnectDebugger )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnSetName )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnDebugOutput )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstr);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnClose )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnEnterBreakPoint )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnLeaveBreakPoint )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnCreateThread )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnDestroyThread )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnBreakFlagChange )( 
-            IRemoteDebugApplicationEvents __RPC_FAR * This,
-            /* [in] */ APPBREAKFLAGS abf,
-            /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdatSteppingThread);
-        
-        END_INTERFACE
-    } IRemoteDebugApplicationEventsVtbl;
-
-    interface IRemoteDebugApplicationEvents
-    {
-        CONST_VTBL struct IRemoteDebugApplicationEventsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnConnectDebugger_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IApplicationDebugger __RPC_FAR *pad);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnConnectDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDisconnectDebugger_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnDisconnectDebugger_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnSetName_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrName);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnSetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDebugOutput_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstr);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnDebugOutput_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnClose_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnEnterBreakPoint_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnEnterBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnLeaveBreakPoint_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnLeaveBreakPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnCreateThread_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnCreateThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDestroyThread_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdat);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnDestroyThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnBreakFlagChange_Proxy( 
-    IRemoteDebugApplicationEvents __RPC_FAR * This,
-    /* [in] */ APPBREAKFLAGS abf,
-    /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prdatSteppingThread);
-
-
-void __RPC_STUB IRemoteDebugApplicationEvents_OnBreakFlagChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNode_INTERFACE_DEFINED__
-#define __IDebugApplicationNode_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugApplicationNode
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugApplicationNode;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C34-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugApplicationNode : public IDebugDocumentProvider
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE EnumChildren( 
-            /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetParent( 
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDocumentProvider( 
-            /* [in] */ IDebugDocumentProvider __RPC_FAR *pddp) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Attach( 
-            /* [in] */ IDebugApplicationNode __RPC_FAR *pdanParent) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Detach( void) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugApplicationNodeVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugApplicationNode __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugApplicationNode __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetName )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [in] */ DOCUMENTNAMETYPE dnt,
-            /* [out] */ BSTR __RPC_FAR *pbstrName);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocumentClassId )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [out] */ CLSID __RPC_FAR *pclsidDocument);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDocument )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [out] */ IDebugDocument __RPC_FAR *__RPC_FAR *ppssd);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumChildren )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetParent )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDocumentProvider )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [in] */ IDebugDocumentProvider __RPC_FAR *pddp);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Close )( 
-            IDebugApplicationNode __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Attach )( 
-            IDebugApplicationNode __RPC_FAR * This,
-            /* [in] */ IDebugApplicationNode __RPC_FAR *pdanParent);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Detach )( 
-            IDebugApplicationNode __RPC_FAR * This);
-        
-        END_INTERFACE
-    } IDebugApplicationNodeVtbl;
-
-    interface IDebugApplicationNode
-    {
-        CONST_VTBL struct IDebugApplicationNodeVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugApplicationNode_GetName(This,dnt,pbstrName)	\
-    (This)->lpVtbl -> GetName(This,dnt,pbstrName)
-
-#define IDebugApplicationNode_GetDocumentClassId(This,pclsidDocument)	\
-    (This)->lpVtbl -> GetDocumentClassId(This,pclsidDocument)
-
-
-#define IDebugApplicationNode_GetDocument(This,ppssd)	\
-    (This)->lpVtbl -> GetDocument(This,ppssd)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_EnumChildren_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This,
-    /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp);
-
-
-void __RPC_STUB IDebugApplicationNode_EnumChildren_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_GetParent_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp);
-
-
-void __RPC_STUB IDebugApplicationNode_GetParent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_SetDocumentProvider_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This,
-    /* [in] */ IDebugDocumentProvider __RPC_FAR *pddp);
-
-
-void __RPC_STUB IDebugApplicationNode_SetDocumentProvider_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Close_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationNode_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Attach_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This,
-    /* [in] */ IDebugApplicationNode __RPC_FAR *pdanParent);
-
-
-void __RPC_STUB IDebugApplicationNode_Attach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Detach_Proxy( 
-    IDebugApplicationNode __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationNode_Detach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugApplicationNode_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugApplicationNodeEvents_INTERFACE_DEFINED__
-#define __IDebugApplicationNodeEvents_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugApplicationNodeEvents
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugApplicationNodeEvents;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C35-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugApplicationNodeEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE onAddChild( 
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onRemoveChild( 
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onDetach( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE onAttach( 
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpParent) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugApplicationNodeEventsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onAddChild )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This,
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onRemoveChild )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This,
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onDetach )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *onAttach )( 
-            IDebugApplicationNodeEvents __RPC_FAR * This,
-            /* [in] */ IDebugApplicationNode __RPC_FAR *prddpParent);
-        
-        END_INTERFACE
-    } IDebugApplicationNodeEventsVtbl;
-
-    interface IDebugApplicationNodeEvents
-    {
-        CONST_VTBL struct IDebugApplicationNodeEventsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onAddChild_Proxy( 
-    IDebugApplicationNodeEvents __RPC_FAR * This,
-    /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild);
-
-
-void __RPC_STUB IDebugApplicationNodeEvents_onAddChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onRemoveChild_Proxy( 
-    IDebugApplicationNodeEvents __RPC_FAR * This,
-    /* [in] */ IDebugApplicationNode __RPC_FAR *prddpChild);
-
-
-void __RPC_STUB IDebugApplicationNodeEvents_onRemoveChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onDetach_Proxy( 
-    IDebugApplicationNodeEvents __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationNodeEvents_onDetach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onAttach_Proxy( 
-    IDebugApplicationNodeEvents __RPC_FAR * This,
-    /* [in] */ IDebugApplicationNode __RPC_FAR *prddpParent);
-
-
-void __RPC_STUB IDebugApplicationNodeEvents_onAttach_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugApplicationNodeEvents_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugThreadCall_INTERFACE_DEFINED__
-#define __IDebugThreadCall_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugThreadCall
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugThreadCall;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C36-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugThreadCall : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE ThreadCallHandler( 
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugThreadCallVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugThreadCall __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugThreadCall __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugThreadCall __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ThreadCallHandler )( 
-            IDebugThreadCall __RPC_FAR * This,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3);
-        
-        END_INTERFACE
-    } IDebugThreadCallVtbl;
-
-    interface IDebugThreadCall
-    {
-        CONST_VTBL struct IDebugThreadCallVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define IDebugThreadCall_QueryInterface(This,riid,ppvObject)	\
-    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IDebugThreadCall_AddRef(This)	\
-    (This)->lpVtbl -> AddRef(This)
-
-#define IDebugThreadCall_Release(This)	\
-    (This)->lpVtbl -> Release(This)
-
-
-#define IDebugThreadCall_ThreadCallHandler(This,dwParam1,dwParam2,dwParam3)	\
-    (This)->lpVtbl -> ThreadCallHandler(This,dwParam1,dwParam2,dwParam3)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugThreadCall_ThreadCallHandler_Proxy( 
-    IDebugThreadCall __RPC_FAR * This,
-    /* [in] */ DWORD dwParam1,
-    /* [in] */ DWORD dwParam2,
-    /* [in] */ DWORD dwParam3);
-
-
-void __RPC_STUB IDebugThreadCall_ThreadCallHandler_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugThreadCall_INTERFACE_DEFINED__ */
-
-
-#ifndef __IRemoteDebugApplicationThread_INTERFACE_DEFINED__
-#define __IRemoteDebugApplicationThread_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IRemoteDebugApplicationThread
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-typedef DWORD THREAD_STATE;
-
-#define	THREAD_STATE_RUNNING	( 0x1 )
-
-#define	THREAD_STATE_SUSPENDED	( 0x2 )
-
-#define	THREAD_BLOCKED	( 0x4 )
-
-#define	THREAD_OUT_OF_CONTEXT	( 0x8 )
-
-
-EXTERN_C const IID IID_IRemoteDebugApplicationThread;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C37-CB0C-11d0-B5C9-00A0244A0E7A")
-    IRemoteDebugApplicationThread : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetSystemThreadId( 
-            /* [out] */ DWORD __RPC_FAR *dwThreadId) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetApplication( 
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *pprda) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE EnumStackFrames( 
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetDescription( 
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription,
-            /* [out] */ BSTR __RPC_FAR *pbstrState) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetNextStatement( 
-            /* [in] */ IDebugStackFrame __RPC_FAR *pStackFrame,
-            /* [in] */ IDebugCodeContext __RPC_FAR *pCodeContext) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetState( 
-            /* [out] */ DWORD __RPC_FAR *pState) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Suspend( 
-            /* [out] */ DWORD __RPC_FAR *pdwCount) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Resume( 
-            /* [out] */ DWORD __RPC_FAR *pdwCount) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetSuspendCount( 
-            /* [out] */ DWORD __RPC_FAR *pdwCount) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IRemoteDebugApplicationThreadVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSystemThreadId )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *dwThreadId);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetApplication )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *pprda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFrames )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDescription )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription,
-            /* [out] */ BSTR __RPC_FAR *pbstrState);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetNextStatement )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ IDebugStackFrame __RPC_FAR *pStackFrame,
-            /* [in] */ IDebugCodeContext __RPC_FAR *pCodeContext);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetState )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pState);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Suspend )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Resume )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSuspendCount )( 
-            IRemoteDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        END_INTERFACE
-    } IRemoteDebugApplicationThreadVtbl;
-
-    interface IRemoteDebugApplicationThread
-    {
-        CONST_VTBL struct IRemoteDebugApplicationThreadVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetSystemThreadId_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *dwThreadId);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetSystemThreadId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetApplication_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *pprda);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetApplication_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_EnumStackFrames_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_EnumStackFrames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetDescription_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ BSTR __RPC_FAR *pbstrDescription,
-    /* [out] */ BSTR __RPC_FAR *pbstrState);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_SetNextStatement_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [in] */ IDebugStackFrame __RPC_FAR *pStackFrame,
-    /* [in] */ IDebugCodeContext __RPC_FAR *pCodeContext);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_SetNextStatement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetState_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *pState);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_Suspend_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *pdwCount);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_Suspend_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_Resume_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *pdwCount);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_Resume_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetSuspendCount_Proxy( 
-    IRemoteDebugApplicationThread __RPC_FAR * This,
-    /* [out] */ DWORD __RPC_FAR *pdwCount);
-
-
-void __RPC_STUB IRemoteDebugApplicationThread_GetSuspendCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IRemoteDebugApplicationThread_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugApplicationThread_INTERFACE_DEFINED__
-#define __IDebugApplicationThread_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugApplicationThread
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugApplicationThread;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C38-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugApplicationThread : public IRemoteDebugApplicationThread
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE SynchronousCallIntoThread( 
-            /* [in] */ IDebugThreadCall __RPC_FAR *pstcb,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryIsCurrentThread( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE QueryIsDebuggerThread( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetDescription( 
-            /* [in] */ LPCOLESTR pstrDescription) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE SetStateString( 
-            /* [in] */ LPCOLESTR pstrState) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugApplicationThreadVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugApplicationThread __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugApplicationThread __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSystemThreadId )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *dwThreadId);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetApplication )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *pprda);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumStackFrames )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ IEnumDebugStackFrames __RPC_FAR *__RPC_FAR *ppedsf);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDescription )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ BSTR __RPC_FAR *pbstrDescription,
-            /* [out] */ BSTR __RPC_FAR *pbstrState);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetNextStatement )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ IDebugStackFrame __RPC_FAR *pStackFrame,
-            /* [in] */ IDebugCodeContext __RPC_FAR *pCodeContext);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetState )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pState);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Suspend )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Resume )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSuspendCount )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [out] */ DWORD __RPC_FAR *pdwCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SynchronousCallIntoThread )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ IDebugThreadCall __RPC_FAR *pstcb,
-            /* [in] */ DWORD dwParam1,
-            /* [in] */ DWORD dwParam2,
-            /* [in] */ DWORD dwParam3);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryIsCurrentThread )( 
-            IDebugApplicationThread __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryIsDebuggerThread )( 
-            IDebugApplicationThread __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDescription )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrDescription);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetStateString )( 
-            IDebugApplicationThread __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pstrState);
-        
-        END_INTERFACE
-    } IDebugApplicationThreadVtbl;
-
-    interface IDebugApplicationThread
-    {
-        CONST_VTBL struct IDebugApplicationThreadVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-
-#define IDebugApplicationThread_SynchronousCallIntoThread(This,pstcb,dwParam1,dwParam2,dwParam3)	\
-    (This)->lpVtbl -> SynchronousCallIntoThread(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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SynchronousCallIntoThread_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This,
-    /* [in] */ IDebugThreadCall __RPC_FAR *pstcb,
-    /* [in] */ DWORD dwParam1,
-    /* [in] */ DWORD dwParam2,
-    /* [in] */ DWORD dwParam3);
-
-
-void __RPC_STUB IDebugApplicationThread_SynchronousCallIntoThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_QueryIsCurrentThread_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationThread_QueryIsCurrentThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_QueryIsDebuggerThread_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This);
-
-
-void __RPC_STUB IDebugApplicationThread_QueryIsDebuggerThread_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SetDescription_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrDescription);
-
-
-void __RPC_STUB IDebugApplicationThread_SetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SetStateString_Proxy( 
-    IDebugApplicationThread __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pstrState);
-
-
-void __RPC_STUB IDebugApplicationThread_SetStateString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugApplicationThread_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugCookie_INTERFACE_DEFINED__
-#define __IDebugCookie_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugCookie
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][local][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugCookie;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C39-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugCookie : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE SetDebugCookie( 
-            /* [in] */ DWORD dwDebugAppCookie) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugCookieVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugCookie __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugCookie __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugCookie __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetDebugCookie )( 
-            IDebugCookie __RPC_FAR * This,
-            /* [in] */ DWORD dwDebugAppCookie);
-        
-        END_INTERFACE
-    } IDebugCookieVtbl;
-
-    interface IDebugCookie
-    {
-        CONST_VTBL struct IDebugCookieVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IDebugCookie_SetDebugCookie(This,dwDebugAppCookie)	\
-    (This)->lpVtbl -> SetDebugCookie(This,dwDebugAppCookie)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugCookie_SetDebugCookie_Proxy( 
-    IDebugCookie __RPC_FAR * This,
-    /* [in] */ DWORD dwDebugAppCookie);
-
-
-void __RPC_STUB IDebugCookie_SetDebugCookie_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugCookie_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumDebugApplicationNodes_INTERFACE_DEFINED__
-#define __IEnumDebugApplicationNodes_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumDebugApplicationNodes
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumDebugApplicationNodes;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3a-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumDebugApplicationNodes : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumDebugApplicationNodesVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumDebugApplicationNodes __RPC_FAR * This,
-            /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp);
-        
-        END_INTERFACE
-    } IEnumDebugApplicationNodesVtbl;
-
-    interface IEnumDebugApplicationNodes
-    {
-        CONST_VTBL struct IEnumDebugApplicationNodesVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugApplicationNodes_RemoteNext_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumDebugApplicationNodes_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Skip_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumDebugApplicationNodes_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Reset_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumDebugApplicationNodes_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Clone_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [out] */ IEnumDebugApplicationNodes __RPC_FAR *__RPC_FAR *pperddp);
-
-
-void __RPC_STUB IEnumDebugApplicationNodes_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumDebugApplicationNodes_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplications_INTERFACE_DEFINED__
-#define __IEnumRemoteDebugApplications_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumRemoteDebugApplications
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumRemoteDebugApplications;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3b-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumRemoteDebugApplications : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppessd) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumRemoteDebugApplicationsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumRemoteDebugApplications __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppessd);
-        
-        END_INTERFACE
-    } IEnumRemoteDebugApplicationsVtbl;
-
-    interface IEnumRemoteDebugApplications
-    {
-        CONST_VTBL struct IEnumRemoteDebugApplicationsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumRemoteDebugApplications_RemoteNext_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumRemoteDebugApplications_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Skip_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumRemoteDebugApplications_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Reset_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumRemoteDebugApplications_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Clone_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplications __RPC_FAR *__RPC_FAR *ppessd);
-
-
-void __RPC_STUB IEnumRemoteDebugApplications_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumRemoteDebugApplications_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__
-#define __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumRemoteDebugApplicationThreads
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumRemoteDebugApplicationThreads;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3c-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumRemoteDebugApplicationThreads : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdat,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumRemoteDebugApplicationThreadsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdat,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-            /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-        
-        END_INTERFACE
-    } IEnumRemoteDebugApplicationThreadsVtbl;
-
-    interface IEnumRemoteDebugApplicationThreads
-    {
-        CONST_VTBL struct IEnumRemoteDebugApplicationThreadsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumRemoteDebugApplicationThreads_RemoteNext_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *ppdat,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumRemoteDebugApplicationThreads_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Skip_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumRemoteDebugApplicationThreads_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Reset_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumRemoteDebugApplicationThreads_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Clone_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [out] */ IEnumRemoteDebugApplicationThreads __RPC_FAR *__RPC_FAR *pperdat);
-
-
-void __RPC_STUB IEnumRemoteDebugApplicationThreads_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__ */
-
-
-#ifndef __IDebugFormatter_INTERFACE_DEFINED__
-#define __IDebugFormatter_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugFormatter
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugFormatter;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C05-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugFormatter : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetStringForVariant( 
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ ULONG nRadix,
-            /* [out] */ BSTR __RPC_FAR *pbstrValue) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetVariantForString( 
-            /* [in] */ LPCOLESTR pwstrValue,
-            /* [out] */ VARIANT __RPC_FAR *pvar) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE GetStringForVarType( 
-            /* [in] */ VARTYPE vt,
-            /* [in] */ TYPEDESC __RPC_FAR *ptdescArrayType,
-            /* [out] */ BSTR __RPC_FAR *pbstr) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugFormatterVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugFormatter __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugFormatter __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugFormatter __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetStringForVariant )( 
-            IDebugFormatter __RPC_FAR * This,
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ ULONG nRadix,
-            /* [out] */ BSTR __RPC_FAR *pbstrValue);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetVariantForString )( 
-            IDebugFormatter __RPC_FAR * This,
-            /* [in] */ LPCOLESTR pwstrValue,
-            /* [out] */ VARIANT __RPC_FAR *pvar);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetStringForVarType )( 
-            IDebugFormatter __RPC_FAR * This,
-            /* [in] */ VARTYPE vt,
-            /* [in] */ TYPEDESC __RPC_FAR *ptdescArrayType,
-            /* [out] */ BSTR __RPC_FAR *pbstr);
-        
-        END_INTERFACE
-    } IDebugFormatterVtbl;
-
-    interface IDebugFormatter
-    {
-        CONST_VTBL struct IDebugFormatterVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugFormatter_GetStringForVariant_Proxy( 
-    IDebugFormatter __RPC_FAR * This,
-    /* [in] */ VARIANT __RPC_FAR *pvar,
-    /* [in] */ ULONG nRadix,
-    /* [out] */ BSTR __RPC_FAR *pbstrValue);
-
-
-void __RPC_STUB IDebugFormatter_GetStringForVariant_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugFormatter_GetVariantForString_Proxy( 
-    IDebugFormatter __RPC_FAR * This,
-    /* [in] */ LPCOLESTR pwstrValue,
-    /* [out] */ VARIANT __RPC_FAR *pvar);
-
-
-void __RPC_STUB IDebugFormatter_GetVariantForString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugFormatter_GetStringForVarType_Proxy( 
-    IDebugFormatter __RPC_FAR * This,
-    /* [in] */ VARTYPE vt,
-    /* [in] */ TYPEDESC __RPC_FAR *ptdescArrayType,
-    /* [out] */ BSTR __RPC_FAR *pbstr);
-
-
-void __RPC_STUB IDebugFormatter_GetStringForVarType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugFormatter_INTERFACE_DEFINED__ */
-
-
-#ifndef __ISimpleConnectionPoint_INTERFACE_DEFINED__
-#define __ISimpleConnectionPoint_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: ISimpleConnectionPoint
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_ISimpleConnectionPoint;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3e-CB0C-11d0-B5C9-00A0244A0E7A")
-    ISimpleConnectionPoint : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE GetEventCount( 
-            /* [out] */ ULONG __RPC_FAR *pulCount) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE DescribeEvents( 
-            /* [in] */ ULONG iEvent,
-            /* [in] */ ULONG cEvents,
-            /* [length_is][size_is][out] */ DISPID __RPC_FAR *prgid,
-            /* [length_is][size_is][out] */ BSTR __RPC_FAR *prgbstr,
-            /* [out] */ ULONG __RPC_FAR *pcEventsFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Advise( 
-            /* [in] */ IDispatch __RPC_FAR *pdisp,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Unadvise( 
-            /* [in] */ DWORD dwCookie) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct ISimpleConnectionPointVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            ISimpleConnectionPoint __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            ISimpleConnectionPoint __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetEventCount )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [out] */ ULONG __RPC_FAR *pulCount);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DescribeEvents )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [in] */ ULONG iEvent,
-            /* [in] */ ULONG cEvents,
-            /* [length_is][size_is][out] */ DISPID __RPC_FAR *prgid,
-            /* [length_is][size_is][out] */ BSTR __RPC_FAR *prgbstr,
-            /* [out] */ ULONG __RPC_FAR *pcEventsFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Advise )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [in] */ IDispatch __RPC_FAR *pdisp,
-            /* [out] */ DWORD __RPC_FAR *pdwCookie);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Unadvise )( 
-            ISimpleConnectionPoint __RPC_FAR * This,
-            /* [in] */ DWORD dwCookie);
-        
-        END_INTERFACE
-    } ISimpleConnectionPointVtbl;
-
-    interface ISimpleConnectionPoint
-    {
-        CONST_VTBL struct ISimpleConnectionPointVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_GetEventCount_Proxy( 
-    ISimpleConnectionPoint __RPC_FAR * This,
-    /* [out] */ ULONG __RPC_FAR *pulCount);
-
-
-void __RPC_STUB ISimpleConnectionPoint_GetEventCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_DescribeEvents_Proxy( 
-    ISimpleConnectionPoint __RPC_FAR * This,
-    /* [in] */ ULONG iEvent,
-    /* [in] */ ULONG cEvents,
-    /* [length_is][size_is][out] */ DISPID __RPC_FAR *prgid,
-    /* [length_is][size_is][out] */ BSTR __RPC_FAR *prgbstr,
-    /* [out] */ ULONG __RPC_FAR *pcEventsFetched);
-
-
-void __RPC_STUB ISimpleConnectionPoint_DescribeEvents_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_Advise_Proxy( 
-    ISimpleConnectionPoint __RPC_FAR * This,
-    /* [in] */ IDispatch __RPC_FAR *pdisp,
-    /* [out] */ DWORD __RPC_FAR *pdwCookie);
-
-
-void __RPC_STUB ISimpleConnectionPoint_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_Unadvise_Proxy( 
-    ISimpleConnectionPoint __RPC_FAR * This,
-    /* [in] */ DWORD dwCookie);
-
-
-void __RPC_STUB ISimpleConnectionPoint_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __ISimpleConnectionPoint_INTERFACE_DEFINED__ */
-
-
-/****************************************
- * Generated header for interface: __MIDL_itf_activdbg_0209
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local] */ 
-
-
-EXTERN_C const CLSID CLSID_DebugHelper;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0209_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_activdbg_0209_v0_0_s_ifspec;
-
-#ifndef __IDebugHelper_INTERFACE_DEFINED__
-#define __IDebugHelper_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IDebugHelper
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [local][unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IDebugHelper;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C3f-CB0C-11d0-B5C9-00A0244A0E7A")
-    IDebugHelper : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE CreatePropertyBrowser( 
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ LPCOLESTR bstrName,
-            /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreatePropertyBrowserEx( 
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ LPCOLESTR bstrName,
-            /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-            /* [in] */ IDebugFormatter __RPC_FAR *pdf,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE CreateSimpleConnectionPoint( 
-            /* [in] */ IDispatch __RPC_FAR *pdisp,
-            /* [out] */ ISimpleConnectionPoint __RPC_FAR *__RPC_FAR *ppscp) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IDebugHelperVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IDebugHelper __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IDebugHelper __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IDebugHelper __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreatePropertyBrowser )( 
-            IDebugHelper __RPC_FAR * This,
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ LPCOLESTR bstrName,
-            /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreatePropertyBrowserEx )( 
-            IDebugHelper __RPC_FAR * This,
-            /* [in] */ VARIANT __RPC_FAR *pvar,
-            /* [in] */ LPCOLESTR bstrName,
-            /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-            /* [in] */ IDebugFormatter __RPC_FAR *pdf,
-            /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateSimpleConnectionPoint )( 
-            IDebugHelper __RPC_FAR * This,
-            /* [in] */ IDispatch __RPC_FAR *pdisp,
-            /* [out] */ ISimpleConnectionPoint __RPC_FAR *__RPC_FAR *ppscp);
-        
-        END_INTERFACE
-    } IDebugHelperVtbl;
-
-    interface IDebugHelper
-    {
-        CONST_VTBL struct IDebugHelperVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IDebugHelper_CreatePropertyBrowser_Proxy( 
-    IDebugHelper __RPC_FAR * This,
-    /* [in] */ VARIANT __RPC_FAR *pvar,
-    /* [in] */ LPCOLESTR bstrName,
-    /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-    /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob);
-
-
-void __RPC_STUB IDebugHelper_CreatePropertyBrowser_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugHelper_CreatePropertyBrowserEx_Proxy( 
-    IDebugHelper __RPC_FAR * This,
-    /* [in] */ VARIANT __RPC_FAR *pvar,
-    /* [in] */ LPCOLESTR bstrName,
-    /* [in] */ IDebugApplicationThread __RPC_FAR *pdat,
-    /* [in] */ IDebugFormatter __RPC_FAR *pdf,
-    /* [out] */ IDebugProperty __RPC_FAR *__RPC_FAR *ppdob);
-
-
-void __RPC_STUB IDebugHelper_CreatePropertyBrowserEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IDebugHelper_CreateSimpleConnectionPoint_Proxy( 
-    IDebugHelper __RPC_FAR * This,
-    /* [in] */ IDispatch __RPC_FAR *pdisp,
-    /* [out] */ ISimpleConnectionPoint __RPC_FAR *__RPC_FAR *ppscp);
-
-
-void __RPC_STUB IDebugHelper_CreateSimpleConnectionPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IDebugHelper_INTERFACE_DEFINED__ */
-
-
-#ifndef __IEnumDebugExpressionContexts_INTERFACE_DEFINED__
-#define __IEnumDebugExpressionContexts_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IEnumDebugExpressionContexts
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][helpstring][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IEnumDebugExpressionContexts;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C40-CB0C-11d0-B5C9-00A0244A0E7A")
-    IEnumDebugExpressionContexts : public IUnknown
-    {
-    public:
-        virtual /* [local] */ HRESULT __stdcall Next( 
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *ppdec,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Skip( 
-            /* [in] */ ULONG celt) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
-        
-        virtual HRESULT STDMETHODCALLTYPE Clone( 
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IEnumDebugExpressionContextsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This);
-        
-        /* [local] */ HRESULT ( __stdcall __RPC_FAR *Next )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This,
-            /* [in] */ ULONG celt,
-            /* [out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *ppdec,
-            /* [out] */ ULONG __RPC_FAR *pceltFetched);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Skip )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This,
-            /* [in] */ ULONG celt);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clone )( 
-            IEnumDebugExpressionContexts __RPC_FAR * This,
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-        
-        END_INTERFACE
-    } IEnumDebugExpressionContextsVtbl;
-
-    interface IEnumDebugExpressionContexts
-    {
-        CONST_VTBL struct IEnumDebugExpressionContextsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#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)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugExpressionContexts_RemoteNext_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *pprgdec,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-void __RPC_STUB IEnumDebugExpressionContexts_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Skip_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt);
-
-
-void __RPC_STUB IEnumDebugExpressionContexts_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Reset_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This);
-
-
-void __RPC_STUB IEnumDebugExpressionContexts_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Clone_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-
-
-void __RPC_STUB IEnumDebugExpressionContexts_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IEnumDebugExpressionContexts_INTERFACE_DEFINED__ */
-
-
-#ifndef __IProvideExpressionContexts_INTERFACE_DEFINED__
-#define __IProvideExpressionContexts_INTERFACE_DEFINED__
-
-/****************************************
- * Generated header for interface: IProvideExpressionContexts
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [unique][uuid][object] */ 
-
-
-
-EXTERN_C const IID IID_IProvideExpressionContexts;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    interface DECLSPEC_UUID("51973C41-CB0C-11d0-B5C9-00A0244A0E7A")
-    IProvideExpressionContexts : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE EnumExpressionContexts( 
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec) = 0;
-        
-    };
-    
-#else 	/* C style interface */
-
-    typedef struct IProvideExpressionContextsVtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
-            IProvideExpressionContexts __RPC_FAR * This,
-            /* [in] */ REFIID riid,
-            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
-            IProvideExpressionContexts __RPC_FAR * This);
-        
-        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
-            IProvideExpressionContexts __RPC_FAR * This);
-        
-        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EnumExpressionContexts )( 
-            IProvideExpressionContexts __RPC_FAR * This,
-            /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-        
-        END_INTERFACE
-    } IProvideExpressionContextsVtbl;
-
-    interface IProvideExpressionContexts
-    {
-        CONST_VTBL struct IProvideExpressionContextsVtbl __RPC_FAR *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#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)
-
-
-#define IProvideExpressionContexts_EnumExpressionContexts(This,ppedec)	\
-    (This)->lpVtbl -> EnumExpressionContexts(This,ppedec)
-
-#endif /* COBJMACROS */
-
-
-#endif 	/* C style interface */
-
-
-
-HRESULT STDMETHODCALLTYPE IProvideExpressionContexts_EnumExpressionContexts_Proxy( 
-    IProvideExpressionContexts __RPC_FAR * This,
-    /* [out] */ IEnumDebugExpressionContexts __RPC_FAR *__RPC_FAR *ppedec);
-
-
-void __RPC_STUB IProvideExpressionContexts_EnumExpressionContexts_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-#endif 	/* __IProvideExpressionContexts_INTERFACE_DEFINED__ */
-
-
-
-#ifndef __ProcessDebugManagerLib_LIBRARY_DEFINED__
-#define __ProcessDebugManagerLib_LIBRARY_DEFINED__
-
-/****************************************
- * Generated header for library: ProcessDebugManagerLib
- * at Fri Sep 18 16:27:25 1998
- * using MIDL 3.01.75
- ****************************************/
-/* [helpstring][version][uuid] */ 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-EXTERN_C const CLSID CLSID_CDebugDocumentHelper;
-
-EXTERN_C const IID LIBID_ProcessDebugManagerLib;
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_ProcessDebugManager;
-
-class DECLSPEC_UUID("78a51822-51f4-11d0-8f20-00805f2cd064")
-ProcessDebugManager;
-#endif
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_DebugHelper;
-
-class DECLSPEC_UUID("0BFCC060-8C1D-11d0-ACCD-00AA0060275C")
-DebugHelper;
-#endif
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_CDebugDocumentHelper;
-
-class DECLSPEC_UUID("83B8BCA6-687C-11D0-A405-00AA0060275C")
-CDebugDocumentHelper;
-#endif
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_MachineDebugManager;
-
-class DECLSPEC_UUID("0C0A3666-30C9-11D0-8F20-00805F2CD064")
-MachineDebugManager;
-#endif
-
-#ifdef __cplusplus
-EXTERN_C const CLSID CLSID_DefaultDebugSessionProvider;
-
-class DECLSPEC_UUID("834128a2-51f4-11d0-8f20-00805f2cd064")
-DefaultDebugSessionProvider;
-#endif
-#endif /* __ProcessDebugManagerLib_LIBRARY_DEFINED__ */
-
-/* Additional Prototypes for ALL interfaces */
-
-unsigned long             __RPC_USER  BSTR_UserSize(     unsigned long __RPC_FAR *, unsigned long            , BSTR __RPC_FAR * ); 
-unsigned char __RPC_FAR * __RPC_USER  BSTR_UserMarshal(  unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); 
-unsigned char __RPC_FAR * __RPC_USER  BSTR_UserUnmarshal(unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); 
-void                      __RPC_USER  BSTR_UserFree(     unsigned long __RPC_FAR *, BSTR __RPC_FAR * ); 
-
-/* [local] */ HRESULT __stdcall IEnumDebugCodeContexts_Next_Proxy( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugCodeContexts_Next_Stub( 
-    IEnumDebugCodeContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugCodeContext __RPC_FAR *__RPC_FAR *pscc,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumDebugStackFrames_Next_Proxy( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugStackFrames_Next_Stub( 
-    IEnumDebugStackFrames __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ DebugStackFrameDescriptor __RPC_FAR *prgdsfd,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumDebugApplicationNodes_Next_Proxy( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugApplicationNodes_Next_Stub( 
-    IEnumDebugApplicationNodes __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugApplicationNode __RPC_FAR *__RPC_FAR *pprddp,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumRemoteDebugApplications_Next_Proxy( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumRemoteDebugApplications_Next_Stub( 
-    IEnumRemoteDebugApplications __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IRemoteDebugApplication __RPC_FAR *__RPC_FAR *ppda,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumRemoteDebugApplicationThreads_Next_Proxy( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *pprdat,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumRemoteDebugApplicationThreads_Next_Stub( 
-    IEnumRemoteDebugApplicationThreads __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IRemoteDebugApplicationThread __RPC_FAR *__RPC_FAR *ppdat,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-/* [local] */ HRESULT __stdcall IEnumDebugExpressionContexts_Next_Proxy( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *ppdec,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-/* [call_as] */ HRESULT __stdcall IEnumDebugExpressionContexts_Next_Stub( 
-    IEnumDebugExpressionContexts __RPC_FAR * This,
-    /* [in] */ ULONG celt,
-    /* [length_is][size_is][out] */ IDebugExpressionContext __RPC_FAR *__RPC_FAR *pprgdec,
-    /* [out] */ ULONG __RPC_FAR *pceltFetched);
-
-
-
-/* end of Additional Prototypes */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/dlldata.c b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/dlldata.c
deleted file mode 100644
index b254688..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/dlldata.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*********************************************************
-   DllData file -- generated by MIDL compiler 
-
-        DO NOT ALTER THIS FILE
-
-   This file is regenerated by MIDL on every IDL file compile.
-
-   To completely reconstruct this file, delete it and rerun MIDL
-   on all the IDL files in this DLL, specifying this file for the
-   /dlldata command line option
-
-*********************************************************/
-
-#define PROXY_DELEGATION
-
-#include <rpcproxy.h>
-
-#ifdef __cplusplus
-extern "C"   {
-#endif
-
-EXTERN_PROXY_FILE( IECrossfireServer )
-
-
-PROXYFILE_LIST_START
-/* Start of list */
-  REFERENCE_PROXY_FILE( IECrossfireServer ),
-/* End of list */
-PROXYFILE_LIST_END
-
-
-DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
-
-#ifdef __cplusplus
-}  /*extern "C" */
-#endif
-
-/* end of generated dlldata file */
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/resource.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/resource.h
deleted file mode 100644
index 9a34633..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/resource.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by IECrossfireServer.rc
-//
-#define IDS_PROJNAME                    100
-#define IDR_IECrossfireServer           101
-#define IDR_JSEVALCALLBACK              102
-#define IDR_CROSSFIRESERVER             103
-#define IDR_IEDEBUGGER                  104
-#define IDR_CROSSFIRESERVERCLASS        111
-#define IDR_TESTCLASS                   112
-#define IDR_PENDINGBREAKPOINT           113
-
-// Next default values for new objects
-// 
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        201
-#define _APS_NEXT_COMMAND_VALUE         32768
-#define _APS_NEXT_CONTROL_VALUE         201
-#define _APS_NEXT_SYMED_VALUE           114
-#endif
-#endif
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.cpp
deleted file mode 100644
index 33b7099..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-// stdafx.cpp : source file that includes just the standard includes
-// IECrossfireServer.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.h
deleted file mode 100644
index bfd1557..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently,
-// but are changed infrequently
-
-#pragma once
-
-#ifndef STRICT
-#define STRICT
-#endif
-
-// Modify the following defines if you have to target a platform prior to the ones specified below.
-// Refer to MSDN for the latest info on corresponding values for different platforms.
-#ifndef WINVER				// Allow use of features specific to Windows XP or later.
-#define WINVER 0x0501		// Change this to the appropriate value to target other versions of Windows.
-#endif
-
-#ifndef _WIN32_WINNT		// Allow use of features specific to Windows XP or later.                   
-#define _WIN32_WINNT 0x0501	// Change this to the appropriate value to target other versions of Windows.
-#endif						
-
-#ifndef _WIN32_WINDOWS		// Allow use of features specific to Windows 98 or later.
-#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
-#endif
-
-#ifndef _WIN32_IE			// Allow use of features specific to IE 6.0 or later.
-#define _WIN32_IE 0x0600	// Change this to the appropriate value to target other versions of IE.
-#endif
-
-#define _ATL_APARTMENT_THREADED
-#define _ATL_NO_AUTOMATIC_NAMESPACE
-
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS	// some CString constructors will be explicit
-
-
-#include "resource.h"
-#include <atlbase.h>
-#include <atlcom.h>
-
-using namespace ATL;
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/.classpath b/development/org.eclipse.wst.jsdt.debug.opera/.classpath
deleted file mode 100644
index 50457c8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/scope-sdk"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/.project b/development/org.eclipse.wst.jsdt.debug.opera/.project
deleted file mode 100644
index fc9fa50..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.opera</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/.settings/org.eclipse.jdt.core.prefs b/development/org.eclipse.wst.jsdt.debug.opera/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/META-INF/MANIFEST.MF b/development/org.eclipse.wst.jsdt.debug.opera/META-INF/MANIFEST.MF
deleted file mode 100644
index c819bc4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: JSDT Opera Support
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.opera;singleton:=true
-Bundle-Version: 0.1.0.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.opera.OperaPlugin
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.wst.jsdt.debug.core;bundle-version="2.0.100",
- org.eclipse.debug.core;bundle-version="3.7.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.opera;uses:="org.osgi.framework",
- org.eclipse.wst.jsdt.debug.opera.internal.jsdi;x-internal:=true,
- org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;x-internal:=true,
- org.eclipse.wst.jsdt.debug.opera.internal.launching;x-internal:=true
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/build.properties b/development/org.eclipse.wst.jsdt.debug.opera/build.properties
deleted file mode 100644
index f8d5672..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-output.. = bin/
-bin.includes = plugin.xml
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/plugin.xml b/development/org.eclipse.wst.jsdt.debug.opera/plugin.xml
deleted file mode 100644
index 17cc712..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/plugin.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.opera.internal.launching.OperaListeningConnector"
-            id="org.eclipse.wst.jsdt.debug.opera.listening.connector">
-      </connector>
-   </extension>
-
-</plugin>
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/OperaPlugin.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/OperaPlugin.java
deleted file mode 100644
index 7c144df..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/OperaPlugin.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.wst.jsdt.debug.opera;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class OperaPlugin implements BundleActivator {
-
-	private static BundleContext context;
-
-	static BundleContext getContext() {
-		return context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext bundleContext) throws Exception {
-		OperaPlugin.context = bundleContext;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext bundleContext) throws Exception {
-		OperaPlugin.context = null;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/BooleanValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/BooleanValueImpl.java
deleted file mode 100644
index 3b8014c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/BooleanValueImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-
-/**
- * Default {@link BooleanValue} Opera implementation
- * 
- * @since 0.1
- */
-public class BooleanValueImpl extends PrimitiveValueImpl implements BooleanValue {
-
-	private boolean value = false;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param value
-	 */
-	public BooleanValueImpl(VirtualMachineImpl vm, boolean value) {
-		super(vm);
-		this.value = value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return (value ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return Boolean.toString(value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/EventQueueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/EventQueueImpl.java
deleted file mode 100644
index 9a38792..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/EventQueueImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-
-/**
- * Default {@link EventQueue} implementation for Opera
- * @since 0.1
- */
-public class EventQueueImpl extends MirrorImpl implements EventQueue {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventQueueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove()
-	 */
-	public EventSet remove() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove(int)
-	 */
-	public EventSet remove(int timeout) {
-		return null;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/LocationImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/LocationImpl.java
deleted file mode 100644
index 7fd2286..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/LocationImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Default {@link Location} implementation for Opera
- * 
- * @since 0.1
- */
-public class LocationImpl extends MirrorImpl implements Location {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public LocationImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#scriptReference()
-	 */
-	public ScriptReference scriptReference() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#lineNumber()
-	 */
-	public int lineNumber() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#functionName()
-	 */
-	public String functionName() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/Messages.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/Messages.java
deleted file mode 100644
index d0581e7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.opera.internal.jsdi.messages"; //$NON-NLS-1$
-	public static String vm_desc;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/MirrorImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/MirrorImpl.java
deleted file mode 100644
index ba1d0bf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/MirrorImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default {@link Mirror} object for Opera
- * 
- * @since 0.1
- */
-public class MirrorImpl implements Mirror {
-
-	private VirtualMachineImpl vm = null;
-	
-	/**
-	 * Constructor
-	 * <br><br>
-	 * This constructor is only to be used when the {@link Mirror} is in fact the {@link VirtualMachine} object
-	 * 
-	 * @noreference This constructor is not intended to be referenced by clients.
-	 */
-	public MirrorImpl() {
-		vm = (VirtualMachineImpl) this;
-	}
-	
-	/**
-	 * Constructor
-	 */
-	public MirrorImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NullValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NullValueImpl.java
deleted file mode 100644
index 49ff54f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NullValueImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-
-/**
- * Default {@link NullValue} Opera implementation
- * 
- * @since 0.1
- */
-public class NullValueImpl extends MirrorImpl implements NullValue {
-
-	public static String VALUE = "null"; //$NON-NLS-1$
-	
-	public NullValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return VALUE;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NumberValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NumberValueImpl.java
deleted file mode 100644
index 543a97d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NumberValueImpl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-
-/**
- * Default {@link NumberValue} implementation for Opera
- * 
- * @since 0.1
- */
-public class NumberValueImpl extends PrimitiveValueImpl implements NumberValue {
-	
-	Number number = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param number
-	 */
-	public NumberValueImpl(VirtualMachineImpl vm, Number number) {
-		super(vm);
-		this.number = number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		if(number == null) {
-			return -1;
-		}
-		return number.intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		if(number == null) {
-			return -1;
-		}
-		return number.doubleValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		if(number == null) {
-			return false;
-		}
-		return number.intValue() > 0 ? true : false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return JavaScriptDebugModel.numberToString(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return JavaScriptDebugModel.numberToString(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#value()
-	 */
-	public Number value() {
-		return number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#isNaN()
-	 */
-	public boolean isNaN() {
-		return number == null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/PrimitiveValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/PrimitiveValueImpl.java
deleted file mode 100644
index 708f685..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/PrimitiveValueImpl.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue;
-
-/**
- * Default {@link PrimitiveValue} Opera implementation
- * 
- * @since 0.1
- */
-public abstract class PrimitiveValueImpl extends MirrorImpl implements PrimitiveValue {
-
-	public PrimitiveValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/RequestManagerImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/RequestManagerImpl.java
deleted file mode 100644
index 8739752..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/RequestManagerImpl.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.BreakpointRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.DebuggerStatementRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ExceptionRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ResumeRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ScriptLoadRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.StepRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.SuspendRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ThreadEnterRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ThreadExitRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.VMDeathRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.VMDisconnectRequestImpl;
-
-/**
- * Default {@link EventRequestManager} implementation for Opera
- * 
- * @since 0.1
- */
-public class RequestManagerImpl extends MirrorImpl implements EventRequestManager {
-
-	private final Map eventsMap = new HashMap();
-	private final List bpreqs = new ArrayList();
-	private final List exreqs = new ArrayList();
-	private final List dsreqs = new ArrayList();
-	private final List slreqs = new ArrayList();
-	private final List stepreqs = new ArrayList();
-	private final List susreqs = new ArrayList();
-	private final List resreqs = new ArrayList();
-	private final List tereqs = new ArrayList();
-	private final List texreqs = new ArrayList();
-	private final List vdetreqs = new ArrayList();
-	private final List vdisreqs = new ArrayList();
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public RequestManagerImpl(VirtualMachineImpl vm) {
-		super(vm);
-		eventsMap.put(BreakpointRequestImpl.class, bpreqs);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createBreakpointRequest(org.eclipse.wst.jsdt.debug.core.jsdi.Location)
-	 */
-	public BreakpointRequest createBreakpointRequest(Location location) {
-		BreakpointRequestImpl request = new BreakpointRequestImpl((VirtualMachineImpl)virtualMachine(), location);
-		bpreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#breakpointRequests()
-	 */
-	public List breakpointRequests() {
-		return Collections.unmodifiableList(bpreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createDebuggerStatementRequest()
-	 */
-	public DebuggerStatementRequest createDebuggerStatementRequest() {
-		DebuggerStatementRequestImpl request = new DebuggerStatementRequestImpl((VirtualMachineImpl) virtualMachine());
-		dsreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#debuggerStatementRequests()
-	 */
-	public List debuggerStatementRequests() {
-		return Collections.unmodifiableList(dsreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createExceptionRequest()
-	 */
-	public ExceptionRequest createExceptionRequest() {
-		ExceptionRequestImpl request = new ExceptionRequestImpl((VirtualMachineImpl) virtualMachine());
-		exreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#exceptionRequests()
-	 */
-	public List exceptionRequests() {
-		return Collections.unmodifiableList(exreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createScriptLoadRequest()
-	 */
-	public ScriptLoadRequest createScriptLoadRequest() {
-		ScriptLoadRequestImpl request = new ScriptLoadRequestImpl((VirtualMachineImpl) virtualMachine());
-		slreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#scriptLoadRequests()
-	 */
-	public List scriptLoadRequests() {
-		return Collections.unmodifiableList(slreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createStepRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference, int)
-	 */
-	public StepRequest createStepRequest(ThreadReference thread, int step) {
-		StepRequestImpl request= new StepRequestImpl((VirtualMachineImpl) virtualMachine(), thread, step);
-		stepreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#stepRequests()
-	 */
-	public List stepRequests() {
-		return Collections.unmodifiableList(stepreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createSuspendRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public SuspendRequest createSuspendRequest(ThreadReference thread) {
-		SuspendRequestImpl request = new SuspendRequestImpl((VirtualMachineImpl) virtualMachine(), thread);
-		susreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#suspendRequests()
-	 */
-	public List suspendRequests() {
-		return Collections.unmodifiableList(susreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createResumeRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public ResumeRequest createResumeRequest(ThreadReference thread) {
-		ResumeRequestImpl request = new ResumeRequestImpl((VirtualMachineImpl) virtualMachine(), thread);
-		resreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#resumeRequests()
-	 */
-	public List resumeRequests() {
-		return Collections.unmodifiableList(resreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadEnterRequest()
-	 */
-	public ThreadEnterRequest createThreadEnterRequest() {
-		ThreadEnterRequestImpl request = new ThreadEnterRequestImpl((VirtualMachineImpl) virtualMachine());
-		tereqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadEnterRequests()
-	 */
-	public List threadEnterRequests() {
-		return Collections.unmodifiableList(tereqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadExitRequest()
-	 */
-	public ThreadExitRequest createThreadExitRequest() {
-		ThreadExitRequestImpl request = new ThreadExitRequestImpl((VirtualMachineImpl) virtualMachine());
-		texreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadExitRequests()
-	 */
-	public List threadExitRequests() {
-		return Collections.unmodifiableList(texreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	public void deleteEventRequest(EventRequest eventRequest) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(java.util.List)
-	 */
-	public void deleteEventRequest(List eventRequests) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDeathRequest()
-	 */
-	public VMDeathRequest createVMDeathRequest() {
-		VMDeathRequestImpl request = new VMDeathRequestImpl((VirtualMachineImpl) virtualMachine());
-		vdetreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDeathRequests()
-	 */
-	public List vmDeathRequests() {
-		return Collections.unmodifiableList(vdetreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDisconnectRequest()
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest() {
-		VMDisconnectRequestImpl request = new VMDisconnectRequestImpl((VirtualMachineImpl) virtualMachine());
-		vdetreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDisconnectRequests()
-	 */
-	public List vmDisconnectRequests() {
-		return Collections.unmodifiableList(vdisreqs);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/StringValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/StringValueImpl.java
deleted file mode 100644
index 19fedea..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/StringValueImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-
-/**
- * Default {@link StringValue} implementation for Opera
- * 
- *  @since 0.1
- */
-public class StringValueImpl extends MirrorImpl implements StringValue {
-
-	String value = null;
-	
-	/**
-	 * Constructor
-	 */
-	public StringValueImpl(VirtualMachineImpl vm, String value) {
-		super(vm);
-		this.value = value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return value;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/UndefinedImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/UndefinedImpl.java
deleted file mode 100644
index e1b5b5d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/UndefinedImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-
-/**
- * Default {@link UndefinedValue} Opera implementation
- * 
- * @since 0.1
- */
-public class UndefinedImpl extends MirrorImpl implements UndefinedValue {
-
-	public static String VALUE = "undefined"; //$NON-NLS-1$
-	
-	public UndefinedImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return VALUE;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/VirtualMachineImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/VirtualMachineImpl.java
deleted file mode 100644
index 4681137..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/VirtualMachineImpl.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-
-import com.google.protobuf.ByteString;
-import com.opera.core.scope.ESDebuggerCommand;
-import com.opera.core.scope.MessageCallback;
-import com.opera.core.scope.ProtocolFormat;
-import com.opera.core.scope.ScopeClient;
-import com.opera.core.scope.ScopeErrorException;
-import com.opera.core.systems.scope.protos.ScopeProtos;
-import com.opera.core.systems.scope.protos.UmsProtos.Command;
-
-/**
- * {@link VirtualMachine} for Opera support
- * 
- * @since 0.1
- */
-public class VirtualMachineImpl extends MirrorImpl implements VirtualMachine {
-
-	private static UndefinedValue undefinedmirror = null;
-	private static NullValue nullmirror = null;
-	private static Object rmilock = new Object();
-	private static Object eqlock = new Object();
-	
-	private ScopeClient client = null;
-	private String name = null;
-	private RequestManagerImpl rmi = null;
-	private EventQueueImpl eqi = null;
-	
-	/**
-	 * Constructor
-	 * @param client
-	 */
-	public VirtualMachineImpl(ScopeClient client) {
-		super();
-		this.client = client;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#resume()
-	 */
-	public void resume() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#suspend()
-	 */
-	public void suspend() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#terminate()
-	 */
-	public void terminate() {
-		client.getClientLock().release();
-		client.close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#name()
-	 */
-	public synchronized String name() {
-		if(name == null) {
-			name = description();
-		}
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#description()
-	 */
-	public String description() {
-		return Messages.vm_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#version()
-	 */
-	public String version() {
-		StringBuffer buff = new StringBuffer("stp: "); //$NON-NLS-1$
-		ScopeProtos.HostInfo.Builder b = ScopeProtos.HostInfo.newBuilder(); 
-		buff.append(Integer.toString(b.getStpVersion())).append(" "); //$NON-NLS-1$
-		buff.append("core: ").append(b.getCoreVersion()); //$NON-NLS-1$
-		buff.append("agent: ").append(b.getUserAgent()); //$NON-NLS-1$
-		buff.append("plat: ").append(b.getPlatform()); //$NON-NLS-1$
-		buff.append("os: ").append(b.getOperatingSystem()); //$NON-NLS-1$
-		return buff.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allThreads()
-	 */
-	public List allThreads() {
-		//TODO send threads request
-		return Collections.EMPTY_LIST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allScripts()
-	 */
-	public List allScripts() {
-		MessageCallback callback = new MessageCallback() {
-			public void onMessageReceived(Object t) {
-				System.out.println("got runtimes"); //$NON-NLS-1$
-			}
-
-			public void onError(ScopeErrorException ex) {
-				System.err.println("got exception"); //$NON-NLS-1$
-			}
-		};
-		Command.Builder command = Command.newBuilder();
-		command.setCommandID(ESDebuggerCommand.LIST_RUNTIMES.getId());
-		command.setFormat(ProtocolFormat.JSON.getValue().intValue());
-		
-		command.setPayload(ByteString.EMPTY);
-		command.setService(ESDebuggerCommand.LIST_RUNTIMES.getName());
-        command.setTag(client.getNextTag());
-		client.sendCommand(command.build(), callback);
-		return Collections.EMPTY_LIST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#dispose()
-	 */
-	public void dispose() {
-		client.close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfUndefined()
-	 */
-	public synchronized UndefinedValue mirrorOfUndefined() {
-		if(undefinedmirror == null) {
-			undefinedmirror = new UndefinedImpl(this);
-		}
-		return undefinedmirror;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfNull()
-	 */
-	public synchronized NullValue mirrorOfNull() {
-		if(nullmirror == null) {
-			nullmirror = new NullValueImpl(this);
-		}
-		return nullmirror;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(boolean)
-	 */
-	public BooleanValue mirrorOf(boolean bool) {
-		return new BooleanValueImpl(this, bool);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.Number)
-	 */
-	public NumberValue mirrorOf(Number number) {
-		return new NumberValueImpl(this, number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.String)
-	 */
-	public StringValue mirrorOf(String string) {
-		return new StringValueImpl(this, string);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventRequestManager()
-	 */
-	public EventRequestManager eventRequestManager() {
-		synchronized (rmilock) {
-			if(rmi == null) {
-				rmi = new RequestManagerImpl(this);
-			}
-		}
-		return rmi;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventQueue()
-	 */
-	public EventQueue eventQueue() {
-		synchronized (eqlock) {
-			if(eqi == null) {
-				eqi = new EventQueueImpl(this);
-			}
-		}
-		return eqi;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/messages.properties b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/messages.properties
deleted file mode 100644
index 3e917cd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-vm_desc=Opera VM
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/BreakpointRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/BreakpointRequestImpl.java
deleted file mode 100644
index 2757ddf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/BreakpointRequestImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link BreakpointRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class BreakpointRequestImpl extends LocatableRequestImpl implements BreakpointRequest {
-
-	ThreadReference thread = null;
-	String condition = null;
-	int hitcount = -1;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param location
-	 */
-	public BreakpointRequestImpl(VirtualMachineImpl vm, Location location) {
-		super(vm, location);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
-	 */
-	public void addConditionFilter(String condition) {
-		this.condition = condition;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
-	 */
-	public void addHitCountFilter(int hitcount) {
-		this.hitcount = hitcount;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/DebuggerStatementRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/DebuggerStatementRequestImpl.java
deleted file mode 100644
index 15ef169..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/DebuggerStatementRequestImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link DebuggerStatementRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class DebuggerStatementRequestImpl extends EventRequestImpl implements DebuggerStatementRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public DebuggerStatementRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/EventRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/EventRequestImpl.java
deleted file mode 100644
index c012196..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/EventRequestImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link EventRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class EventRequestImpl extends MirrorImpl implements EventRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ExceptionRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ExceptionRequestImpl.java
deleted file mode 100644
index d0e8a67..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ExceptionRequestImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ExceptionRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ExceptionRequestImpl extends EventRequestImpl implements ExceptionRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ExceptionRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/LocatableRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/LocatableRequestImpl.java
deleted file mode 100644
index e26541c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/LocatableRequestImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default implementation of a request that has a location
- * 
- * @since 0.1
- */
-public class LocatableRequestImpl extends EventRequestImpl {
-
-	Location location = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param location
-	 */
-	public LocatableRequestImpl(VirtualMachineImpl vm, Location location) {
-		super(vm);
-		this.location = location;
-	}
-
-	/**
-	 * @return the location
-	 */
-	public Location location() {
-		return location;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ResumeRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ResumeRequestImpl.java
deleted file mode 100644
index 35d4d16..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ResumeRequestImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ResumeRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ResumeRequestImpl extends EventRequestImpl implements	ResumeRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ResumeRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ScriptLoadRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ScriptLoadRequestImpl.java
deleted file mode 100644
index 113bbda..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ScriptLoadRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ScriptLoadRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ScriptLoadRequestImpl extends EventRequestImpl implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ScriptLoadRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/StepRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/StepRequestImpl.java
deleted file mode 100644
index 6c860f6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/StepRequestImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link StepRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class StepRequestImpl extends EventRequestImpl implements StepRequest {
-
-	ThreadReference thread = null;
-	int stepkind = -1;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public StepRequestImpl(VirtualMachineImpl vm, ThreadReference thread, int kind) {
-		super(vm);
-		this.thread = thread;
-		this.stepkind = kind;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#step()
-	 */
-	public int step() {
-		return stepkind;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/SuspendRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/SuspendRequestImpl.java
deleted file mode 100644
index 6505507..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/SuspendRequestImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link SuspendRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class SuspendRequestImpl extends EventRequestImpl implements SuspendRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 */
-	public SuspendRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadEnterRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadEnterRequestImpl.java
deleted file mode 100644
index 7f66e51..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadEnterRequestImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ThreadEnterRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ThreadEnterRequestImpl extends EventRequestImpl implements	ThreadEnterRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadEnterRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadExitRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadExitRequestImpl.java
deleted file mode 100644
index 8bd8b84..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadExitRequestImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ThreadExitRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ThreadExitRequestImpl extends EventRequestImpl implements	ThreadExitRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadExitRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDeathRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDeathRequestImpl.java
deleted file mode 100644
index f62fdc1..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDeathRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link VMDeathRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class VMDeathRequestImpl extends EventRequestImpl implements	VMDeathRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public VMDeathRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDisconnectRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDisconnectRequestImpl.java
deleted file mode 100644
index 378612d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDisconnectRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link VMDisconnectRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class VMDisconnectRequestImpl extends EventRequestImpl implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public VMDisconnectRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/HostArgument.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/HostArgument.java
deleted file mode 100644
index 6adbc08..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/HostArgument.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.launching;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-
-/**
- * Implementation of a string argument that describes the host argument
- * 
- * @since 1.0
- */
-public class HostArgument implements StringArgument {
-
-	private static final long serialVersionUID = 3057403815318177030L;
-	private String host;
-
-	/**
-	 * Host attribute name
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param host
-	 */
-	public HostArgument(String host) {
-		setValue(host);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return "host"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return "Host:"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return HOST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String host) {
-		if(host == null) {
-			this.host = "localhost"; //$NON-NLS-1$
-		}
-		else {
-			if (!isValid(host)) {
-				throw new IllegalArgumentException();
-			}
-			this.host = host;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return host;
-	}
-
-	/**
-	 * Returns if the given host is <code>localhost</code> or <code>127.0.0.1</code>
-	 * @param host
-	 * @return true if the given host it localhost (127.0.0.1) false otherwise
-	 */
-	public static boolean isLocalhost(String host) {
-		return host.equals("localhost") || host.equals("127.0.0.1"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/Messages.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/Messages.java
deleted file mode 100644
index 559ea1d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/Messages.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.launching;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.opera.internal.launching.messages"; //$NON-NLS-1$
-	public static String connector_desc;
-	public static String connector_id;
-	public static String connector_name;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/OperaListeningConnector.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/OperaListeningConnector.java
deleted file mode 100644
index ecfcf7b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/OperaListeningConnector.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.launching;
-
-import java.beans.ExceptionListener;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-import com.opera.core.DefaultListener;
-import com.opera.core.ScopeSDK;
-import com.opera.core.scope.ScopeClient;
-
-/**
- * Default listening connector
- */
-public class OperaListeningConnector implements ListeningConnector {
-
-	/**
-	 * Constructor
-	 */
-	public OperaListeningConnector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		HashMap args = new HashMap();
-		args.put(HostArgument.HOST, new HostArgument(null));
-		args.put(PortArgument.PORT, new PortArgument(7001));
-		return args;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.connector_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.connector_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return Messages.connector_id;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector#accept(java.util.Map)
-	 */
-	public VirtualMachine accept(Map arguments) throws IOException {
-		DefaultListener listener = new DefaultListener();
-		ExceptionListener el = new ExceptionListener() {
-			public void exceptionThrown(Exception e) {
-				e.printStackTrace();
-			}
-		};
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		if(host == null || port == null) {
-			throw new IOException("The host or port arguments cannot be null"); //$NON-NLS-1$
-		}
-		int portnum = -1;
-		try {
-			portnum = Integer.parseInt(port);
-		}
-		catch(NumberFormatException nfe) {
-			throw new IOException("The given port was not an integer"); //$NON-NLS-1$
-		}
-		ScopeSDK scope = new ScopeSDK(listener, el, host, portnum, -1, null);
-		try {
-			scope.start();
-			ScopeClient client = listener.waitForClient(50000, TimeUnit.MILLISECONDS);
-			if(client != null) {
-				VirtualMachineImpl vm = new VirtualMachineImpl(client);
-				return vm;
-			}
-			throw new IOException("Could not start the ScopeSDK builder"); //$NON-NLS-1$
-		}
-		catch(IOException ioe) {
-			scope.stop();
-			throw ioe;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/PortArgument.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/PortArgument.java
deleted file mode 100644
index f4e5db3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.launching;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return "The local port to open"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return "Port:"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/messages.properties b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/messages.properties
deleted file mode 100644
index 58d05a8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-connector_desc=Starts the Opera builder and listens for a browser to connect
-connector_id=org.eclipse.wst.jsdt.debug.opera.listening.connector
-connector_name=Opera - Listening Connector
