summaryrefslogtreecommitdiffstats
path: root/private/unimodem/new
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/unimodem/new
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/unimodem/new')
-rw-r--r--private/unimodem/new/detect/d.c828
-rw-r--r--private/unimodem/new/detect/makefile6
-rw-r--r--private/unimodem/new/detect/sources24
-rw-r--r--private/unimodem/new/match/match.c80
-rw-r--r--private/unimodem/new/match/mt.c424
-rw-r--r--private/unimodem/new/match/mt.h28
-rw-r--r--private/unimodem/new/match/resp.c3535
-rw-r--r--private/unimodem/new/mic/alloc.h86
-rw-r--r--private/unimodem/new/mic/chksum.cpp57
-rw-r--r--private/unimodem/new/mic/chksum.h23
-rw-r--r--private/unimodem/new/mic/common.h32
-rw-r--r--private/unimodem/new/mic/consts.h30
-rw-r--r--private/unimodem/new/mic/dev.cpp1103
-rw-r--r--private/unimodem/new/mic/dev.h136
-rw-r--r--private/unimodem/new/mic/globals.cpp53
-rw-r--r--private/unimodem/new/mic/globals.h28
-rw-r--r--private/unimodem/new/mic/ilist.cpp58
-rw-r--r--private/unimodem/new/mic/ilist.h66
-rw-r--r--private/unimodem/new/mic/inf.cpp903
-rw-r--r--private/unimodem/new/mic/inf.h998
-rw-r--r--private/unimodem/new/mic/ini.cpp153
-rw-r--r--private/unimodem/new/mic/ini.h210
-rw-r--r--private/unimodem/new/mic/main.cpp18
-rw-r--r--private/unimodem/new/mic/makefile6
-rw-r--r--private/unimodem/new/mic/mic.cpp167
-rw-r--r--private/unimodem/new/mic/mic.h1
-rw-r--r--private/unimodem/new/mic/notes.txt231
-rw-r--r--private/unimodem/new/mic/resp.cpp3538
-rw-r--r--private/unimodem/new/mic/sample.inf64
-rw-r--r--private/unimodem/new/mic/sources36
-rw-r--r--private/unimodem/new/mic/sym.cpp316
-rw-r--r--private/unimodem/new/mic/sym.h215
-rw-r--r--private/unimodem/new/mic/sync.cpp35
-rw-r--r--private/unimodem/new/mic/sync.h148
-rw-r--r--private/unimodem/new/mic/tdev.cpp84
-rw-r--r--private/unimodem/new/mic/test.h2
-rw-r--r--private/unimodem/new/mic/tsym.cpp65
-rw-r--r--private/unimodem/new/readme.txt11
-rw-r--r--private/unimodem/new/slot/client.c47
-rw-r--r--private/unimodem/new/slot/main.c514
-rw-r--r--private/unimodem/new/slot/makefile6
-rw-r--r--private/unimodem/new/slot/sec.c169
-rw-r--r--private/unimodem/new/slot/sec.h24
-rw-r--r--private/unimodem/new/slot/slot.c486
-rw-r--r--private/unimodem/new/slot/slot.h32
-rw-r--r--private/unimodem/new/slot/sources27
46 files changed, 15103 insertions, 0 deletions
diff --git a/private/unimodem/new/detect/d.c b/private/unimodem/new/detect/d.c
new file mode 100644
index 000000000..1a1af6625
--- /dev/null
+++ b/private/unimodem/new/detect/d.c
@@ -0,0 +1,828 @@
+/*
+ * Detection routines for modems.
+ *
+ * Microsoft Confidential
+ * Copyright (c) Microsoft Corporation 1993-1994
+ * All rights reserved
+ *
+ */
+
+#include <windows.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#define CR '\r'
+#define LF '\n'
+
+#define ASSERT(xxx) ((void) 0)
+
+#define DEBUG
+
+//#define NO_ERROR 0
+#define ERROR_PORT_INACCESSIBLE 1
+#define ERROR_NO_MODEM 2
+//#define ERROR_ACCESS_DENIED 3
+//#define ERROR_CANCELLED 4
+
+#define RESPONSE_RCV_DELAY 5000 // A long time (5 secs) because
+ // once we have acquired the modem
+ // we can afford the wait.
+
+#define MAX_QUERY_RESPONSE_LEN 100
+#define MAX_SHORT_RESPONSE_LEN 30 // echo of ATE0Q0V1<cr> and
+ // <cr><lf>ERROR<cr><lf> by a
+ // little margin
+
+#define ATI0_LEN 30 // amount of the ATI0 query that
+ // we will save
+
+#define ATI0 0 // we will use this result completely
+#define ATI4 4 // we will use this result completely,
+ // if it matches the Hayes format
+ // (check for 'a' at beginning)
+
+// Return values for the FindModem function
+//
+#define RESPONSE_USER_CANCEL (-4) // user requested cancel
+#define RESPONSE_UNRECOG (-3) // got some chars, but didn't
+ // understand them
+#define RESPONSE_NONE (-2) // didn't get any chars
+#define RESPONSE_FAILURE (-1) // internal error or port error
+#define RESPONSE_OK 0 // matched with index of <cr><lf>OK<cr><lf>
+#define RESPONSE_ERROR 1 // matched with index of <cr><lf>ERROR<cr><lf>
+
+#ifdef WIN32
+typedef HANDLE HPORT; // variable type used in FindModem
+#else
+typedef int HPORT; // variable type used in FindModem
+#endif
+
+#define IN_QUEUE_SIZE 8192
+#define OUT_QUEUE_SIZE 256
+
+#define RCV_DELAY 2000
+#define CHAR_DELAY 100
+
+#define CBR_HACK_115200 0xff00 // This is how we set 115,200 on
+ // Win 3.1 because of a stupid bug.
+
+char const FAR c_szNoEcho[] = "ATE0Q0V1\r";
+
+// WARNING! If you change these, you will have to change ALL of your
+// CompatIDs!!!
+char const FAR *c_aszQueries[] = { "ATI0\r", "ATI1\r", "ATI2\r", "ATI3\r",
+ "ATI4\r", "ATI5\r", "ATI6\r", "ATI7\r",
+ "ATI8\r", "ATI9\r", "ATI10\r", "AT%V\r" };
+
+// these are mostly for #'s. If a numeric is adjoining one of these, it
+// will not be treated as special.
+// Warning: Change any of these and you have to redo all of the CRCs!!!!
+// Case insensitive compares
+char const FAR *c_aszIncludes[] = { "300",
+ "1200",
+ "2400", "2,400",
+ "9600", "96", "9.6", "9,600",
+ "12000", "120", "12.0", "12,000",
+ "14400", "144", "14.4", "14,400",
+ "16800", "168", "16.8", "16,800",
+ "19200", "192", "19.2", "19,200",
+ "21600", "216", "21.6", "21,600",
+ "24000", "240", "24.0", "24,000",
+ "26400", "264", "26.4", "26,400",
+ "28800", "288", "28.8", "28,800",
+ "31200", "312", "31.2", "31,200",
+ "33600", "336", "33.6", "33,600",
+ "36000", "360", "36.0", "36,000",
+ "38400", "384", "38.4", "38,400",
+ "9624", "32bis", "42bis", "V32",
+ "V.32", "V.FC", "FAST", "FAX",
+ "DATA", "VOICE", "" };
+
+// Matches will be case-insensitive
+char const FAR *c_aszExcludes[] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
+ "JUL", "AUG", "SEP", "OCT", "NOV", "DEC",
+ "" };
+
+// case sensitive matching
+char const FAR *c_aszBails[] = { "CONNECT", "RING", "NO CARRIER",
+ "NO DIALTONE", "BUSY", "NO ANSWER", "=" };
+
+// start after CBR_9600
+UINT const FAR c_auiUpperBaudRates[] = { CBR_19200, CBR_38400, CBR_56000,
+ CBR_HACK_115200 };
+
+char const FAR *c_aszResponses[] = { "\r\nOK\r\n", "\r\nERROR\r\n" };
+
+// Some MultiTech's send 0<cr> in response to AT%V (they go
+// into numeric mode)
+char const FAR *c_aszNumericResponses[] = { "0\r", "4\r" };
+
+char const FAR c_szHex[] = "0123456789abcdef";
+
+struct DCE {
+ char pszStr[4];
+ DWORD dwDce;
+ DWORD dwAlternateDce;
+} DCE_Table[] = {
+ "384", 38400, 300, // Some PDI's will report 38400, and this won't work for them. Screw 'em.
+ "360", 36000, 300,
+ "336", 33600, 300,
+ "312", 31200, 300,
+ "288", 28800, 2400,
+ "264", 26400, 2400,
+ "240", 24000, 2400,
+ "216", 21600, 2400,
+ "192", 19200, 1200,
+ "168", 16800, 1200,
+ "14", 14400, 1200,
+ "120", 12000, 1200,
+ "9", 9600, 300,
+ "2", 2400, 300,
+ "1", 1200, 300,
+ "3", 300, 0
+};
+
+#pragma data_seg()
+
+
+
+// BUGBUG - WARNING: Not for DBCS usage - is not a real bugbug since modems aren't DBCS.
+//#define isupper(ch) (((ch) >= 'A' && (ch) <= 'Z') ? TRUE : FALSE)
+//#define islower(ch) (((ch) >= 'a' && (ch) <= 'z') ? TRUE : FALSE)
+//#define isalpha(ch) ((toupper(ch) >= 'A' && toupper(ch) <= 'Z') ? TRUE : FALSE)
+#define toupper(ch) (islower(ch) ? (ch) - 'a' + 'A' : (ch))
+#define ishex(ch) ((toupper(ch) >= 'A' && toupper(ch) <= 'F') ? TRUE : FALSE)
+#define isnum(num) ((num >= '0' && num <= '9') ? TRUE : FALSE)
+
+#define MAX_TEST_TRIES 4
+
+
+#define MAX_LOG_PRINTF_LEN 256
+void _cdecl LogPrintf(HANDLE hLog, UINT uResourceFmt, ...);
+
+DWORD NEAR PASCAL FindModem(HPORT hPort);
+
+#ifdef DEBUG
+void HexDump( TCHAR *, LPBYTE lpBuf, DWORD cbLen);
+#define HEXDUMP(_a, _b, _c) HexDump(_a, _b, _c)
+#else // !DEBUG
+#define HEXDUMP(_a, _b, _c) ((void) 0)
+#endif
+
+
+BOOL
+TestBaudRate(
+ IN HPORT hPort,
+ IN UINT uiBaudRate,
+ IN DWORD dwRcvDelay,
+ OUT BOOL FAR *lpfCancel);
+
+DWORD
+NEAR PASCAL
+SetPortBaudRate(
+ HPORT hPort,
+ UINT BaudRate);
+int
+NEAR PASCAL
+ReadResponse(
+ HPORT hPort,
+ LPBYTE lpvBuf,
+ UINT uRead,
+ BOOL fMulti,
+ DWORD dwRcvDelay
+);
+
+UINT
+NEAR PASCAL
+ReadPort(
+ HPORT hPort,
+ LPBYTE lpvBuf,
+ UINT uRead,
+ DWORD dwRcvDelay,
+ int FAR *lpiError,
+ BOOL FAR *lpfCancel);
+
+
+int FAR PASCAL mylstrncmp(LPCSTR pchSrc, LPCSTR pchDest, int count)
+{
+ for ( ; count && *pchSrc == *pchDest; pchSrc++, pchDest++, count--) {
+ if (*pchSrc == '\0')
+ return 0;
+ }
+ return count;
+}
+
+int FAR PASCAL mylstrncmpi(LPCSTR pchSrc, LPCSTR pchDest, int count)
+{
+ for ( ; count && toupper(*pchSrc) == toupper(*pchDest); pchSrc++, pchDest++, count--) {
+ if (*pchSrc == '\0')
+ return 0;
+ }
+ return count;
+}
+
+
+DWORD
+MyWriteComm(
+ HANDLE hPort,
+ LPBYTE lpBuf,
+ DWORD cbLen)
+{
+ COMMTIMEOUTS cto;
+ DWORD cbLenRet;
+
+ HEXDUMP (TEXT("Write"), lpBuf, cbLen);
+ // Set comm timeout
+ if (!GetCommTimeouts(hPort, &cto))
+ {
+ ZeroMemory(&cto, sizeof(cto));
+ };
+
+ // Allow a constant write timeout
+ cto.WriteTotalTimeoutMultiplier = 0;
+ cto.WriteTotalTimeoutConstant = 1000; // 1 second
+ SetCommTimeouts(hPort, &cto);
+
+ // Synchronous write
+ WriteFile(hPort, lpBuf, cbLen, &cbLenRet, NULL);
+ return cbLenRet;
+}
+
+#define MyFlushComm PurgeComm
+#define MyCloseComm CloseHandle
+
+
+/*----------------------------------------------------------
+Purpose: This function queries the given port to find a legacy
+ modem.
+
+ If a modem is detected and we recognize it (meaning
+ we have the hardware ID in our INF files), or if we
+ successfully create a generic hardware ID and
+ inf file, then this function also creates the phantom
+ device instance of this modem.
+
+ NOTE (scotth): in Win95, this function only detected
+ the modem and returned the hardware ID and device
+ description. For NT, this function also creates the
+ device instance. I made this change because it is
+ faster.
+
+Returns: NO_ERROR
+ ERROR_PORT_INACCESSIBLE
+ ERROR_NO_MODEM
+ ERROR_ACCESS_DENIED
+ ERROR_CANCELLED
+
+Cond: --
+*/
+DWORD
+//PUBLIC
+DetectModemOnPort(LPCTSTR pszPort)
+{
+ DWORD dwRet;
+ HPORT hPort;
+ DWORD cbLen;
+
+ hPort = CreateFile(pszPort,
+ GENERIC_WRITE | GENERIC_READ,
+ 0, NULL,
+ OPEN_EXISTING, 0, NULL);
+
+ if (hPort == INVALID_HANDLE_VALUE)
+ {
+ dwRet = GetLastError();
+ if (dwRet == ERROR_ACCESS_DENIED) {
+ printf("Port %s is in use by another app.\r\n", pszPort);
+ }
+ else
+ {
+ printf("Couldn't open port %s.\r\n", pszPort);
+ }
+ }
+ else
+ {
+ SetupComm (hPort, IN_QUEUE_SIZE, OUT_QUEUE_SIZE);
+
+ printf("Opened Port %s", pszPort);
+
+ // Check for a modem on the port
+
+ dwRet = FindModem(hPort);
+
+ if (dwRet == NO_ERROR)
+ {
+ printf("Found modem\r\n");
+ }
+ else
+ {
+ printf("Did not find modem\r\n");
+ }
+
+ MyFlushComm(hPort, PURGE_RXCLEAR | PURGE_TXCLEAR);
+ EscapeCommFunction(hPort, CLRDTR);
+ MyCloseComm(hPort);
+
+ } // hPort < 0
+
+ return dwRet;
+}
+
+#define HAYES_COMMAND_LEN 40
+
+
+
+// Switch to requested baud rate and try sending ATE0Q0V1 and return whether it works or not
+// Try MAX_TEST_TRIES
+// Returns: TRUE on SUCCESS
+// FALSE on failure (including user cancels)
+BOOL
+TestBaudRate(
+ IN HPORT hPort,
+ IN UINT uiBaudRate,
+ IN DWORD dwRcvDelay,
+ OUT BOOL FAR *lpfCancel)
+{
+ DWORD cbLen;
+ int iTries = MAX_TEST_TRIES;
+
+ *lpfCancel = FALSE;
+
+ while (iTries--)
+ {
+ // try new baud rate
+ if (SetPortBaudRate(hPort, uiBaudRate) == NO_ERROR)
+ {
+ cbLen = lstrlenA(c_szNoEcho); // Send an ATE0Q0V1<cr>
+
+ // clear the read queue, there shouldn't be anything there
+ PurgeComm(hPort, PURGE_RXCLEAR);
+ if (MyWriteComm(hPort, (LPBYTE)c_szNoEcho, cbLen) == cbLen)
+ {
+ switch(ReadResponse(hPort, NULL, MAX_SHORT_RESPONSE_LEN, FALSE, dwRcvDelay))
+ {
+ case RESPONSE_OK:
+ return TRUE;
+
+ case RESPONSE_USER_CANCEL:
+ *lpfCancel = TRUE;
+ return FALSE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+
+// Tries to figure out if there is a modem on the port. If there is, it
+// will try to find a good speed to talk to it at (300,1200,2400,9600).
+// Modem will be set to echo off, result codes on, and verbose result codes. (E0Q0V1)
+DWORD
+FindModem(HPORT hPort)
+{
+ UINT uGoodBaudRate;
+ BOOL fCancel = FALSE;
+
+ Sleep(500); // Wait, give time for modem to spew junk if any.
+
+ if (TestBaudRate(hPort, CBR_9600, 500, &fCancel))
+ {
+ uGoodBaudRate = CBR_9600;
+ }
+ else
+ {
+ if (!fCancel && TestBaudRate(hPort, CBR_2400, 500, &fCancel))
+ {
+ uGoodBaudRate = CBR_2400;
+ }
+ else
+ {
+ if (!fCancel && TestBaudRate(hPort, CBR_1200, 500, &fCancel))
+ {
+ uGoodBaudRate = CBR_1200;
+ }
+ else
+ {
+ // Hayes Accura 288 needs this much at 300bps
+ if (!fCancel && TestBaudRate(hPort, CBR_300, 1000, &fCancel))
+ {
+ uGoodBaudRate = CBR_300;
+ }
+ else
+ {
+ uGoodBaudRate = 0;
+ }
+ }
+ }
+ }
+
+ if (fCancel)
+ {
+ return ERROR_CANCELLED;
+ }
+
+ if (uGoodBaudRate)
+ {
+ return NO_ERROR;
+ }
+ else
+ {
+ return ERROR_NO_MODEM;
+ }
+}
+
+DWORD NEAR PASCAL SetPortBaudRate(HPORT hPort, UINT BaudRate)
+{
+ DCB DCB;
+
+ // Get a Device Control Block with current port values
+
+ if (GetCommState(hPort, &DCB) < 0) {
+ printf("GetCommState failed");
+ return ERROR_PORT_INACCESSIBLE;
+ }
+
+ DCB.BaudRate = BaudRate;
+ DCB.ByteSize = 8;
+ DCB.Parity = 0;
+ DCB.StopBits = 0;
+ DCB.fBinary = 1;
+ DCB.fParity = 0;
+
+ if (SetCommState(hPort, &DCB) < 0) {
+ printf("SetCommState failed");
+ return ERROR_PORT_INACCESSIBLE;
+ }
+ printf("SetBaud rate to %lu\r\n", BaudRate);
+
+ return NO_ERROR;
+}
+
+#define MAX_RESPONSE_BURST_SIZE 8192
+#define MAX_NUM_RESPONSE_READ_TRIES 30 // digicom scout needs this much + some safety
+#define MAX_NUM_MULTI_TRIES 3 // Maximum number of 'q's to be sent when we aren't getting any response
+
+// Read in response. Handle multi-pagers. Return a null-terminated string.
+// Also returns response code.
+// If lpvBuf == NULL
+// cbRead indicates the max amount to read. Bail if more than this.
+// Else
+// cbRead indicates the size of lpvBuf
+// This can not be a state driven (ie. char by char) read because we
+// must look for responses from the end of a sequence of chars backwards.
+// This is because "ATI2" on some modems will return
+// "<cr><lf>OK<cr><lf><cr><lf>OK<cr><lf>" and we only want to pay attention
+// to the final OK. Yee haw!
+// Returns: RESPONSE_xxx
+int
+ReadResponse(
+ HPORT hPort,
+ LPBYTE lpvBuf,
+ UINT cbRead,
+ BOOL fMulti,
+ DWORD dwRcvDelay)
+{
+ int iRet = RESPONSE_UNRECOG;
+ LPBYTE pszBuffer;
+ BOOL fDoCopy = TRUE;
+ UINT uBufferLen, uResponseLen;
+ UINT uReadTries = MAX_NUM_RESPONSE_READ_TRIES;
+ UINT i;
+ UINT uOutgoingBufferCount = 0;
+ UINT uAllocSize = lpvBuf ? MAX_RESPONSE_BURST_SIZE : cbRead;
+ UINT uTotalReads = 0;
+ UINT uNumMultiTriesLeft = MAX_NUM_MULTI_TRIES;
+ int iError;
+ BOOL fCancel;
+ BOOL fHadACommError = FALSE;
+
+ ASSERT(cbRead);
+
+ // do we need to adjust cbRead?
+ if (lpvBuf)
+ {
+ cbRead--; // preserve room for terminator
+ }
+
+ // Allocate buffer
+ if (!(pszBuffer = (LPBYTE)LocalAlloc(LMEM_FIXED, uAllocSize)))
+ {
+ return RESPONSE_FAILURE;
+ }
+
+ while (uReadTries--)
+ {
+ // Read response into buffer
+ uBufferLen = ReadPort(hPort, pszBuffer, uAllocSize, dwRcvDelay, &iError, &fCancel);
+
+ // Did the user request a cancel?
+ if (fCancel)
+ {
+ iRet = RESPONSE_USER_CANCEL;
+ goto Exit;
+ }
+
+ // any errors?
+ if (iError)
+ {
+ // BUGBUG - Were screwed if we get an error during a multi-pager.
+ fHadACommError = TRUE;
+#ifdef DEBUG
+ printf(TEXT("comm errorn"));
+#endif // DEBUG
+ }
+
+ // Did we not get any chars?
+ if (uBufferLen)
+ {
+ uNumMultiTriesLeft = MAX_NUM_MULTI_TRIES; // reset num multi tries left, since we got some data
+ uTotalReads += uBufferLen;
+ HEXDUMP(TEXT("Read"), pszBuffer, uBufferLen);
+ if (lpvBuf)
+ {
+ // fill outgoing buffer if there is room
+ for (i = 0; i < uBufferLen; i++)
+ {
+ if (uOutgoingBufferCount < cbRead)
+ {
+ lpvBuf[uOutgoingBufferCount++] = pszBuffer[i];
+ }
+ else
+ {
+ break;
+ }
+ }
+ // null terminate what we have so far
+ lpvBuf[uOutgoingBufferCount] = 0;
+ }
+ else
+ {
+ if (uTotalReads >= cbRead)
+ {
+ printf("Bailing ReadResponse because we exceeded our maximum read allotment.");
+ goto Exit;
+ }
+ }
+
+ // try to find a matching response (crude but quick)
+ for (i = 0; i < sizeof(c_aszResponses)/sizeof(*c_aszResponses); i++)
+ {
+ // Verbose responses
+ uResponseLen = lstrlenA(c_aszResponses[i]);
+
+ // enough read to match this response?
+ if (uBufferLen >= uResponseLen)
+ {
+ if (!mylstrncmp(c_aszResponses[i], pszBuffer + uBufferLen - uResponseLen, uResponseLen))
+ {
+ iRet = i;
+ goto Exit;
+ }
+ }
+
+ // Numeric responses, for cases like when a MultiTech interprets AT%V to mean "go into numeric response mode"
+ uResponseLen = lstrlenA(c_aszNumericResponses[i]);
+
+ // enough read to match this response?
+ if (uBufferLen >= uResponseLen)
+ {
+ if (!mylstrncmp(c_aszNumericResponses[i], pszBuffer + uBufferLen - uResponseLen, uResponseLen))
+ {
+ DCB DCB;
+
+
+ // Get current baud rate
+ if (GetCommState(hPort, &DCB) == 0)
+ {
+ // Put modem back into Verbose response mode
+ if (!TestBaudRate(hPort, DCB.BaudRate, 0, &fCancel))
+ {
+ if (fCancel)
+ {
+ iRet = RESPONSE_USER_CANCEL;
+ goto Exit;
+ }
+ else
+ {
+ printf(TEXT("couldn't recover contact with the modem.\n"));
+ // don't return error on failure, we have good info
+ }
+ }
+ }
+ else
+ {
+ printf("GetCommState failed");
+ // don't return error on failure, we have good info
+ }
+
+ iRet = i;
+ goto Exit;
+ }
+ }
+ }
+ }
+ else
+ {
+ // have we received any chars at all (ie. from this or any previous reads)?
+ if (uTotalReads)
+ {
+ if (fMulti && uNumMultiTriesLeft)
+ { // no match found, so assume it is a multi-pager, send a 'q'
+ // 'q' will catch those pagers that will think 'q' means quit.
+ // else, we will work with the pages that just need any ole' char.
+ uNumMultiTriesLeft--;
+ printf("sending a 'q' because of a multi-pager.");
+ if (MyWriteComm(hPort, "q", 1) != 1)
+ {
+ printf(TEXT("WriteComm failed"));
+ iRet = RESPONSE_FAILURE;
+ goto Exit;
+ }
+ continue;
+ }
+ else
+ { // we got a response, but we didn't recognize it
+ //ASSERT(iRet == RESPONSE_UNRECOG); // check initial setting
+ goto Exit;
+ }
+ }
+ else
+ { // we didn't get any kind of response
+ iRet = RESPONSE_NONE;
+ goto Exit;
+ }
+ }
+ } // while
+
+Exit:
+ // Free local buffer
+ LocalFree((HLOCAL)pszBuffer);
+ if (fHadACommError && RESPONSE_USER_CANCEL != iRet)
+ {
+ iRet = RESPONSE_FAILURE;
+ }
+ return iRet;
+}
+
+// returns buffer full o' data and an int.
+// if dwRcvDelay is NULL, default RCV_DELAY will be used, else
+// dwRcvDelay (miliseconds) will be used
+// *lpfCancel will be true if we are exiting because of a user requested cancel.
+UINT
+ReadPort(
+ HPORT hPort,
+ LPBYTE lpvBuf,
+ UINT uRead,
+ DWORD dwRcvDelay,
+ int FAR *lpiError,
+ BOOL FAR *lpfCancel)
+{
+ DWORD cb, cbLenRet;
+ UINT uTotal = 0;
+ DWORD tStart;
+ DWORD dwDelay;
+ COMSTAT comstat;
+ COMMTIMEOUTS cto;
+ DWORD dwError;
+ DWORD cbLeft;
+#ifdef DEBUG
+ DWORD dwZeroCount = 0;
+#endif // DEBUG
+
+ ASSERT(lpvBuf);
+ ASSERT(uRead);
+ ASSERT(lpiError);
+
+ *lpiError = 0;
+ *lpfCancel = FALSE;
+
+ tStart = GetTickCount();
+ dwDelay = dwRcvDelay ? dwRcvDelay : RCV_DELAY;
+
+ // save space for terminator
+ uRead--;
+ cbLeft=uRead;
+
+
+ // Set comm timeout
+ if (!GetCommTimeouts(hPort, &cto))
+ {
+ ZeroMemory(&cto, sizeof(cto));
+ };
+ // Allow a constant write timeout
+ cto.ReadIntervalTimeout = 0;
+ cto.ReadTotalTimeoutMultiplier = 0;
+ cto.ReadTotalTimeoutConstant = 25;
+ SetCommTimeouts(hPort, &cto);
+
+ do
+ {
+ cb = 0;
+ while( cbLeft
+ && ReadFile(hPort, lpvBuf + uTotal + cb, 1, &cbLenRet, NULL)
+ && (cbLenRet))
+ {
+ ASSERT(cbLenRet==1);
+ cb ++;
+ cbLeft--;
+ };
+
+#ifdef DEBUG
+ if (cb)
+ {
+ dwZeroCount = 0;
+ }
+ else
+ {
+ dwZeroCount++;
+ }
+#endif // DEBUG
+
+ {
+ MSG msg;
+
+ while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ DispatchMessage(&msg);
+ };
+ }
+
+ if (cb == 0) // possible error?
+ {
+ //*lpiError |= GetCommError(hPort, &comstat);
+ dwError = 0;
+ ClearCommError(hPort, &dwError, &comstat);
+ *lpiError |= dwError;
+#ifdef DEBUG
+ if (dwError)
+ {
+// //TRACE_MSG(TF_DETECT, "ReadComm returned %d, comstat: status = %hx, in = %u, out = %u",
+ //cb, dwError, comstat.cbInQue, comstat.cbOutQue);
+ };
+#endif // DEBUG
+ }
+
+ if (cb)
+ {
+ // successful read - add to total and reset delay
+ uTotal += cb;
+
+ if (uTotal >= uRead)
+ {
+ ASSERT(uTotal == uRead);
+ break;
+ }
+ tStart = GetTickCount();
+ dwDelay = CHAR_DELAY;
+ }
+ else
+ {
+ printf(TEXT("."));
+ }
+
+ // While read is successful && time since last read < delay allowed)
+ } while (cbLeft && (GetTickCount() - tStart) < dwDelay);
+
+ *(lpvBuf+uTotal) = 0;
+
+ //TRACE_MSG(TF_DETECT, "ReadPort returning %d", uTotal);
+ return uTotal;
+}
+
+
+#ifdef DEBUG
+void HexDump(TCHAR *ptchHdr, LPBYTE lpBuf, DWORD cbLen)
+{
+ TCHAR rgch[10000];
+ TCHAR *pc = rgch;
+ TCHAR *pcMore = TEXT("");
+
+ if (1) //DisplayDebug(TF_DETECT))
+ {
+ pc += wsprintf(pc, TEXT("HEX DUMP(%s,%lu): ["), ptchHdr, cbLen);
+ if (cbLen>1000) {pcMore = TEXT(", ..."); cbLen=1000;}
+
+ for(;cbLen--; lpBuf++)
+ {
+ pc += wsprintf(pc, TEXT(" %02lx"), (unsigned long) *lpBuf);
+ if (!((cbLen+1)%20))
+ {
+ pc += wsprintf(pc, TEXT("\r\n"));
+ }
+ }
+ pc += wsprintf(pc, TEXT("]\r\n"));
+
+ //OutputDebugString(rgch);
+ printf(rgch);
+ }
+}
+#endif // DEBUG
+
+int __cdecl main(int argc, char *argv[])
+{
+ if (argc!=2) {printf("Usage: detect <port>\n"); goto end;}
+ DetectModemOnPort(argv[1]);
+end:
+ return 0;
+}
diff --git a/private/unimodem/new/detect/makefile b/private/unimodem/new/detect/makefile
new file mode 100644
index 000000000..6ee4f43fa
--- /dev/null
+++ b/private/unimodem/new/detect/makefile
@@ -0,0 +1,6 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the components of NT OS/2
+#
+!INCLUDE $(NTMAKEENV)\makefile.def
diff --git a/private/unimodem/new/detect/sources b/private/unimodem/new/detect/sources
new file mode 100644
index 000000000..0d7eaa1bc
--- /dev/null
+++ b/private/unimodem/new/detect/sources
@@ -0,0 +1,24 @@
+MAJORCOMP=net
+MINORCOMP=unimodem
+
+TARGETNAME=detect
+TARGETPATH=obj
+TARGETTYPE=PROGRAM
+TARGETLIBS=\
+ $(BASEDIR)\public\sdk\lib\*\kernel32.lib \
+ $(BASEDIR)\public\sdk\lib\*\user32.lib
+
+
+INCLUDES=$(BASEDIR)\public\sdk\inc;.
+
+C_DEFINES=-DWINVER=0x0400
+
+USE_CRTDLL=1
+
+SOURCES= d.C
+
+UMTYPE=console
+
+!IFNDEF 386_WARNING_LEVEL
+386_WARNING_LEVEL=/W3
+!ENDIF
diff --git a/private/unimodem/new/match/match.c b/private/unimodem/new/match/match.c
new file mode 100644
index 000000000..b2df5ae6a
--- /dev/null
+++ b/private/unimodem/new/match/match.c
@@ -0,0 +1,80 @@
+#include "unimdm.h"
+#include <stdio.h>
+#include "mt.h"
+
+extern CHAR **rgpszResp;
+
+#define SIMPLE 0
+#define COMPLEX 1
+#define ACTUAL 2
+//#define TEST_TYPE (SIMPLE)
+#define TEST_TYPE (COMPLEX)
+//#define TEST_TYPE (ACTUAL)
+
+extern CHAR *rgpszSimpleResp[];
+extern CHAR *rgpszComplexResp[];
+extern CHAR *rgpszActualResp[];
+
+
+#if (TEST_TYPE==SIMPLE)
+# define TEST_RESP_ARRAY rgpszSimpleResp
+#elif (TEST_TYPE==COMPLEX)
+# define TEST_RESP_ARRAY rgpszComplexResp
+#elif (TEST_TYPE==ACTUAL)
+# define TEST_RESP_ARRAY rgpszActualResp
+#endif
+
+CHAR **rgpszResp = TEST_RESP_ARRAY;
+
+main()
+{
+ HMATCHTREE hmt = 0;
+ DWORD dwRet = 0;
+ CHAR **ppsz;
+ CHAR *pszResp;
+ PMATCHREC rgmr=NULL,pmr = NULL;
+ DWORD dwcmr=0;
+
+ // count number of records
+ for (ppsz=rgpszResp;*ppsz;ppsz++)
+ {
+ dwcmr++;
+ }
+ printf("Number of records: %lu\n", (unsigned long) dwcmr);
+
+ // Allocate space and initialize the mr records.
+ rgmr = LocalAlloc(LPTR, dwcmr*sizeof(MATCHREC));
+ for (pmr=rgmr, ppsz=rgpszResp;pmr<(rgmr+dwcmr);pmr++,ppsz++)
+ {
+ pmr->dwLen = lstrlen(*ppsz);
+ pmr->pb = *ppsz;
+ pmr->pv = *ppsz;
+ }
+
+ hmt = mtCreateTree(rgmr, dwcmr);
+
+ // Free the mr array...
+ LocalFree(rgmr); pmr=rgmr=NULL;
+
+ mtDumpTree(hmt);
+
+ for (ppsz=rgpszResp; *ppsz; ppsz++)
+ {
+ MATCHREC mr;
+ mr.dwLen = lstrlen(*ppsz);
+ mr.pb = *ppsz;
+ mr.pv=(PVOID) "";
+ dwRet = mtFindMatch(hmt, &mr);
+ pszResp = (CHAR *) mr.pv;
+ printf("mtFindMatch([%s]) returns [%s] (0x%lx)\n", *ppsz, pszResp, (unsigned long) dwRet);
+ if (_stricmp(*ppsz, pszResp)) printf("+++ERROR: String not found!\n");
+ if (!(dwRet&fMATCH_COMPLETE)) printf("+++ERROR: Match not complete\n");
+ if (dwRet&fMATCH_PARTIAL) printf("+++WARNING: Match partial\n");
+ }
+
+ mtFreeTree(hmt);
+
+ return 0;
+}
+
+
diff --git a/private/unimodem/new/match/mt.c b/private/unimodem/new/match/mt.c
new file mode 100644
index 000000000..c5950272a
--- /dev/null
+++ b/private/unimodem/new/match/mt.c
@@ -0,0 +1,424 @@
+#include "unimdm.h"
+#include "mcxp.h"
+
+#if 0
+#include <windows.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "mt.h"
+
+// #define SILENT
+
+#ifdef SILENT
+# define PRINTF0(_a) (0)
+# define PRINTF1(_a,_b) (0)
+# define PRINTF2(_a,_b,_c) (0)
+# define PRINTF3(_a,_b,_c,_d) (0)
+#else
+#ifdef CONSOLE
+# define PRINTF0(_a) printf(_a)
+# define PRINTF1(_a,_b) printf((_a),(_b))
+# define PRINTF2(_a,_b,_c) printf((_a),(_b),(_c))
+# define PRINTF3(_a,_b,_c,_d) printf((_a),(_b),(_c),(_d))
+#else
+# define PRINTF0(_a) DPRINTF(_a)
+# define PRINTF1(_a,_b) DPRINTF1((_a),(_b))
+# define PRINTF2(_a,_b,_c) DPRINTF2((_a),(_b),(_c))
+# define PRINTF3(_a,_b,_c,_d) DPRINTF3((_a),(_b),(_c),(_d))
+#endif //!CONSOLE
+#endif // !SILENT
+
+// ======================== PRIVATES ===================================
+
+#define ASSERT(_c) \
+ ((_c) ? 0: printf("Assertion failed in %s:%d\n", __FILE__, __LINE__))
+
+typedef struct _MNODE
+{
+ MATCHREC mr;
+ struct _MNODE *pmnNext;
+ struct _MNODE *pmnCh;
+
+} MNODE, *PMNODE;
+
+PMNODE mn_create_raw_tree(PMATCHREC pmr, DWORD dwcmr);
+BOOL mn_cook_tree (PMNODE pmn, DWORD dwMin);
+void mn_free_tree (PMNODE pmn);
+PMNODE mn_alloc (PMATCHREC pmr, PMNODE pmnNext);
+void mn_free (PMNODE pmn);
+void mn_dump_tree (PMNODE pmn, UINT uDepth, UINT uWidth);
+DWORD mn_find_smallest(PMNODE pmn);
+DWORD mn_find_match(PMNODE pmn, PMATCHREC pmr);
+// ======================== PRIVATES (end) ===================================
+
+HMATCHTREE mtCreateTree(PMATCHREC pmr, DWORD dwcmr)
+{
+ PMNODE pmn = mn_create_raw_tree(pmr, dwcmr);
+
+ if (!mn_cook_tree(pmn, MAXDWORD))
+ {
+ mn_free_tree(pmn);
+ pmn=NULL;
+ }
+
+ return (DWORD) pmn;
+}
+
+void mtFreeTree(HMATCHTREE hmt)
+{
+ PMNODE pmn = (PMNODE) hmt;
+
+ mn_free_tree(pmn); // NULL is a valid tree
+}
+
+
+// Returns one or more fMATCH_ flags.
+// Searches through all its siblings as well...
+// Recursive function, so keep locals to a minimum.
+DWORD mtFindMatch(HMATCHTREE hmt, PMATCHREC pmr)
+{
+ MATCHREC mr;
+ DWORD dwRet = 0;
+
+ if (!pmr) goto end;
+
+ mr = *pmr; // Structure copy.
+ dwRet = mn_find_match((PMNODE)hmt, &mr);
+ // mn_find_match trashes dwLen and cb fields of pmr, only pv field is valid
+ pmr->pv = mr.pv;
+
+end:
+ return dwRet;
+}
+
+
+#ifdef DEBUG
+void mtDumpTree(HMATCHTREE hmt)
+{
+ PMNODE pmn = (PMNODE) hmt;
+
+ mn_dump_tree(pmn, 0, 0);
+}
+#endif // DEBUG
+
+
+PMNODE mn_create_raw_tree(PMATCHREC pmr, DWORD dwcmr)
+{
+ PMNODE pmnFirst=NULL;
+
+ for (;dwcmr--;pmr++)
+ {
+ PMNODE pmnTmp = mn_alloc(pmr, pmnFirst);
+ if (!pmnTmp) goto failure;
+ pmnFirst=pmnTmp;
+ }
+ goto end;
+
+failure:
+ mn_free_tree(pmnFirst); // NULL is a valid tree to free
+ pmnFirst=NULL;
+ // FALL THROUGH
+
+end:
+ return pmnFirst;
+}
+
+
+PMNODE mn_alloc(PMATCHREC pmr, PMNODE pmnNext)
+{
+ PMNODE pmn = (pmr && pmr->pb && pmr->dwLen)
+ ? LocalAlloc(LPTR, sizeof(MNODE)) : NULL;
+
+ if (pmn)
+ {
+ pmn->mr = *pmr; // structure copy.
+ pmn->pmnNext=pmnNext;
+ pmn->pmnCh=NULL;
+ }
+
+ return pmn;
+}
+
+void mn_free(PMNODE pmn)
+{
+ if (pmn)
+ {
+ ASSERT(!pmn->pmnCh && !pmn->pmnNext);
+ LocalFree(pmn);
+ }
+}
+
+
+void mn_free_tree(PMNODE pmn)
+{
+ if (pmn)
+ {
+ mn_free_tree(pmn->pmnCh); // recurse down
+ mn_free_tree(pmn->pmnNext); // recurse left
+ pmn->pmnNext=pmn->pmnCh=NULL;
+ mn_free(pmn);
+ }
+}
+
+BOOL mn_cook_tree(PMNODE pmn, DWORD dwMin)
+{
+ // Find smallest string of me and siblings
+ if (dwMin==MAXDWORD) dwMin = mn_find_smallest(pmn);
+
+ if (!pmn) goto success;
+
+ // These are all serious problems -- so we assert on failure:
+ if (!dwMin || pmn->pmnCh || !pmn->mr.pb || (pmn->mr.dwLen<dwMin))
+ goto failure;
+
+ // Start my children's list by creating one if pmn->pb is longer
+ // than the minimum, in which case we also NULL pv, because pv should
+ // be NULL for internal (non-leaf) nodes.
+ if (pmn->mr.dwLen>dwMin)
+ {
+ MATCHREC mr;
+ mr.pb=pmn->mr.pb+dwMin;
+ mr.dwLen=pmn->mr.dwLen-dwMin;
+ mr.pv=pmn->mr.pv;
+ pmn->pmnCh = mn_alloc(&mr, NULL);
+ if (!pmn->pmnCh) goto failure;
+ pmn->mr.pv=NULL;
+ pmn->mr.dwLen=dwMin;
+ }
+
+ // Add to my children's list by converting those siblings which
+ // share my dwMin-sized prefix into my children. (Obviously) remove
+ // these siblings from the sibling list.
+ {
+ PMNODE pmnTmp = pmn;
+ while(pmnTmp->pmnNext)
+ {
+ PMNODE pmnTmp1 = pmnTmp->pmnNext;
+
+ if (pmnTmp1->mr.dwLen<dwMin || !pmnTmp1->mr.pb) goto failure;
+
+ if (!_strnicmp(pmn->mr.pb, pmnTmp1->mr.pb, dwMin))
+ {
+ // Found a prefix match -- remove from sibling list
+ // and add to child list if non-null
+ pmnTmp->pmnNext = pmnTmp1->pmnNext;
+ pmnTmp1->mr.dwLen-=dwMin;
+ pmnTmp1->mr.pb+=dwMin;
+ pmnTmp1->pmnNext=NULL;
+ // If nothing left to add -- we're at the end of pb --
+ // (leaf node) so we make pmn->pv non-NULL, and free pmnTmp1
+ // Otherwise we add it to pmn's child's list.
+ if (!pmnTmp1->mr.dwLen)
+ {
+ if (pmn->mr.pv) {PRINTF0("Warning: overriding pv!\n");}
+ pmn->mr.pv = pmnTmp1->mr.pv;
+ ASSERT(!pmnTmp1->pmnCh && !pmnTmp1->pmnNext);
+ mn_free(pmnTmp1);
+ }
+ else
+ {
+ pmnTmp1->pmnNext = pmn->pmnCh;
+ pmn->pmnCh=pmnTmp1;
+ }
+ }
+ else
+ {
+ pmnTmp = pmnTmp->pmnNext;
+ }
+ if (!pmnTmp) break;
+ }
+ }
+
+ // recurse down
+ if (!mn_cook_tree(pmn->pmnCh, MAXDWORD)) goto failure;
+
+ // recurse left
+ if (!mn_cook_tree(pmn->pmnNext, dwMin)) goto failure;
+
+ // FALL THROUGH
+
+success:
+ return TRUE;
+
+failure:
+ ASSERT(FALSE);
+ return FALSE;
+}
+
+DWORD mn_find_smallest(PMNODE pmn)
+{
+ DWORD dw = MAXDWORD;
+
+ if (pmn)
+ {
+ dw = mn_find_smallest(pmn->pmnNext);
+ if (dw>pmn->mr.dwLen) dw=pmn->mr.dwLen;
+ }
+ return dw;
+}
+
+void mn_dump_tree(PMNODE pmn, UINT uDepth, UINT uWidth)
+{
+ static char rgchFill[]="----------------------------------------";
+ LONG lOff = sizeof(rgchFill) - (uDepth+1);
+ if (lOff<0) lOff=0;
+ // if(!pmn) return;
+ PRINTF2("%02lu%s", (unsigned long) uDepth, rgchFill+lOff);
+ if (!pmn)
+ {
+ PRINTF1("NULL(w=%lu)\n", (unsigned long) uWidth);
+ }
+ else
+ {
+ CHAR *pb = (pmn->mr.pb)?pmn->mr.pb:"\"\"";
+ CHAR c = pb[pmn->mr.dwLen];
+ CHAR *pc2 = (CHAR *) pmn->mr.pv;
+ if (!pc2) pc2="";
+ pb[pmn->mr.dwLen]=0;
+ PRINTF3("[%s]:%02lu %s\n", pc2,
+ (unsigned long) pmn->mr.dwLen, pb);
+ pb[pmn->mr.dwLen]=c;
+ mn_dump_tree(pmn->pmnCh, uDepth+1,0); // recurse down
+ mn_dump_tree(pmn->pmnNext, uDepth, uWidth+1); // recurse left
+ }
+}
+
+
+// Returns one or more fMATCH_ flags.
+// Searches through all its siblings as well...
+// Recursive function, so keep locals to a minimum.
+// WARNING: Trashes dwLen and cb fields of pmr.
+DWORD mn_find_match(PMNODE pmn, PMATCHREC pmr)
+{
+ DWORD dwRet=0;
+ DWORD dwcbMin;
+ CHAR *pc;
+
+#ifdef DEBUG
+ DWORD dwcb;
+ CHAR rgchTmp[256];
+ DWORD dwcbTmp;
+#endif // DEBUG
+
+ if (!pmn || !pmr) goto end;
+
+#ifdef DEBUG
+# define DWCB dwcb
+# define DBGPSZ rgchTmp
+ DWCB = pmr->dwLen;
+ dwcbTmp = sizeof(DBGPSZ)-1;
+ if (dwcbTmp>DWCB) dwcbTmp=DWCB;
+ // We do this because pb is not null terminated.
+ CopyMemory(DBGPSZ, pmr->pb, dwcbTmp);
+ DBGPSZ[dwcbTmp]=0;
+#else // !DEBUG
+# define DBGPSZ ""
+# define DWCB 0
+#endif // !DEBUG
+
+ PRINTF1("Entering mn_find_match(-, [%s], -)\n", DBGPSZ);
+
+
+
+ // Iterate through siblings, looking for matches and partial matches.
+ // We stop when we find the first match or partial match, because all
+ // the substrings at the same level are unique and have the same length:
+ // so if we found a match we can't find a partial match among the siblings,
+ // and vice versa. Furthermore, if we find a partial match, we don't really
+ // care which (could be more than one) sibling it is a partial match for.
+ // If in the future we we *do* return the node for efficiency purposes
+ // (so that the next call can start where we left off),
+ // we would return the node for the *first* partial match we found.
+ pc = pmr->pb;
+ dwcbMin = pmn->mr.dwLen;
+ if (pmr->dwLen<dwcbMin)
+ {
+ dwcbMin=pmr->dwLen;
+ dwRet = fMATCH_PARTIAL;
+ }
+ else if (pmr->dwLen==dwcbMin)
+ {
+ dwRet = fMATCH_COMPLETE;
+ }
+ else
+ {
+ // pmr->dwLen>pmn->mr.dwU, dwRet==0, so do nothing
+ }
+
+ // WARNING: we trash pmr here, except for pmr->pv
+ pmr->dwLen-=dwcbMin;
+ pmr->pb+=dwcbMin;
+
+ while(pmn)
+ {
+ // Fundamental assumption is that all dwLens of siblings are equal.
+ ASSERT((pmn->pmnNext)? pmn->mr.dwLen==pmn->pmnNext->mr.dwLen:TRUE);
+
+ if (!_strnicmp(pc, pmn->mr.pb, dwcbMin))
+ {
+ PRINTF3("Match: dwcb=%lu; pmn->mr.dwLen=%lu; pc=[%s]\n",
+ (unsigned long) DWCB,
+ (unsigned long) pmn->mr.dwLen,
+ DBGPSZ);
+
+ // Note: dwRet is computed just once, out of the while loop.
+ // we were really overloading dwRet then. Now we compute the
+ // true return value.
+ switch(dwRet)
+ {
+ case 0: // i.e., (DWCB > pmn->mr.dwLen)
+ ASSERT(DWCB>pmn->mr.dwLen);
+ // Recurse down. WARNING: pmr is trashed, except for pmr->pv
+ dwRet = mn_find_match(pmn->pmnCh, pmr);
+ break;
+
+ case fMATCH_PARTIAL: // i.e., (DWCB < pmn->mr.dwLen)
+ ASSERT(DWCB<pmn->mr.dwLen);
+ break;
+
+ case fMATCH_COMPLETE: // i.e., (DWCB == pmn->mr.dwLen)
+ ASSERT(DWCB==pmn->mr.dwLen);
+ // Now let's see if we're truly a perfect macth: non-null
+ // pv indicates an actual response terminates in this node.
+ dwRet=0;
+ if (pmn->mr.pv)
+ {
+ pmr->pv = pmn->mr.pv;
+ dwRet = fMATCH_COMPLETE;
+ }
+ // Non-null pmnCh implies there are postfixes, i.e., longer
+ // responses
+ if (pmn->pmnCh)
+ {
+ dwRet |= fMATCH_PARTIAL;
+ }
+ break;
+
+ default:
+ ASSERT(FALSE);
+ dwRet=0;
+ goto end;
+ }
+ if (dwRet) break; // break out of while loop if we got something
+ }
+ pmn=pmn->pmnNext;
+
+ }
+
+ if (!pmn)
+ {
+ dwRet=0;
+ }
+ else
+ {
+ ASSERT(dwRet && !_strnicmp(pc, pmn->mr.pb, dwcbMin));
+ }
+
+ PRINTF2("Exiting mn_find_match(-, [%s], -) returing 0x%lx\n", DBGPSZ,
+ (unsigned long) dwRet);
+
+end:
+ return dwRet;
+}
diff --git a/private/unimodem/new/match/mt.h b/private/unimodem/new/match/mt.h
new file mode 100644
index 000000000..56028c84a
--- /dev/null
+++ b/private/unimodem/new/match/mt.h
@@ -0,0 +1,28 @@
+#ifndef _MT_
+#define _MT_
+
+#define fMATCH_PARTIAL (0x1<<0)
+#define fMATCH_COMPLETE (0x1<<1)
+
+
+typedef struct
+{
+ DWORD dwLen;
+ CHAR *pb;
+ LPVOID pv;
+
+} MATCHREC, *PMATCHREC;
+
+typedef DWORD HMATCHTREE;
+
+HMATCHTREE mtCreateTree(PMATCHREC rgmr, DWORD dwcmr);
+void mtFreeTree (HMATCHTREE hmt);
+DWORD mtFindMatch (HMATCHTREE hmt, PMATCHREC pmr);
+
+#ifdef DEBUG
+void mtDumpTree (HMATCHTREE hmt);
+#else // !DEBUG
+#define mtDumpTree(_mht) ((void) 0)
+#endif // !DEBUG
+
+#endif // _MT_
diff --git a/private/unimodem/new/match/resp.c b/private/unimodem/new/match/resp.c
new file mode 100644
index 000000000..de60e4c99
--- /dev/null
+++ b/private/unimodem/new/match/resp.c
@@ -0,0 +1,3535 @@
+#include <windows.h>
+
+CHAR *rgpszSimpleResp[] =
+{
+ "How",
+ "Now",
+ "Brown",
+ "Cow!",
+ NULL
+};
+
+CHAR *rgpszComplexResp[] =
+{
+"-SFA",
+"-SMD",
+"-SRA",
+"-SRC:",
+"-SRQ",
+"-SSV",
+"-STO",
+"-SVM",
+"+F4",
+"+F4/+FCERROR",
+"+F4@",
+"+FC-FCERROR",
+"+FC@",
+"+FCERROR",
+"+FCON",
+"@",
+"@#-SFA@#",
+"@#-SMD@#",
+"@#-SRA@#",
+"@#-SRC:@#",
+"@#-SRQ@#",
+"@#-SSV@#",
+"@#-STO@#",
+"@#-SVM@#",
+"@# CONNECT 1200 LAPM COMPRESSED@#",
+"@#+FCERROR@@#",
+"@#+FCERROR@#",
+"@#@#NO CARRIER@#",
+"@#ABORD@#",
+"@#ABORTED@#",
+"@#AUTOLOGON FAILED@#",
+"@#BLACKLISTED@#",
+"@#BUSY@#",
+"@#C@#",
+"@#CALL LOCKED:BLACKLISTED@#",
+"@#CARRIER 1200@#",
+"@#CARRIER 2400@#",
+"@#CARRIER 300@#",
+"@#CARRIER 600@#",
+"@#CARRIER 1200 V.34@#",
+"@#CARRIER 1200/75",
+"@#CARRIER 1200/75 V.23@#",
+"@#CARRIER 1200/75/VFC@#",
+"@#CARRIER 1200/75@#",
+"@#CARRIER 1200/VFC@#",
+"@#CARRIER 1200@#",
+"@#CARRIER 12000/VFC@#",
+"@#CARRIER 12000@#",
+"@#CARRIER 1200TX/75RX V.23@#",
+"@#CARRIER 14400 V.34@#",
+"@#CARRIER 14400/VFC@ @#",
+"@#CARRIER 14400/VFC@#",
+"@#CARRIER 14400@#",
+"@#CARRIER 16800 V.34@#",
+"@#CARRIER 16800/VFC@@#",
+"@#CARRIER 16800/VFC@#",
+"@#CARRIER 16800@#",
+"@#CARRIER 19200 V.34@#",
+"@#CARRIER 19200/VFC@@#",
+"@#CARRIER 19200/VFC@#",
+"@#CARRIER 19200@#",
+"@#CARRIER 21600 V.34@#",
+"@#CARRIER 21600/VFC@@#",
+"@#CARRIER 21600/VFC@#",
+"@#CARRIER 21600@#",
+"@#CARRIER 2400 V.34@#",
+"@#CARRIER 2400/VFC@#",
+"@#CARRIER 2400@#",
+"@#CARRIER 24000 V.34@#",
+"@#CARRIER 24000/VFC@@#",
+"@#CARRIER 24000/VFC@#",
+"@#CARRIER 24000@#",
+"@#CARRIER 26400 V.34@#",
+"@#CARRIER 26400/VFC@@#",
+"@#CARRIER 26400/VFC@#",
+"@#CARRIER 26400@#",
+"@#CARRIER 28800 V.34@#",
+"@#CARRIER 28800/VFC@@#",
+"@#CARRIER 28800/VFC@#",
+"@#CARRIER 28800@#",
+"@#CARRIER 300 V.34@#",
+"@#CARRIER 300/VFC@#",
+"@#CARRIER 300@#",
+"@#CARRIER 4800 V.34@#",
+"@#CARRIER 4800/VFC@#",
+"@#CARRIER 4800@#",
+"@#CARRIER 600@#",
+"@#CARRIER 64000@#",
+"@#CARRIER 7200 V.34@#",
+"@#CARRIER 7200/VFC@#",
+"@#CARRIER 7200@#",
+"@#CARRIER 75/1200",
+"@#CARRIER 75/1200 V.23@#",
+"@#CARRIER 75/1200/VFC@#",
+"@#CARRIER 75/1200@#",
+"@#CARRIER 75TX/1200RX V.23@#",
+"@#CARRIER 9600 V.34@#",
+"@#CARRIER 9600/VFC@#",
+"@#CARRIER 9600@#",
+"@#CED@# ",
+"@#COMPRESSION :CLASS5@#",
+"@#COMPRESSION NONE@#",
+"@#COMPRESSION V.42BIS@#",
+"@#COMPRESSION: ADC",
+"@#COMPRESSION: ADC@#",
+"@#COMPRESSION: CLASS 5@#",
+"@#COMPRESSION: CLASS5@#",
+"@#COMPRESSION: MNP5@#",
+"@#COMPRESSION: NONE@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V42BIS@#",
+"@#COMPRESSION:CLASS 5@#",
+"@#COMPRESSION:NONE@#",
+"@#COMPRESSION:V.42bis@#",
+"@#COMPRESSION:V.42BIS@#",
+"@#CONNECT 0600/ARQ@#",
+"@#CONNECT 0600/LAP-M/COMPRESSION@#",
+"@#CONNECT 0600/LAP-M@#",
+"@#CONNECT 0600/LAPM/COMP@#",
+"@#CONNECT 0600/LAPM@#",
+"@#CONNECT 0600/MNP@#",
+"@#CONNECT 0600/NONE@#",
+"@#CONNECT 0600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 0600/REL/COMP@#",
+"@#CONNECT 0600/REL@#",
+"@#CONNECT 0600/V42BIS@#",
+"@#CONNECT 0600@#",
+"@#CONNECT 112000/ARQ/MLP /V120/V42b@#",
+"@#CONNECT 112000/ARQ/MLP /V120@#",
+"@#CONNECT 112000@#",
+"@#CONNECT 115,200/ARQ@#",
+"@#CONNECT 115,200/LAP-M/COMPRESSION@#",
+"@#CONNECT 115,200/LAP-M@#",
+"@#CONNECT 115,200/LAPM/COMP@#",
+"@#CONNECT 115,200/LAPM@#",
+"@#CONNECT 115,200/MNP@#",
+"@#CONNECT 115,200/NONE@#",
+"@#CONNECT 115,200/REL/COMP@#",
+"@#CONNECT 115,200/REL@#",
+"@#CONNECT 115,200/V42@#",
+"@#CONNECT 115,200/V42BIS@#",
+"@#CONNECT 115,200@#",
+"@#CONNECT 115200 ALT / MNP5@#",
+"@#CONNECT 115200 ALT /MNP 5@#",
+"@#CONNECT 115200 ALT@#",
+"@#CONNECT 115200 LAPM / V.42bis@#",
+"@#CONNECT 115200 LAPM /V.42bis@#",
+"@#CONNECT 115200 LAPM@#",
+"@#CONNECT 115200 REL/MNP5@#",
+"@#CONNECT 115200 REL@#",
+"@#CONNECT 115200/ARQ@#",
+"@#CONNECT 115200/LAP-M/COMPRESSION@#",
+"@#CONNECT 115200/LAP-M@#",
+"@#CONNECT 115200/LAPM/COMP@#",
+"@#CONNECT 115200/LAPM@#",
+"@#CONNECT 115200/MNP COMPRESSED@#",
+"@#CONNECT 115200/MNP@#",
+"@#CONNECT 115200/NONE@#",
+"@#CONNECT 115200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 115200/REL-LAPM@#",
+"@#CONNECT 115200/REL-V.42@#",
+"@#CONNECT 115200/REL/COMP@#",
+"@#CONNECT 115200/REL@#",
+"@#CONNECT 115200/V42@#",
+"@#CONNECT 115200/V42BIS@#",
+"@#CONNECT 115200/VBIS@#",
+"@#CONNECT 115200@#",
+"@#CONNECT 115200T/V42BIS@#",
+"@#CONNECT 1200 ALT / MNP5@#",
+"@#CONNECT 1200 ALT /MNP 5@#",
+"@#CONNECT 1200 ALT@#",
+"@#CONNECT 1200 EC/V42BIS@#",
+"@#CONNECT 1200 EC@#",
+"@#CONNECT 1200 LAPM / V.42bis@#",
+"@#CONNECT 1200 LAPM /V.42bis@#",
+"@#CONNECT 1200 LAPM COMPRESSED@#",
+"@#CONNECT 1200 LAPM@#",
+"@#CONNECT 1200 NORMAL@#",
+"@#CONNECT 1200 REL/MNP5@#",
+"@#CONNECT 1200 REL/V42@#",
+"@#CONNECT 1200 REL/V42BIS@#",
+"@#CONNECT 1200 REL@#",
+"@#CONNECT 1200 RELIABLE COMPRESSED@#",
+"@#CONNECT 1200 RELIABLE@#",
+"@#CONNECT 1200 V.42@#",
+"@#CONNECT 1200/75",
+"@#CONNECT 1200/75/ARQ@#",
+"@#CONNECT 1200/75/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200/75/LAP-M@#",
+"@#CONNECT 1200/75/LAPM/COMP@#",
+"@#CONNECT 1200/75/LAPM@#",
+"@#CONNECT 1200/75/MNP@#",
+"@#CONNECT 1200/75/NONE@#",
+"@#CONNECT 1200/75/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200/75/REL/COMP@#",
+"@#CONNECT 1200/75/REL@#",
+"@#CONNECT 1200/75/V42@#",
+"@#CONNECT 1200/75/V42BIS@#",
+"@#CONNECT 1200/75@#",
+"@#CONNECT 1200/ARQ/MNP4@#",
+"@#CONNECT 1200/ARQ/MNP5@#",
+"@#CONNECT 1200/ARQ/V.42@#",
+"@#CONNECT 1200/ARQ/V.42bis@#",
+"@#CONNECT 1200/ARQ/V22 /MNP4@#",
+"@#CONNECT 1200/ARQ/V22 /MNP5@#",
+"@#CONNECT 1200/ARQ/V22 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22 /V42 @#",
+"@#CONNECT 1200/ARQ/V22 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22 /V42b@#",
+"@#CONNECT 1200/ARQ/V22/MNP4@#",
+"@#CONNECT 1200/ARQ/V22/MNP5@#",
+"@#CONNECT 1200/ARQ/V22/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22/V42 @#",
+"@#CONNECT 1200/ARQ/V22/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22/V42b@#",
+"@#CONNECT 1200/ARQ/V22b /MNP4@#",
+"@#CONNECT 1200/ARQ/V22b /MNP5@#",
+"@#CONNECT 1200/ARQ/V22b /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22b /V42 @#",
+"@#CONNECT 1200/ARQ/V22b /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22b /V42b@#",
+"@#CONNECT 1200/ARQ/V22b/MNP4@#",
+"@#CONNECT 1200/ARQ/V22b/MNP5@#",
+"@#CONNECT 1200/ARQ/V22b/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22b/V42 @#",
+"@#CONNECT 1200/ARQ/V22b/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22b/V42b@#",
+"@#CONNECT 1200/ARQ/V32 /MNP4@#",
+"@#CONNECT 1200/ARQ/V32 /MNP5@#",
+"@#CONNECT 1200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42 @#",
+"@#CONNECT 1200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42b@#",
+"@#CONNECT 1200/ARQ/V32 /MNP4@#",
+"@#CONNECT 1200/ARQ/V32 /MNP5@#",
+"@#CONNECT 1200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42 @#",
+"@#CONNECT 1200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42b@#",
+"@#CONNECT 1200/ARQ/V32b /MNP4@#",
+"@#CONNECT 1200/ARQ/V32b /MNP5@#",
+"@#CONNECT 1200/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32b /V42 @#",
+"@#CONNECT 1200/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32b /V42b@#",
+"@#CONNECT 1200/ARQ/V32b/MNP4@#",
+"@#CONNECT 1200/ARQ/V32b/MNP5@#",
+"@#CONNECT 1200/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32b/V42 @#",
+"@#CONNECT 1200/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32b/V42b@#",
+"@#CONNECT 1200/ARQ/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V42 @#",
+"@#CONNECT 1200/ARQ/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V42b@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 @#",
+"@#CONNECT 1200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42b@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 @#",
+"@#CONNECT 1200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42b@#",
+"@#CONNECT 1200/ARQ@#",
+"@#CONNECT 1200/COMP@#",
+"@#CONNECT 1200/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200/LAP-M@#",
+"@#CONNECT 1200/LAPM/COMP@#",
+"@#CONNECT 1200/LAPM/V42BIS@#",
+"@#CONNECT 1200/LAPM@#",
+"@#CONNECT 1200/MNP COMPRESSED@#",
+"@#CONNECT 1200/MNP@#",
+"@#CONNECT 1200/NONE@#",
+"@#CONNECT 1200/NOR@#",
+"@#CONNECT 1200/REL-LAPM-COMP@#",
+"@#CONNECT 1200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200/REL-LAPM@#",
+"@#CONNECT 1200/REL-MNP-COMP@#",
+"@#CONNECT 1200/REL-MNP@#",
+"@#CONNECT 1200/REL-V.42@#",
+"@#CONNECT 1200/REL 1@# ",
+"@#CONNECT 1200/REL 2@# ",
+"@#CONNECT 1200/REL 3@# ",
+"@#CONNECT 1200/REL 4@# ",
+"@#CONNECT 1200/REL 5@# ",
+"@#CONNECT 1200/REL COMP@#",
+"@#CONNECT 1200/REL COMPRESSED@#",
+"@#CONNECT 1200/REL/COMP@#",
+"@#CONNECT 1200/REL@#",
+"@#CONNECT 1200/RELC@#",
+"@#CONNECT 1200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 1200/RELIABLE/LAPM@#",
+"@#CONNECT 1200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 1200/RELIABLE/MNP@#",
+"@#CONNECT 1200/V42@#",
+"@#CONNECT 1200/V42B@#",
+"@#CONNECT 1200/V42BIS@#",
+"@#CONNECT 1200@#",
+"@#CONNECT 12000 ALT / MNP5@#",
+"@#CONNECT 12000 ALT /MNP 5@#",
+"@#CONNECT 12000 ALT@#",
+"@#CONNECT 12000 EC/V42@#",
+"@#CONNECT 12000 EC/V42BIS@#",
+"@#CONNECT 12000 EC@#",
+"@#CONNECT 12000 LAPM / V.42bis@#",
+"@#CONNECT 12000 LAPM /V.42bis@#",
+"@#CONNECT 12000 LAPM COMPRESSED@#",
+"@#CONNECT 12000 LAPM@#",
+"@#CONNECT 12000 REL/MNP5@#",
+"@#CONNECT 12000 REL/V42@#",
+"@#CONNECT 12000 REL/V42BIS@#",
+"@#CONNECT 12000 REL@#",
+"@#CONNECT 12000 RELIABLE COMPRESSED@#",
+"@#CONNECT 12000 RELIABLE@#",
+"@#CONNECT 12000/ARQ/CELL /MNP4@#",
+"@#CONNECT 12000/ARQ/CELL /MNP5@#",
+"@#CONNECT 12000/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/CELL /V42 @#",
+"@#CONNECT 12000/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/CELL /V42b@#",
+"@#CONNECT 12000/ARQ/CELL/MNP4@#",
+"@#CONNECT 12000/ARQ/CELL/MNP5@#",
+"@#CONNECT 12000/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/CELL/V42 @#",
+"@#CONNECT 12000/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/CELL/V42b@#",
+"@#CONNECT 12000/ARQ/MNP4@#",
+"@#CONNECT 12000/ARQ/MNP5@#",
+"@#CONNECT 12000/ARQ/V.34/MNP4@#",
+"@#CONNECT 12000/ARQ/V.34/MNP5@#",
+"@#CONNECT 12000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V.34/V42 @#",
+"@#CONNECT 12000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V.34/V42b@#",
+"@#CONNECT 12000/ARQ/V.42@#",
+"@#CONNECT 12000/ARQ/V.42bis@#",
+"@#CONNECT 12000/ARQ/V32b /MNP4@#",
+"@#CONNECT 12000/ARQ/V32b /MNP5@#",
+"@#CONNECT 12000/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V32b /V42 @#",
+"@#CONNECT 12000/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V32b /V42b@#",
+"@#CONNECT 12000/ARQ/V32b/MNP4@#",
+"@#CONNECT 12000/ARQ/V32b/MNP5@#",
+"@#CONNECT 12000/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V32b/V42 @#",
+"@#CONNECT 12000/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V32b/V42b@#",
+"@#CONNECT 12000/ARQ/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V42 @#",
+"@#CONNECT 12000/ARQ/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V42b@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP4@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP5@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 @#",
+"@#CONNECT 12000/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42b@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP4@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP5@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 @#",
+"@#CONNECT 12000/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42b@#",
+"@#CONNECT 12000/ARQ@#",
+"@#CONNECT 12000/COMP@#",
+"@#CONNECT 12000/LAP-M/COMPRESSION@#",
+"@#CONNECT 12000/LAP-M@#",
+"@#CONNECT 12000/LAPM/COMP@#",
+"@#CONNECT 12000/LAPM/V42BIS@#",
+"@#CONNECT 12000/LAPM@#",
+"@#CONNECT 12000/MNP COMPRESSED@#",
+"@#CONNECT 12000/MNP@#",
+"@#CONNECT 12000/NONE@#",
+"@#CONNECT 12000/NOR@#",
+"@#CONNECT 12000/REL-LAPM-COMP@#",
+"@#CONNECT 12000/REL-LAPM V.42 BIS@#",
+"@#CONNECT 12000/REL-LAPM@#",
+"@#CONNECT 12000/REL-MNP-COMP@#",
+"@#CONNECT 12000/REL-MNP@#",
+"@#CONNECT 12000/REL-V.42@#",
+"@#CONNECT 12000/REL COMP@#",
+"@#CONNECT 12000/REL COMPRESSED@#",
+"@#CONNECT 12000/REL/COMP@#",
+"@#CONNECT 12000/REL@#",
+"@#CONNECT 12000/RELC@#",
+"@#CONNECT 12000/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 12000/RELIABLE/LAPM@#",
+"@#CONNECT 12000/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 12000/RELIABLE/MNP@#",
+"@#CONNECT 12000/V42@#",
+"@#CONNECT 12000/V42B@#",
+"@#CONNECT 12000/V42BIS@#",
+"@#CONNECT 12000@#",
+"@#CONNECT 12000T/V42BIS@#",
+"@#CONNECT 1200T/V42BIS@#",
+"@#CONNECT 1200TX/75RX REL/MNP5@#",
+"@#CONNECT 1200TX/75RX REL@#",
+"@#CONNECT 1200TX/75RX/ARQ@#",
+"@#CONNECT 1200TX/75RX/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200TX/75RX/LAP-M@#",
+"@#CONNECT 1200TX/75RX/LAPM/COMP@#",
+"@#CONNECT 1200TX/75RX/LAPM@#",
+"@#CONNECT 1200TX/75RX/MNP@#",
+"@#CONNECT 1200TX/75RX/NONE@#",
+"@#CONNECT 1200TX/75RX/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200TX/75RX/REL/COMP@#",
+"@#CONNECT 1200TX/75RX/REL@#",
+"@#CONNECT 1200TX/75RX/V42@#",
+"@#CONNECT 1200TX/75RX/V42BIS@#",
+"@#CONNECT 1200TX/75RX@#",
+"@#CONNECT 12200/ARQ/V.34/MNP4@#",
+"@#CONNECT 12200/ARQ/V.34/MNP5@#",
+"@#CONNECT 12200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 12200/ARQ/V.34/V42 @#",
+"@#CONNECT 12200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 12200/ARQ/V.34/V42b@#",
+"@#CONNECT 12200@#",
+"@#CONNECT 1275@#",
+"@#CONNECT 128000/ARQ/MLP /X.75/V42b@#",
+"@#CONNECT 128000/ARQ/MLP /X.75@#",
+"@#CONNECT 128000@#",
+"@#CONNECT 14400 ALT / MNP5@#",
+"@#CONNECT 14400 ALT /MNP 5@#",
+"@#CONNECT 14400 ALT@#",
+"@#CONNECT 14400 EC/V42@#",
+"@#CONNECT 14400 EC/V42BIS@#",
+"@#CONNECT 14400 EC@#",
+"@#CONNECT 14400 LAPM / V.42bis@#",
+"@#CONNECT 14400 LAPM /V.42bis@#",
+"@#CONNECT 14400 LAPM COMPRESSED@#",
+"@#CONNECT 14400 LAPM@#",
+"@#CONNECT 14400 NORMAL@#",
+"@#CONNECT 14400 REL/MNP5@#",
+"@#CONNECT 14400 REL/V42@#",
+"@#CONNECT 14400 REL/V42BIS@#",
+"@#CONNECT 14400 REL@#",
+"@#CONNECT 14400 RELIABLE COMPRESSED@#",
+"@#CONNECT 14400 RELIABLE@#",
+"@#CONNECT 14400 V.42@#",
+"@#CONNECT 14400/ARQ/CELL /MNP4@#",
+"@#CONNECT 14400/ARQ/CELL /MNP5@#",
+"@#CONNECT 14400/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/CELL /V42 @#",
+"@#CONNECT 14400/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/CELL /V42b@#",
+"@#CONNECT 14400/ARQ/CELL/MNP4@#",
+"@#CONNECT 14400/ARQ/CELL/MNP5@#",
+"@#CONNECT 14400/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/CELL/V42 @#",
+"@#CONNECT 14400/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/CELL/V42b@#",
+"@#CONNECT 14400/ARQ/MNP4@#",
+"@#CONNECT 14400/ARQ/MNP5@#",
+"@#CONNECT 14400/ARQ/V.34/MNP4@#",
+"@#CONNECT 14400/ARQ/V.34/MNP5@#",
+"@#CONNECT 14400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V.34/V42 @#",
+"@#CONNECT 14400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V.34/V42b@#",
+"@#CONNECT 14400/ARQ/V.42@#",
+"@#CONNECT 14400/ARQ/V.42bis@#",
+"@#CONNECT 14400/ARQ/V32b /MNP4@#",
+"@#CONNECT 14400/ARQ/V32b /MNP5@#",
+"@#CONNECT 14400/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V32b /V42 @#",
+"@#CONNECT 14400/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V32b /V42b@#",
+"@#CONNECT 14400/ARQ/V32b/MNP4@#",
+"@#CONNECT 14400/ARQ/V32b/MNP5@#",
+"@#CONNECT 14400/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V32b/V42 @#",
+"@#CONNECT 14400/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V32b/V42b@#",
+"@#CONNECT 14400/ARQ/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V42 @#",
+"@#CONNECT 14400/ARQ/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V42b@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 @#",
+"@#CONNECT 14400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42b@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 @#",
+"@#CONNECT 14400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42b@#",
+"@#CONNECT 14400/ARQ@#",
+"@#CONNECT 14400/COMP@#",
+"@#CONNECT 14400/LAP-M/COMPRESSION@#",
+"@#CONNECT 14400/LAP-M@#",
+"@#CONNECT 14400/LAPM/COMP@#",
+"@#CONNECT 14400/LAPM/V42BIS@#",
+"@#CONNECT 14400/LAPM@#",
+"@#CONNECT 14400/MNP COMPRESSED@#",
+"@#CONNECT 14400/MNP@#",
+"@#CONNECT 14400/NONE@#",
+"@#CONNECT 14400/NOR@#",
+"@#CONNECT 14400/REL-LAPM-COMP@#",
+"@#CONNECT 14400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 14400/REL-LAPM@#",
+"@#CONNECT 14400/REL-MNP-COMP@#",
+"@#CONNECT 14400/REL-MNP@#",
+"@#CONNECT 14400/REL-V.42@#",
+"@#CONNECT 14400/REL COMP@#",
+"@#CONNECT 14400/REL COMPRESSED@#",
+"@#CONNECT 14400/REL/COMP@#",
+"@#CONNECT 14400/REL@#",
+"@#CONNECT 14400/RELC@#",
+"@#CONNECT 14400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 14400/RELIABLE/LAPM@#",
+"@#CONNECT 14400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 14400/RELIABLE/MNP@#",
+"@#CONNECT 14400/V42@#",
+"@#CONNECT 14400/V42B@#",
+"@#CONNECT 14400/V42BIS@#",
+"@#CONNECT 14400@#",
+"@#CONNECT 14400T RELIABLE@#",
+"@#CONNECT 14400T V.42@#",
+"@#CONNECT 14400T/V42BIS@#",
+"@#CONNECT 14600/ARQ/V.34/MNP4@#",
+"@#CONNECT 14600/ARQ/V.34/MNP5@#",
+"@#CONNECT 14600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 14600/ARQ/V.34/V42 @#",
+"@#CONNECT 14600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 14600/ARQ/V.34/V42b@#",
+"@#CONNECT 14600@#",
+"@#CONNECT 16000 EC/V42BIS@#",
+"@#CONNECT 16800 EC/V42@#",
+"@#CONNECT 16800 EC/V42BIS@#",
+"@#CONNECT 16800 EC@#",
+"@#CONNECT 16800 LAPM COMPRESSED@#",
+"@#CONNECT 16800 LAPM@#",
+"@#CONNECT 16800 REL/MNP5@#",
+"@#CONNECT 16800 REL/V42@#",
+"@#CONNECT 16800 REL/V42BIS@#",
+"@#CONNECT 16800 REL@#",
+"@#CONNECT 16800 RELIABLE COMPRESSED@#",
+"@#CONNECT 16800 RELIABLE@#",
+"@#CONNECT 16800/ARQ/MNP4@#",
+"@#CONNECT 16800/ARQ/MNP5@#",
+"@#CONNECT 16800/ARQ/V.34/MNP4@#",
+"@#CONNECT 16800/ARQ/V.34/MNP5@#",
+"@#CONNECT 16800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/V.34/V42 @#",
+"@#CONNECT 16800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/V.34/V42b@#",
+"@#CONNECT 16800/ARQ/V.42@#",
+"@#CONNECT 16800/ARQ/V.42bis@#",
+"@#CONNECT 16800/ARQ/V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/V42 @#",
+"@#CONNECT 16800/ARQ/V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/V42b@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 @#",
+"@#CONNECT 16800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42b@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 @#",
+"@#CONNECT 16800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42b@#",
+"@#CONNECT 16800/ARQ@#",
+"@#CONNECT 16800/COMP@#",
+"@#CONNECT 16800/LAP-M/COMPRESSION@#",
+"@#CONNECT 16800/LAP-M@#",
+"@#CONNECT 16800/LAPM/COMP@#",
+"@#CONNECT 16800/LAPM/V42BIS@#",
+"@#CONNECT 16800/LAPM@#",
+"@#CONNECT 16800/MNP COMPRESSED@#",
+"@#CONNECT 16800/MNP@#",
+"@#CONNECT 16800/NONE@#",
+"@#CONNECT 16800/NOR@#",
+"@#CONNECT 16800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 16800/REL-LAPM@#",
+"@#CONNECT 16800/REL-V.42@#",
+"@#CONNECT 16800/REL COMP@#",
+"@#CONNECT 16800/REL/COMP@#",
+"@#CONNECT 16800/REL@#",
+"@#CONNECT 16800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 16800/RELIABLE/LAPM@#",
+"@#CONNECT 16800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 16800/RELIABLE/MNP@#",
+"@#CONNECT 16800/V42@#",
+"@#CONNECT 16800/V42BIS@#",
+"@#CONNECT 16800@#",
+"@#CONNECT 16800T/V42BIS@#",
+"@#CONNECT 17000/ARQ/V.34/MNP4@#",
+"@#CONNECT 17000/ARQ/V.34/MNP5@#",
+"@#CONNECT 17000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 17000/ARQ/V.34/V42 @#",
+"@#CONNECT 17000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 17000/ARQ/V.34/V42b@#",
+"@#CONNECT 17000@#",
+"@#CONNECT 19200 ALT / MNP5@#",
+"@#CONNECT 19200 ALT /MNP 5@#",
+"@#CONNECT 19200 ALT@#",
+"@#CONNECT 19200 EC/BIS@#",
+"@#CONNECT 19200 EC/V42@#",
+"@#CONNECT 19200 EC/V42BIZ@#",
+"@#CONNECT 19200 EC@#",
+"@#CONNECT 19200 LAPM / V.42bis@#",
+"@#CONNECT 19200 LAPM /V.42bis@#",
+"@#CONNECT 19200 LAPM COMPRESSED@#",
+"@#CONNECT 19200 LAPM@#",
+"@#CONNECT 19200 REL/MNP5@#",
+"@#CONNECT 19200 REL/V42@#",
+"@#CONNECT 19200 REL/V42BIS@#",
+"@#CONNECT 19200 REL@#",
+"@#CONNECT 19200 RELIABLE COMPRESSED@#",
+"@#CONNECT 19200 RELIABLE@#",
+"@#CONNECT 19200/ARQ/MNP4@#",
+"@#CONNECT 19200/ARQ/MNP5@#",
+"@#CONNECT 19200/ARQ/V.34/MNP4@#",
+"@#CONNECT 19200/ARQ/V.34/MNP5@#",
+"@#CONNECT 19200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/V.34/V42 @#",
+"@#CONNECT 19200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/V.34/V42b@#",
+"@#CONNECT 19200/ARQ/V.42@#",
+"@#CONNECT 19200/ARQ/V.42bis@#",
+"@#CONNECT 19200/ARQ/V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/V42 @#",
+"@#CONNECT 19200/ARQ/V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/V42b@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 @#",
+"@#CONNECT 19200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42b@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 @#",
+"@#CONNECT 19200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42b@#",
+"@#CONNECT 19200/ARQ@#",
+"@#CONNECT 19200/COMP@#",
+"@#CONNECT 19200/LAP-M/COMPRESSION@#",
+"@#CONNECT 19200/LAP-M@#",
+"@#CONNECT 19200/LAPM/COMP@#",
+"@#CONNECT 19200/LAPM/V42BIS@#",
+"@#CONNECT 19200/LAPM@#",
+"@#CONNECT 19200/MNP COMPRESSED@#",
+"@#CONNECT 19200/MNP@#",
+"@#CONNECT 19200/NONE@#",
+"@#CONNECT 19200/NOR@#",
+"@#CONNECT 19200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 19200/REL-LAPM@#",
+"@#CONNECT 19200/REL-V.42@#",
+"@#CONNECT 19200/REL COMP@#",
+"@#CONNECT 19200/REL/COMP@#",
+"@#CONNECT 19200/REL@#",
+"@#CONNECT 19200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 19200/RELIABLE/LAPM@#",
+"@#CONNECT 19200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 19200/RELIABLE/MNP@#",
+"@#CONNECT 19200/V.110@#",
+"@#CONNECT 19200/V42@#",
+"@#CONNECT 19200/V42BIS@#",
+"@#CONNECT 19200@#",
+"@#CONNECT 19200T/V42BIS@#",
+"@#CONNECT 19400/ARQ/V.34/MNP4@#",
+"@#CONNECT 19400/ARQ/V.34/MNP5@#",
+"@#CONNECT 19400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 19400/ARQ/V.34/V42 @#",
+"@#CONNECT 19400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 19400/ARQ/V.34/V42b@#",
+"@#CONNECT 19400@#",
+"@#CONNECT 21600 LAPM COMPRESSED@#",
+"@#CONNECT 21600 LAPM@#",
+"@#CONNECT 21600 REL/MNP5@#",
+"@#CONNECT 21600 REL@#",
+"@#CONNECT 21600 RELIABLE COMPRESSED@#",
+"@#CONNECT 21600 RELIABLE@#",
+"@#CONNECT 21600/ARQ/V.34/MNP4@#",
+"@#CONNECT 21600/ARQ/V.34/MNP5@#",
+"@#CONNECT 21600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 21600/ARQ/V.34/V42 @#",
+"@#CONNECT 21600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 21600/ARQ/V.34/V42b@#",
+"@#CONNECT 21600/ARQ@#",
+"@#CONNECT 21600/COMP@#",
+"@#CONNECT 21600/LAP-M/COMPRESSION@#",
+"@#CONNECT 21600/LAP-M@#",
+"@#CONNECT 21600/LAPM/COMP@#",
+"@#CONNECT 21600/LAPM/V42BIS@#",
+"@#CONNECT 21600/LAPM@#",
+"@#CONNECT 21600/MNP COMPRESSED@#",
+"@#CONNECT 21600/MNP@#",
+"@#CONNECT 21600/NONE@#",
+"@#CONNECT 21600/NOR@#",
+"@#CONNECT 21600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 21600/REL-LAPM@#",
+"@#CONNECT 21600/REL-V.42@#",
+"@#CONNECT 21600/REL COMP@#",
+"@#CONNECT 21600/REL/COMP@#",
+"@#CONNECT 21600/REL@#",
+"@#CONNECT 21600/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 21600/RELIABLE/LAPM@#",
+"@#CONNECT 21600/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 21600/RELIABLE/MNP@#",
+"@#CONNECT 21600/V42@#",
+"@#CONNECT 21600/V42BIS@#",
+"@#CONNECT 21600@#",
+"@#CONNECT 21600T/V42BIS@#",
+"@#CONNECT 21800/ARQ/V.34/MNP4@#",
+"@#CONNECT 21800/ARQ/V.34/MNP5@#",
+"@#CONNECT 21800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 21800/ARQ/V.34/V42 @#",
+"@#CONNECT 21800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 21800/ARQ/V.34/V42b@#",
+"@#CONNECT 21800@#",
+"@#CONNECT 230400/ARQ@#",
+"@#CONNECT 230400/LAP-M@#",
+"@#CONNECT 230400/LAPM/COMP@#",
+"@#CONNECT 230400/LAPM@#",
+"@#CONNECT 230400/MNP@#",
+"@#CONNECT 230400/NONE@#",
+"@#CONNECT 230400/REL/COMP@#",
+"@#CONNECT 230400/REL@#",
+"@#CONNECT 230400/V42BIS@#",
+"@#CONNECT 230400@#",
+"@#CONNECT 240/MNP@#",
+"@#CONNECT 2400 @#",
+"@#CONNECT 2400 ALT / MNP5@#",
+"@#CONNECT 2400 ALT /MNP 5@#",
+"@#CONNECT 2400 ALT@#",
+"@#CONNECT 2400 EC/V42@#",
+"@#CONNECT 2400 EC/V42BIS@#",
+"@#CONNECT 2400 EC@#",
+"@#CONNECT 2400 LAPM / V.42bis@#",
+"@#CONNECT 2400 LAPM /V.42bis@#",
+"@#CONNECT 2400 LAPM COMPRESSED@#",
+"@#CONNECT 2400 LAPM@#",
+"@#CONNECT 2400 NORMAL@#",
+"@#CONNECT 2400 REL/MNP5@#",
+"@#CONNECT 2400 REL/V42@#",
+"@#CONNECT 2400 REL/V42BIS@#",
+"@#CONNECT 2400 REL@#",
+"@#CONNECT 2400 RELIABLE COMPRESSED@#",
+"@#CONNECT 2400 RELIABLE@#",
+"@#CONNECT 2400 V.42@#",
+"@#CONNECT 2400/ARQ/CELL /MNP4@#",
+"@#CONNECT 2400/ARQ/CELL /MNP5@#",
+"@#CONNECT 2400/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/CELL /V42 @#",
+"@#CONNECT 2400/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/CELL /V42b@#",
+"@#CONNECT 2400/ARQ/CELL/MNP4@#",
+"@#CONNECT 2400/ARQ/CELL/MNP5@#",
+"@#CONNECT 2400/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/CELL/V42 @#",
+"@#CONNECT 2400/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/CELL/V42b@#",
+"@#CONNECT 2400/ARQ/MNP4@#",
+"@#CONNECT 2400/ARQ/MNP5@#",
+"@#CONNECT 2400/ARQ/V.34/MNP4@#",
+"@#CONNECT 2400/ARQ/V.34/MNP5@#",
+"@#CONNECT 2400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V.34/V42 @#",
+"@#CONNECT 2400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V.34/V42b@#",
+"@#CONNECT 2400/ARQ/V.42@#",
+"@#CONNECT 2400/ARQ/V.42bis@#",
+"@#CONNECT 2400/ARQ/V22b /MNP4@#",
+"@#CONNECT 2400/ARQ/V22b /MNP5@#",
+"@#CONNECT 2400/ARQ/V22b /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V22b /V42 @#",
+"@#CONNECT 2400/ARQ/V22b /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V22b /V42b@#",
+"@#CONNECT 2400/ARQ/V22b/MNP4@#",
+"@#CONNECT 2400/ARQ/V22b/MNP5@#",
+"@#CONNECT 2400/ARQ/V22b/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V22b/V42 @#",
+"@#CONNECT 2400/ARQ/V22b/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V22b/V42b@#",
+"@#CONNECT 2400/ARQ/V32 /MNP4@#",
+"@#CONNECT 2400/ARQ/V32 /MNP5@#",
+"@#CONNECT 2400/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42 @#",
+"@#CONNECT 2400/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42b@#",
+"@#CONNECT 2400/ARQ/V32 /MNP4@#",
+"@#CONNECT 2400/ARQ/V32 /MNP5@#",
+"@#CONNECT 2400/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42 @#",
+"@#CONNECT 2400/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42b@#",
+"@#CONNECT 2400/ARQ/V32b /MNP4@#",
+"@#CONNECT 2400/ARQ/V32b /MNP5@#",
+"@#CONNECT 2400/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32b /V42 @#",
+"@#CONNECT 2400/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32b /V42b@#",
+"@#CONNECT 2400/ARQ/V32b/MNP4@#",
+"@#CONNECT 2400/ARQ/V32b/MNP5@#",
+"@#CONNECT 2400/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32b/V42 @#",
+"@#CONNECT 2400/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32b/V42b@#",
+"@#CONNECT 2400/ARQ/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V42 @#",
+"@#CONNECT 2400/ARQ/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V42b@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 @#",
+"@#CONNECT 2400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42b@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 @#",
+"@#CONNECT 2400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42b@#",
+"@#CONNECT 2400/ARQ@#",
+"@#CONNECT 2400/COMP@#",
+"@#CONNECT 2400/LAP-M/COMPRESSION@#",
+"@#CONNECT 2400/LAP-M@#",
+"@#CONNECT 2400/LAPM/COMP@#",
+"@#CONNECT 2400/LAPM/V42BIS@#",
+"@#CONNECT 2400/LAPM@#",
+"@#CONNECT 2400/MNP COMPRESSED@#",
+"@#CONNECT 2400/MNP@#",
+"@#CONNECT 2400/NONE@#",
+"@#CONNECT 2400/NOR@#",
+"@#CONNECT 2400/REL-LAPM-COMP@#",
+"@#CONNECT 2400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 2400/REL-LAPM@#",
+"@#CONNECT 2400/REL-MNP-COMP@#",
+"@#CONNECT 2400/REL-MNP@#",
+"@#CONNECT 2400/REL-V.42@#",
+"@#CONNECT 2400/REL 1@# ",
+"@#CONNECT 2400/REL 2@# ",
+"@#CONNECT 2400/REL 3@# ",
+"@#CONNECT 2400/REL 4@# ",
+"@#CONNECT 2400/REL 5@# ",
+"@#CONNECT 2400/REL COMP@#",
+"@#CONNECT 2400/REL COMPRESSED@#",
+"@#CONNECT 2400/REL/COMP@#",
+"@#CONNECT 2400/REL@#",
+"@#CONNECT 2400/RELC@#",
+"@#CONNECT 2400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 2400/RELIABLE/LAPM@#",
+"@#CONNECT 2400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 2400/RELIABLE/MNP@#",
+"@#CONNECT 2400/V42@#",
+"@#CONNECT 2400/V42B@#",
+"@#CONNECT 2400/V42BIS@#",
+"@#CONNECT 2400@#",
+"@#CONNECT 24000 LAPM COMPRESSED@#",
+"@#CONNECT 24000 LAPM@#",
+"@#CONNECT 24000 REL/MNP5@#",
+"@#CONNECT 24000 REL@#",
+"@#CONNECT 24000 RELIABLE COMPRESSED@#",
+"@#CONNECT 24000 RELIABLE@#",
+"@#CONNECT 24000/ARQ/V.34/MNP4@#",
+"@#CONNECT 24000/ARQ/V.34/MNP5@#",
+"@#CONNECT 24000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 24000/ARQ/V.34/V42 @#",
+"@#CONNECT 24000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 24000/ARQ/V.34/V42b@#",
+"@#CONNECT 24000/ARQ@#",
+"@#CONNECT 24000/COMP@#",
+"@#CONNECT 24000/LAP-M/COMPRESSION@#",
+"@#CONNECT 24000/LAP-M@#",
+"@#CONNECT 24000/LAPM/COMP@#",
+"@#CONNECT 24000/LAPM/V42BIS@#",
+"@#CONNECT 24000/LAPM@#",
+"@#CONNECT 24000/MNP COMPRESSED@#",
+"@#CONNECT 24000/MNP@#",
+"@#CONNECT 24000/NONE@#",
+"@#CONNECT 24000/NOR@#",
+"@#CONNECT 24000/REL-LAPM V.42 BIS@#",
+"@#CONNECT 24000/REL-LAPM@#",
+"@#CONNECT 24000/REL-V.42@#",
+"@#CONNECT 24000/REL COMP@#",
+"@#CONNECT 24000/REL/COMP@#",
+"@#CONNECT 24000/REL@#",
+"@#CONNECT 24000/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 24000/RELIABLE/LAPM@#",
+"@#CONNECT 24000/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 24000/RELIABLE/MNP@#",
+"@#CONNECT 24000/V42@#",
+"@#CONNECT 24000/V42BIS@#",
+"@#CONNECT 24000@#",
+"@#CONNECT 24000T/V42BIS@#",
+"@#CONNECT 2400T/V42BIS@#",
+"@#CONNECT 24200/ARQ/V.34/MNP4@#",
+"@#CONNECT 24200/ARQ/V.34/MNP5@#",
+"@#CONNECT 24200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 24200/ARQ/V.34/V42 @#",
+"@#CONNECT 24200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 24200/ARQ/V.34/V42b@#",
+"@#CONNECT 24200@#",
+"@#CONNECT 2600/ARQ/V.34/MNP4@#",
+"@#CONNECT 2600/ARQ/V.34/MNP5@#",
+"@#CONNECT 2600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 2600/ARQ/V.34/V42 @#",
+"@#CONNECT 2600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 2600/ARQ/V.34/V42b@#",
+"@#CONNECT 2600@#",
+"@#CONNECT 26400 LAPM COMPRESSED<cR>#",
+"@#CONNECT 26400 LAPM@#",
+"@#CONNECT 26400 REL/MNP5@#",
+"@#CONNECT 26400 REL@#",
+"@#CONNECT 26400 RELIABLE COMPRESSED<cR>#",
+"@#CONNECT 26400 RELIABLE@#",
+"@#CONNECT 26400/ARQ/V.34/MNP4@#",
+"@#CONNECT 26400/ARQ/V.34/MNP5@#",
+"@#CONNECT 26400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 26400/ARQ/V.34/V42 @#",
+"@#CONNECT 26400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 26400/ARQ/V.34/V42b@#",
+"@#CONNECT 26400/ARQ@#",
+"@#CONNECT 26400/COMP@#",
+"@#CONNECT 26400/LAP-M/COMPRESSION@#",
+"@#CONNECT 26400/LAP-M@#",
+"@#CONNECT 26400/LAPM/COMP@#",
+"@#CONNECT 26400/LAPM/V42BIS@#",
+"@#CONNECT 26400/LAPM@#",
+"@#CONNECT 26400/MNP COMPRESSED@#",
+"@#CONNECT 26400/MNP@#",
+"@#CONNECT 26400/NONE@#",
+"@#CONNECT 26400/NOR@#",
+"@#CONNECT 26400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 26400/REL-LAPM@#",
+"@#CONNECT 26400/REL-V.42@#",
+"@#CONNECT 26400/REL COMP@#",
+"@#CONNECT 26400/REL/COMP@#",
+"@#CONNECT 26400/REL@#",
+"@#CONNECT 26400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 26400/RELIABLE/LAPM@#",
+"@#CONNECT 26400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 26400/RELIABLE/MNP@#",
+"@#CONNECT 26400/V42@#",
+"@#CONNECT 26400/V42BIS@#",
+"@#CONNECT 26400@#",
+"@#CONNECT 26400T/V42BIS@#",
+"@#CONNECT 26600/ARQ/V.34/MNP4@#",
+"@#CONNECT 26600/ARQ/V.34/MNP5@#",
+"@#CONNECT 26600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 26600/ARQ/V.34/V42 @#",
+"@#CONNECT 26600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 26600/ARQ/V.34/V42b@#",
+"@#CONNECT 26600@#",
+"@#CONNECT 26800/MNP COMPRESSED@#",
+"@#CONNECT 28800 LAPM COMPRESSED@#",
+"@#CONNECT 28800 LAPM@#",
+"@#CONNECT 28800 REL/MNP5@#",
+"@#CONNECT 28800 REL@#",
+"@#CONNECT 28800 RELIABLE COMPRESSED@#",
+"@#CONNECT 28800 RELIABLE@#",
+"@#CONNECT 28800/ARQ/V.34/MNP4@#",
+"@#CONNECT 28800/ARQ/V.34/MNP5@#",
+"@#CONNECT 28800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 28800/ARQ/V.34/V42 @#",
+"@#CONNECT 28800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 28800/ARQ/V.34/V42b@#",
+"@#CONNECT 28800/ARQ@#",
+"@#CONNECT 28800/COMP@#",
+"@#CONNECT 28800/LAP-M/COMPRESSION@#",
+"@#CONNECT 28800/LAP-M@#",
+"@#CONNECT 28800/LAPM/COMP@#",
+"@#CONNECT 28800/LAPM/V42BIS@#",
+"@#CONNECT 28800/LAPM@#",
+"@#CONNECT 28800/MNP COMPRESSED@#",
+"@#CONNECT 28800/MNP@#",
+"@#CONNECT 28800/NONE@#",
+"@#CONNECT 28800/NOR@#",
+"@#CONNECT 28800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 28800/REL-LAPM@#",
+"@#CONNECT 28800/REL-V.42@#",
+"@#CONNECT 28800/REL COMP@#",
+"@#CONNECT 28800/REL/COMP@#",
+"@#CONNECT 28800/REL@#",
+"@#CONNECT 28800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 28800/RELIABLE/LAPM@#",
+"@#CONNECT 28800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 28800/RELIABLE/MNP@#",
+"@#CONNECT 28800/V42@#",
+"@#CONNECT 28800/V42BIS@#",
+"@#CONNECT 28800@#",
+"@#CONNECT 28800T/V42BIS@#",
+"@#CONNECT 29000/ARQ/V.34/MNP4@#",
+"@#CONNECT 29000/ARQ/V.34/MNP5@#",
+"@#CONNECT 29000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 29000/ARQ/V.34/V42 @#",
+"@#CONNECT 29000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 29000/ARQ/V.34/V42b@#",
+"@#CONNECT 29000@#",
+"@#CONNECT 300 ALT / MNP5@#",
+"@#CONNECT 300 ALT /MNP 5@#",
+"@#CONNECT 300 ALT@#",
+"@#CONNECT 300 EC/V42BIS@#",
+"@#CONNECT 300 EC@#",
+"@#CONNECT 300 LAPM / V.42bis@#",
+"@#CONNECT 300 LAPM /V.42bis@#",
+"@#CONNECT 300 LAPM@#",
+"@#CONNECT 300 REL/MNP5@#",
+"@#CONNECT 300 REL@#",
+"@#CONNECT 300/ARQ/MNP4@#",
+"@#CONNECT 300/ARQ/MNP5@#",
+"@#CONNECT 300/ARQ/V.42@#",
+"@#CONNECT 300/ARQ/V.42bis@#",
+"@#CONNECT 300/ARQ/V42 /SREJ@#",
+"@#CONNECT 300/ARQ/V42 @#",
+"@#CONNECT 300/ARQ/V42b@#",
+"@#CONNECT 300/ARQ@#",
+"@#CONNECT 300/COMP@#",
+"@#CONNECT 300/LAP-M/COMPRESSION@#",
+"@#CONNECT 300/LAP-M@#",
+"@#CONNECT 300/LAPM/COMP@#",
+"@#CONNECT 300/LAPM/V42BIS@#",
+"@#CONNECT 300/LAPM@#",
+"@#CONNECT 300/MNP COMPRESSED@#",
+"@#CONNECT 300/MNP@#",
+"@#CONNECT 300/NONE@#",
+"@#CONNECT 300/NOR@#",
+"@#CONNECT 300/REL-LAPM V.42 BIS@#",
+"@#CONNECT 300/REL-LAPM@#",
+"@#CONNECT 300/REL-MNP@#",
+"@#CONNECT 300/REL-V.42@#",
+"@#CONNECT 300/REL 1@# ",
+"@#CONNECT 300/REL 2@# ",
+"@#CONNECT 300/REL 3@# ",
+"@#CONNECT 300/REL 4@# ",
+"@#CONNECT 300/REL 5@# ",
+"@#CONNECT 300/REL COMP@#",
+"@#CONNECT 300/REL COMPRESSED@#",
+"@#CONNECT 300/REL/COMP@#",
+"@#CONNECT 300/REL@#",
+"@#CONNECT 300/V42@#",
+"@#CONNECT 300/V42BIS@#",
+"@#CONNECT 300@#",
+"@#CONNECT 300T/V42BIS@#",
+"@#CONNECT 31200/ARQ/V.34/MNP4@#",
+"@#CONNECT 31200/ARQ/V.34/MNP5@#",
+"@#CONNECT 31200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 31200/ARQ/V.34/V42 @#",
+"@#CONNECT 31200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 31200/ARQ/V.34/V42b@#",
+"@#CONNECT 31200@#",
+"@#CONNECT 31400/ARQ/V.34/MNP4@#",
+"@#CONNECT 31400/ARQ/V.34/MNP5@#",
+"@#CONNECT 31400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 31400/ARQ/V.34/V42 @#",
+"@#CONNECT 31400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 31400/ARQ/V.34/V42b@#",
+"@#CONNECT 31400@#",
+"@#CONNECT 33600/ARQ/V.34/MNP4@#",
+"@#CONNECT 33600/ARQ/V.34/MNP5@#",
+"@#CONNECT 33600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 33600/ARQ/V.34/V42 @#",
+"@#CONNECT 33600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 33600/ARQ/V.34/V42b@#",
+"@#CONNECT 33600@#",
+"@#CONNECT 33800/ARQ/V.34/MNP4@#",
+"@#CONNECT 33800/ARQ/V.34/MNP5@#",
+"@#CONNECT 33800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 33800/ARQ/V.34/V42 @#",
+"@#CONNECT 33800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 33800/ARQ/V.34/V42b@#",
+"@#CONNECT 33800@#",
+"@#CONNECT 38400 ALT / MNP5@#",
+"@#CONNECT 38400 ALT /MNP 5@#",
+"@#CONNECT 38400 ALT@#",
+"@#CONNECT 38400 EC/V42BIS@#",
+"@#CONNECT 38400 EC@#",
+"@#CONNECT 38400 LAPM / V.42bis@#",
+"@#CONNECT 38400 LAPM /V.42bis@#",
+"@#CONNECT 38400 LAPM@#",
+"@#CONNECT 38400 REL/MNP5@#",
+"@#CONNECT 38400 REL/V42@#",
+"@#CONNECT 38400 REL@#",
+"@#CONNECT 38400/ARQ/V42 /SREJ@#",
+"@#CONNECT 38400/ARQ/V42 @#",
+"@#CONNECT 38400/ARQ/V42b@#",
+"@#CONNECT 38400/ARQ@#",
+"@#CONNECT 38400/COMP@#",
+"@#CONNECT 38400/LAP-M/COMPRESSION@#",
+"@#CONNECT 38400/LAP-M@#",
+"@#CONNECT 38400/LAPM/COMP@#",
+"@#CONNECT 38400/LAPM@#",
+"@#CONNECT 38400/MNP COMPRESSED@#",
+"@#CONNECT 38400/MNP@#",
+"@#CONNECT 38400/NONE@#",
+"@#CONNECT 38400/NOR@#",
+"@#CONNECT 38400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 38400/REL-LAPM@#",
+"@#CONNECT 38400/REL-V.42@#",
+"@#CONNECT 38400/REL COMP@#",
+"@#CONNECT 38400/REL/COMP@#",
+"@#CONNECT 38400/REL@#",
+"@#CONNECT 38400/V.110@#",
+"@#CONNECT 38400/V42@#",
+"@#CONNECT 38400/V42BIS@#",
+"@#CONNECT 38400@#",
+"@#CONNECT 38400T/V42BIS@#",
+"@#CONNECT 4800 ALT / MNP5@#",
+"@#CONNECT 4800 ALT /MNP 5@#",
+"@#CONNECT 4800 ALT@#",
+"@#CONNECT 4800 EC/V42@#",
+"@#CONNECT 4800 EC/V42BIS@#",
+"@#CONNECT 4800 EC@#",
+"@#CONNECT 4800 LAPM / V.42bis@#",
+"@#CONNECT 4800 LAPM /V.42bis@#",
+"@#CONNECT 4800 LAPM COMPRESSED@#",
+"@#CONNECT 4800 LAPM@#",
+"@#CONNECT 4800 NORMAL@#",
+"@#CONNECT 4800 REL/MNP5@#",
+"@#CONNECT 4800 REL/V42@#",
+"@#CONNECT 4800 REL/V42BIS@#",
+"@#CONNECT 4800 REL@#",
+"@#CONNECT 4800 RELIABLE COMPRESSED@#",
+"@#CONNECT 4800 RELIABLE@#",
+"@#CONNECT 4800 V.42@#",
+"@#CONNECT 4800/ARQ/CELL /MNP4@#",
+"@#CONNECT 4800/ARQ/CELL /MNP5@#",
+"@#CONNECT 4800/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/CELL /V42 @#",
+"@#CONNECT 4800/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/CELL /V42b@#",
+"@#CONNECT 4800/ARQ/CELL/MNP4@#",
+"@#CONNECT 4800/ARQ/CELL/MNP5@#",
+"@#CONNECT 4800/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/CELL/V42 @#",
+"@#CONNECT 4800/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/CELL/V42b@#",
+"@#CONNECT 4800/ARQ/MNP4@#",
+"@#CONNECT 4800/ARQ/MNP5@#",
+"@#CONNECT 4800/ARQ/V.34/MNP4@#",
+"@#CONNECT 4800/ARQ/V.34/MNP5@#",
+"@#CONNECT 4800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V.34/V42 @#",
+"@#CONNECT 4800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V.34/V42b@#",
+"@#CONNECT 4800/ARQ/V.42@#",
+"@#CONNECT 4800/ARQ/V.42bis@#",
+"@#CONNECT 4800/ARQ/V32 /MNP4@#",
+"@#CONNECT 4800/ARQ/V32 /MNP5@#",
+"@#CONNECT 4800/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42 @#",
+"@#CONNECT 4800/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42b@#",
+"@#CONNECT 4800/ARQ/V32 /MNP4@#",
+"@#CONNECT 4800/ARQ/V32 /MNP5@#",
+"@#CONNECT 4800/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42 @#",
+"@#CONNECT 4800/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42b@#",
+"@#CONNECT 4800/ARQ/V32b /MNP4@#",
+"@#CONNECT 4800/ARQ/V32b /MNP5@#",
+"@#CONNECT 4800/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32b /V42 @#",
+"@#CONNECT 4800/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32b /V42b@#",
+"@#CONNECT 4800/ARQ/V32b/MNP4@#",
+"@#CONNECT 4800/ARQ/V32b/MNP5@#",
+"@#CONNECT 4800/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32b/V42 @#",
+"@#CONNECT 4800/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32b/V42b@#",
+"@#CONNECT 4800/ARQ/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V42 @#",
+"@#CONNECT 4800/ARQ/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V42b@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 @#",
+"@#CONNECT 4800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42b@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 @#",
+"@#CONNECT 4800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42b@#",
+"@#CONNECT 4800/ARQ@#",
+"@#CONNECT 4800/COMP@#",
+"@#CONNECT 4800/LAP-M/COMPRESSION@#",
+"@#CONNECT 4800/LAP-M@#",
+"@#CONNECT 4800/LAPM/COMP@#",
+"@#CONNECT 4800/LAPM/V42BIS@#",
+"@#CONNECT 4800/LAPM@#",
+"@#CONNECT 4800/MNP COMPRESSED@#",
+"@#CONNECT 4800/MNP@#",
+"@#CONNECT 4800/NONE@#",
+"@#CONNECT 4800/NOR@#",
+"@#CONNECT 4800/REL-LAPM-COMP@#",
+"@#CONNECT 4800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 4800/REL-LAPM@#",
+"@#CONNECT 4800/REL-MNP-COMP@#",
+"@#CONNECT 4800/REL-MNP@#",
+"@#CONNECT 4800/REL-V.42@#",
+"@#CONNECT 4800/REL 1@# ",
+"@#CONNECT 4800/REL 2@# ",
+"@#CONNECT 4800/REL 3@# ",
+"@#CONNECT 4800/REL 4@# ",
+"@#CONNECT 4800/REL 5@# ",
+"@#CONNECT 4800/REL COMP@#",
+"@#CONNECT 4800/REL COMPRESSED@#",
+"@#CONNECT 4800/REL/COMP@#",
+"@#CONNECT 4800/REL@#",
+"@#CONNECT 4800/RELC@#",
+"@#CONNECT 4800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 4800/RELIABLE/LAPM@#",
+"@#CONNECT 4800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 4800/RELIABLE/MNP@#",
+"@#CONNECT 4800/V42@#",
+"@#CONNECT 4800/V42B@#",
+"@#CONNECT 4800/V42BIS@#",
+"@#CONNECT 4800@#",
+"@#CONNECT 48000@#",
+"@#CONNECT 4800T/V42BIS@#",
+"@#CONNECT 5000/ARQ/V.34/MNP4@#",
+"@#CONNECT 5000/ARQ/V.34/MNP5@#",
+"@#CONNECT 5000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 5000/ARQ/V.34/V42 @#",
+"@#CONNECT 5000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 5000/ARQ/V.34/V42b@#",
+"@#CONNECT 5000@#",
+"@#CONNECT 56000/ARQ/SLP /V120/V42b@#",
+"@#CONNECT 56000/ARQ/SLP /V120@#",
+"@#CONNECT 56000/REL@#",
+"@#CONNECT 56000@#",
+"@#CONNECT 57600 ALT / MNP5@#",
+"@#CONNECT 57600 ALT /MNP 5@#",
+"@#CONNECT 57600 ALT@#",
+"@#CONNECT 57600 EC/V42BIS@#",
+"@#CONNECT 57600 EC@#",
+"@#CONNECT 57600 LAPM / V.42bis@#",
+"@#CONNECT 57600 LAPM /V.42bis@#",
+"@#CONNECT 57600 LAPM@#",
+"@#CONNECT 57600 REL/MNP5@#",
+"@#CONNECT 57600 REL@#",
+"@#CONNECT 57600/ARQ/V42 /SREJ@#",
+"@#CONNECT 57600/ARQ/V42 @#",
+"@#CONNECT 57600/ARQ/V42b@#",
+"@#CONNECT 57600/ARQ@#",
+"@#CONNECT 57600/COMP@#",
+"@#CONNECT 57600/LAP-M/COMPRESSION@#",
+"@#CONNECT 57600/LAP-M@#",
+"@#CONNECT 57600/LAPM/COMP@#",
+"@#CONNECT 57600/LAPM@#",
+"@#CONNECT 57600/MNP COMPRESSED@#",
+"@#CONNECT 57600/MNP@#",
+"@#CONNECT 57600/NONE@#",
+"@#CONNECT 57600/NOR@#",
+"@#CONNECT 57600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 57600/REL-LAPM@#",
+"@#CONNECT 57600/REL-V.42@#",
+"@#CONNECT 57600/REL COMP@#",
+"@#CONNECT 57600/REL/COMP@#",
+"@#CONNECT 57600/REL@#",
+"@#CONNECT 57600/V42@#",
+"@#CONNECT 57600/V42BIS@#",
+"@#CONNECT 57600@#",
+"@#CONNECT 57600@#@#@#*@#COM@#",
+"@#CONNECT 57600T/V42BIS@#",
+"@#CONNECT 600 ALT / MNP5@#",
+"@#CONNECT 600 ALT /MNP 5@#",
+"@#CONNECT 600 ALT@#",
+"@#CONNECT 600 EC/V42BIS@#",
+"@#CONNECT 600 EC@#",
+"@#CONNECT 600 LAPM / V.42bis@#",
+"@#CONNECT 600 LAPM /V.42bis@#",
+"@#CONNECT 600 LAPM@#",
+"@#CONNECT 600 REL/MNP5@#",
+"@#CONNECT 600 REL@#",
+"@#CONNECT 600/ARQ/MNP4@#",
+"@#CONNECT 600/ARQ/MNP5@#",
+"@#CONNECT 600/ARQ/V.42@#",
+"@#CONNECT 600/ARQ/V.42bis@#",
+"@#CONNECT 600/ARQ@#",
+"@#CONNECT 600/COMP@#",
+"@#CONNECT 600/LAP-M/COMPRESSION@#",
+"@#CONNECT 600/LAP-M@#",
+"@#CONNECT 600/LAPM/COMP@#",
+"@#CONNECT 600/LAPM@#",
+"@#CONNECT 600/MNP COMPRESSED@#",
+"@#CONNECT 600/MNP@#",
+"@#CONNECT 600/NONE@#",
+"@#CONNECT 600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 600/REL 1@# ",
+"@#CONNECT 600/REL 2@# ",
+"@#CONNECT 600/REL 3@# ",
+"@#CONNECT 600/REL 4@# ",
+"@#CONNECT 600/REL 5@# ",
+"@#CONNECT 600/REL COMPRESSED@#",
+"@#CONNECT 600/REL/COMP@#",
+"@#CONNECT 600/REL@#",
+"@#CONNECT 600/V42@#",
+"@#CONNECT 600/V42BIS@#",
+"@#CONNECT 600@#",
+"@#CONNECT 64000/ARQ/SLP /X.75/V42b@#",
+"@#CONNECT 64000/ARQ/SLP /X.75@#",
+"@#CONNECT 64000/MNP@#",
+"@#CONNECT 64000/REL@#",
+"@#CONNECT 64000/X.70 BTX@#",
+"@#CONNECT 64000/X.70NL@#",
+"@#CONNECT 64000/X.75@#",
+"@#CONNECT 64000@#",
+"@#CONNECT 7200 ALT / MNP5@#",
+"@#CONNECT 7200 ALT /MNP 5@#",
+"@#CONNECT 7200 ALT@#",
+"@#CONNECT 7200 EC/V42@#",
+"@#CONNECT 7200 EC/V42BIS@#",
+"@#CONNECT 7200 EC@#",
+"@#CONNECT 7200 LAPM / V.42bis@#",
+"@#CONNECT 7200 LAPM /V.42bis@#",
+"@#CONNECT 7200 LAPM COMPRESSED@#",
+"@#CONNECT 7200 LAPM@#",
+"@#CONNECT 7200 REL/MNP5@#",
+"@#CONNECT 7200 REL/V42@#",
+"@#CONNECT 7200 REL/V42BIS@#",
+"@#CONNECT 7200 REL@#",
+"@#CONNECT 7200 RELIABLE@#",
+"@#CONNECT 7200/ARQ/CELL /MNP4@#",
+"@#CONNECT 7200/ARQ/CELL /MNP5@#",
+"@#CONNECT 7200/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/CELL /V42 @#",
+"@#CONNECT 7200/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/CELL /V42b@#",
+"@#CONNECT 7200/ARQ/CELL/MNP4@#",
+"@#CONNECT 7200/ARQ/CELL/MNP5@#",
+"@#CONNECT 7200/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/CELL/V42 @#",
+"@#CONNECT 7200/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/CELL/V42b@#",
+"@#CONNECT 7200/ARQ/MNP4@#",
+"@#CONNECT 7200/ARQ/MNP5@#",
+"@#CONNECT 7200/ARQ/V.34/MNP4@#",
+"@#CONNECT 7200/ARQ/V.34/MNP5@#",
+"@#CONNECT 7200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V.34/V42 @#",
+"@#CONNECT 7200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V.34/V42b@#",
+"@#CONNECT 7200/ARQ/V.42@#",
+"@#CONNECT 7200/ARQ/V.42bis@#",
+"@#CONNECT 7200/ARQ/V32 /MNP4@#",
+"@#CONNECT 7200/ARQ/V32 /MNP5@#",
+"@#CONNECT 7200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42 @#",
+"@#CONNECT 7200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42b@#",
+"@#CONNECT 7200/ARQ/V32 /MNP4@#",
+"@#CONNECT 7200/ARQ/V32 /MNP5@#",
+"@#CONNECT 7200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42 @#",
+"@#CONNECT 7200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42b@#",
+"@#CONNECT 7200/ARQ/V32b /MNP4@#",
+"@#CONNECT 7200/ARQ/V32b /MNP5@#",
+"@#CONNECT 7200/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32b /V42 @#",
+"@#CONNECT 7200/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32b /V42b@#",
+"@#CONNECT 7200/ARQ/V32b/MNP4@#",
+"@#CONNECT 7200/ARQ/V32b/MNP5@#",
+"@#CONNECT 7200/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32b/V42 @#",
+"@#CONNECT 7200/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32b/V42b@#",
+"@#CONNECT 7200/ARQ/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V42 @#",
+"@#CONNECT 7200/ARQ/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V42b@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 @#",
+"@#CONNECT 7200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42b@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 @#",
+"@#CONNECT 7200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42b@#",
+"@#CONNECT 7200/ARQ@#",
+"@#CONNECT 7200/COMP@#",
+"@#CONNECT 7200/LAP-M/COMPRESSION@#",
+"@#CONNECT 7200/LAP-M@#",
+"@#CONNECT 7200/LAPM/COMP@#",
+"@#CONNECT 7200/LAPM/V42BIS@#",
+"@#CONNECT 7200/LAPM@#",
+"@#CONNECT 7200/MNP COMPRESSED@#",
+"@#CONNECT 7200/MNP@#",
+"@#CONNECT 7200/NONE@#",
+"@#CONNECT 7200/NOR@#",
+"@#CONNECT 7200/REL-LAPM-COMP@#",
+"@#CONNECT 7200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 7200/REL-LAPM@#",
+"@#CONNECT 7200/REL-MNP-COMP@#",
+"@#CONNECT 7200/REL-MNP@#",
+"@#CONNECT 7200/REL-V.42@#",
+"@#CONNECT 7200/REL 1@# ",
+"@#CONNECT 7200/REL 2@# ",
+"@#CONNECT 7200/REL 3@# ",
+"@#CONNECT 7200/REL 4@# ",
+"@#CONNECT 7200/REL 5@# ",
+"@#CONNECT 7200/REL COMP@#",
+"@#CONNECT 7200/REL/COMP@#",
+"@#CONNECT 7200/REL@#",
+"@#CONNECT 7200/RELC@#",
+"@#CONNECT 7200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 7200/RELIABLE/LAPM@#",
+"@#CONNECT 7200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 7200/RELIABLE/MNP@#",
+"@#CONNECT 7200/V42@#",
+"@#CONNECT 7200/V42B@#",
+"@#CONNECT 7200/V42BIS@#",
+"@#CONNECT 7200@#",
+"@#CONNECT 7200T/V42BIS@#",
+"@#CONNECT 7400/ARQ/V.34/MNP4@#",
+"@#CONNECT 7400/ARQ/V.34/MNP5@#",
+"@#CONNECT 7400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 7400/ARQ/V.34/V42 @#",
+"@#CONNECT 7400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 7400/ARQ/V.34/V42b@#",
+"@#CONNECT 7400@#",
+"@#CONNECT 75/1200",
+"@#CONNECT 75/1200/ARQ@#",
+"@#CONNECT 75/1200/LAP-M/COMPRESSION@#",
+"@#CONNECT 75/1200/LAP-M@#",
+"@#CONNECT 75/1200/LAPM/COMP@#",
+"@#CONNECT 75/1200/LAPM@#",
+"@#CONNECT 75/1200/MNP@#",
+"@#CONNECT 75/1200/NONE@#",
+"@#CONNECT 75/1200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 75/1200/REL/COMP@#",
+"@#CONNECT 75/1200/REL@#",
+"@#CONNECT 75/1200/REL#",
+"@#CONNECT 75/1200/V42@#",
+"@#CONNECT 75/1200/V42BIS@#",
+"@#CONNECT 75/1200@#",
+"@#CONNECT 75TX/1200RX REL/MNP5@#",
+"@#CONNECT 75TX/1200RX REL@#",
+"@#CONNECT 75TX/1200RX/ARQ@#",
+"@#CONNECT 75TX/1200RX/LAP-M/COMPRESSION@#",
+"@#CONNECT 75TX/1200RX/LAP-M@#",
+"@#CONNECT 75TX/1200RX/LAPM/COMP@#",
+"@#CONNECT 75TX/1200RX/LAPM@#",
+"@#CONNECT 75TX/1200RX/MNP@#",
+"@#CONNECT 75TX/1200RX/NONE@#",
+"@#CONNECT 75TX/1200RX/REL-LAPM V.42 BIS@#",
+"@#CONNECT 75TX/1200RX/REL/COMP@#",
+"@#CONNECT 75TX/1200RX/REL@#",
+"@#CONNECT 75TX/1200RX/V42@#",
+"@#CONNECT 75TX/1200RX/V42BIS@#",
+"@#CONNECT 75TX/1200RX@#",
+"@#CONNECT 76800/ARQ/V42 /SREJ@#",
+"@#CONNECT 76800/ARQ/V42 @#",
+"@#CONNECT 76800/ARQ/V42b@#",
+"@#CONNECT 76800@#",
+"@#CONNECT 9600 ALT / MNP5@#",
+"@#CONNECT 9600 ALT /MNP 5@#",
+"@#CONNECT 9600 ALT@#",
+"@#CONNECT 9600 EC/V42@#",
+"@#CONNECT 9600 EC/V42BIS@#",
+"@#CONNECT 9600 EC@#",
+"@#CONNECT 9600 LAPM / V.42bis@#",
+"@#CONNECT 9600 LAPM /V.42bis@#",
+"@#CONNECT 9600 LAPM COMPRESSED@#",
+"@#CONNECT 9600 LAPM@#",
+"@#CONNECT 9600 NORMAL@#",
+"@#CONNECT 9600 REL/MNP5@#",
+"@#CONNECT 9600 REL/V42@#",
+"@#CONNECT 9600 REL/V42BIS@#",
+"@#CONNECT 9600 REL@#",
+"@#CONNECT 9600 RELIABLE COMPRESSED@#",
+"@#CONNECT 9600 RELIABLE@#",
+"@#CONNECT 9600 V.42@#",
+"@#CONNECT 9600/ARQ/CELL /MNP4@#",
+"@#CONNECT 9600/ARQ/CELL /MNP5@#",
+"@#CONNECT 9600/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/CELL /V42 @#",
+"@#CONNECT 9600/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/CELL /V42b@#",
+"@#CONNECT 9600/ARQ/CELL/MNP4@#",
+"@#CONNECT 9600/ARQ/CELL/MNP5@#",
+"@#CONNECT 9600/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/CELL/V42 @#",
+"@#CONNECT 9600/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/CELL/V42b@#",
+"@#CONNECT 9600/ARQ/MNP4@#",
+"@#CONNECT 9600/ARQ/MNP5@#",
+"@#CONNECT 9600/ARQ/V.34/MNP4@#",
+"@#CONNECT 9600/ARQ/V.34/MNP5@#",
+"@#CONNECT 9600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V.34/V42 @#",
+"@#CONNECT 9600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V.34/V42b@#",
+"@#CONNECT 9600/ARQ/V.42@#",
+"@#CONNECT 9600/ARQ/V.42bis@#",
+"@#CONNECT 9600/ARQ/V32 /MNP4@#",
+"@#CONNECT 9600/ARQ/V32 /MNP5@#",
+"@#CONNECT 9600/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42 @#",
+"@#CONNECT 9600/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42b@#",
+"@#CONNECT 9600/ARQ/V32 /MNP4@#",
+"@#CONNECT 9600/ARQ/V32 /MNP5@#",
+"@#CONNECT 9600/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42 @#",
+"@#CONNECT 9600/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42b@#",
+"@#CONNECT 9600/ARQ/V32b /MNP4@#",
+"@#CONNECT 9600/ARQ/V32b /MNP5@#",
+"@#CONNECT 9600/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32b /V42 @#",
+"@#CONNECT 9600/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32b /V42b@#",
+"@#CONNECT 9600/ARQ/V32b/MNP4@#",
+"@#CONNECT 9600/ARQ/V32b/MNP5@#",
+"@#CONNECT 9600/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32b/V42 @#",
+"@#CONNECT 9600/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32b/V42b@#",
+"@#CONNECT 9600/ARQ/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V42 @#",
+"@#CONNECT 9600/ARQ/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V42b@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP4@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP5@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 @#",
+"@#CONNECT 9600/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42b@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP4@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP5@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 @#",
+"@#CONNECT 9600/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42b@#",
+"@#CONNECT 9600/ARQ@#",
+"@#CONNECT 9600/COMP@#",
+"@#CONNECT 9600/LAP-M/COMPRESSION@#",
+"@#CONNECT 9600/LAP-M@#",
+"@#CONNECT 9600/LAPM/COMP@#",
+"@#CONNECT 9600/LAPM/V42BIS@#",
+"@#CONNECT 9600/LAPM@#",
+"@#CONNECT 9600/MNP COMPRESSED@#",
+"@#CONNECT 9600/MNP@#",
+"@#CONNECT 9600/NONE@#",
+"@#CONNECT 9600/NOR@#",
+"@#CONNECT 9600/REL-LAPM-COMP@#",
+"@#CONNECT 9600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 9600/REL-LAPM@#",
+"@#CONNECT 9600/REL-MNP-COMP@#",
+"@#CONNECT 9600/REL-MNP@#",
+"@#CONNECT 9600/REL-V.42@#",
+"@#CONNECT 9600/REL 1@# ",
+"@#CONNECT 9600/REL 2@# ",
+"@#CONNECT 9600/REL 3@# ",
+"@#CONNECT 9600/REL 4@# ",
+"@#CONNECT 9600/REL 5@# ",
+"@#CONNECT 9600/REL COMP@#",
+"@#CONNECT 9600/REL COMPRESSED@#",
+"@#CONNECT 9600/REL/COMP@#",
+"@#CONNECT 9600/REL@#",
+"@#CONNECT 9600/RELC@#",
+"@#CONNECT 9600/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 9600/RELIABLE/LAPM@#",
+"@#CONNECT 9600/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 9600/RELIABLE/MNP@#",
+"@#CONNECT 9600/V.110@#",
+"@#CONNECT 9600/V42@#",
+"@#CONNECT 9600/V42B@#",
+"@#CONNECT 9600/V42BIS@#",
+"@#CONNECT 9600@#",
+"@#CONNECT 9600T RELIABLE@#",
+"@#CONNECT 9600T V.42@#",
+"@#CONNECT 9600T/V42BIS@#",
+"@#CONNECT 9800/ARQ/V.34/MNP4@#",
+"@#CONNECT 9800/ARQ/V.34/MNP5@#",
+"@#CONNECT 9800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 9800/ARQ/V.34/V42 @#",
+"@#CONNECT 9800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 9800/ARQ/V.34/V42b@#",
+"@#CONNECT 9800@#",
+"@#CONNECT EC@#",
+"@#CONNECT FAST@#",
+"@#CONNECT LAPM COMPRESSED@#",
+"@#CONNECT LAPM@#",
+"@#CONNECT REL/MNP5@#",
+"@#CONNECT REL@#",
+"@#CONNECT RELIABLE COMPRESSED@#",
+"@#CONNECT RELIABLE@#",
+"@#CONNECT V.21/REL@#",
+"@#CONNECT/ARQ@#",
+"@#CONNECT/LAP-M/COMPRESSION@#",
+"@#CONNECT/LAP-M@#",
+"@#CONNECT/LAPM/COMP@#",
+"@#CONNECT/LAPM@#",
+"@#CONNECT/MNP@#",
+"@#CONNECT/NONE@#",
+"@#CONNECT/REL/COMP@#",
+"@#CONNECT/REL@#",
+"@#CONNECT/V42@#",
+"@#CONNECT/V42BIS@#",
+"@#CONNECT@#",
+"@#DALAYED@#",
+"@#DATA@#",
+"@#DATE = ",
+"@#DELAYED",
+"@#Delayed@#",
+"@#DELAYED@#",
+"@#Delayed@#",
+"@#DELAYED@#",
+"@#DIALING@#",
+"@#DISCONNECT@#",
+"@#Don't use this command at this situation @#",
+"@#ERROR SERIAL SPEED SETUP@#",
+"@#ERROR@#",
+"@#FAX@#",
+"@#LIB DER 00@#",
+"@#LOCKED@#",
+"@#NO ANSWER@#",
+"@#NO CARRIER@#",
+"@#NO DIAL TONE@#",
+"@#NO DIALTONE@#",
+"@#NO USER RESPONDING@#",
+"@#NOTUSED@#",
+"@#NUMBER DELAYED:TIMER@#",
+"@#NUMBER LOCKED OUT@#",
+"@#OFF HOOK@#",
+"@#OK@#",
+"@#PROTOCOL: ALT-+FCERROR@#",
+"@#PROTOCOL: ALT-CELLULAR@#",
+"@#PROTOCOL: ALT-DATA@#",
+"@#PROTOCOL: ALT-FAX@#",
+"@#PROTOCOL: ALT - CELLULAR@#",
+"@#PROTOCOL: ALT CELLULAR@#",
+"@#PROTOCOL: ALT@#",
+"@#PROTOCOL: ERROR-CONTROL/LAP-B@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB/AFT@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB/HDX@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB@#",
+"@#PROTOCOL: LAP-M/AFT@#",
+"@#PROTOCOL: LAP-M/HDX@#",
+"@#PROTOCOL: LAP-M@#",
+"@#PROTOCOL: LAP_M@#",
+"@#PROTOCOL: LAPM/AFT@#",
+"@#PROTOCOL: LAPM/HDX@#",
+"@#PROTOCOL: LAPM@#",
+"@#PROTOCOL: MNP 3,4@#",
+"@#PROTOCOL: MNP ALT@#",
+"@#PROTOCOL: MNP REL 1@#",
+"@#PROTOCOL: MNP REL 2@#",
+"@#PROTOCOL: MNP REL 3@#",
+"@#PROTOCOL: MNP REL 4@#",
+"@#PROTOCOL: MNP REL 5@#",
+"@#PROTOCOL: MNP REL@#",
+"@#PROTOCOL: MNP@#",
+"@#PROTOCOL: MNP1@#",
+"@#PROTOCOL: MNP2@#",
+"@#PROTOCOL: MNP3@#",
+"@#PROTOCOL: MNP4@#",
+"@#PROTOCOL: NONE@#",
+"@#PROTOCOL: PAD@#",
+"@#PROTOCOL: V.42BIS@#",
+"@#PROTOCOL: V42@#",
+"@#PROTOCOL: V42BIS@#",
+"@#PROTOCOL: X.25/LAPB/AFT@#",
+"@#PROTOCOL: X.25/LAPB/HDX@#",
+"@#PROTOCOL: X.25/LAPB@#",
+"@#PROTOCOL:ALT-+FCERROR@#",
+"@#PROTOCOL:ALT-CELLULAR@#",
+"@#PROTOCOL:ALT-DATA@#",
+"@#PROTOCOL:ALT-FAX@#",
+"@#PROTOCOL:ALT@#",
+"@#PROTOCOL:LAP-M@#",
+"@#PROTOCOL:LAPM@#",
+"@#PROTOCOL:MNP@#",
+"@#PROTOCOL:MNP2@#",
+"@#PROTOCOL:MNP3@#",
+"@#PROTOCOL:MNP4@#",
+"@#PROTOCOL:NONE@#",
+"@#PROTOCOL:V.42BIS@#",
+"@#PROTOCOL:V42BIS@#",
+"@#RING@#",
+"@#RING1@#",
+"@#RING2@#",
+"@#RING3@#",
+"@#RINGING@#",
+"@#RRING@#",
+"@#TEST FAILED@#",
+"@#TEST PASSED@#",
+"@#VCON@#",
+"@#VOICE@#",
+"@#Wait 5 seconds,then dial@#",
+"@OK#",
+"<ff>@",
+"<ff>@@#OK@#",
+"<h00>CLIENT",
+"#",
+"0@",
+"0<CR>",
+"0@",
+"00@",
+"01@",
+"02@",
+"03@",
+"04@",
+"05@",
+"06@",
+"07@",
+"08@",
+"1<CR>",
+"1@",
+"10@",
+"10<CR>",
+"10@",
+"10@#",
+"10@66@",
+"10@67@",
+"10@69@",
+"100@",
+"101@",
+"102@",
+"103@",
+"104@",
+"105@",
+"10L@#",
+"10LC@#",
+"10R@#",
+"10RC@#",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11@#",
+"11@66@",
+"11@67@",
+"11@69@",
+"111@",
+"112@",
+"113@",
+"114@",
+"115@",
+"116@",
+"117@",
+"118@",
+"119@",
+"11L@#",
+"11LC@#",
+"11R@#",
+"11RC@#",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12@#",
+"12@66@",
+"12@67@",
+"12@69@",
+"120@",
+"121@",
+"122@",
+"123@",
+"124@",
+"125@",
+"126@",
+"127@",
+"128@",
+"129@",
+"12L@#",
+"12LC@#",
+"12R@#",
+"12RC@#",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@#",
+"13@66@",
+"13@67@",
+"13@69@",
+"13L@#",
+"13LC@#",
+"13R@#",
+"13RC@#",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@66@",
+"14@67@",
+"14@69@",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15@66@",
+"15@67@",
+"15@69@",
+"16@",
+"16<CR>",
+"16@",
+"16@66@",
+"16@67@",
+"16@69@",
+"17@",
+"18@",
+"18<CR>",
+"18@",
+"19@",
+"19@#",
+"19L@#",
+"19LC@#",
+"19R@#",
+"19RC@#",
+"1L@#",
+"1LC@#",
+"1R@#",
+"1RC@#",
+"2@",
+"2<CR>",
+"2@",
+"20@",
+"21@",
+"21@#",
+"21L@#",
+"21LC@#",
+"21R@#",
+"21RC@#",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24@#",
+"24L@#",
+"24LC@#",
+"24R@#",
+"24RC@#",
+"25@",
+"25<CR>",
+"25@",
+"25<CR>",
+"25@",
+"25<CR>",
+"26<CR>",
+"26@",
+"26<CR>",
+"26@",
+"26<CR>",
+"26@",
+"26@#",
+"26L@#",
+"26LC@#",
+"26R@#",
+"26RC<cR>#",
+"27@",
+"28@",
+"28<CR>",
+"28@",
+"28<CR>",
+"28@",
+"28<CR>",
+"28@",
+"28@#",
+"28L@#",
+"28LC@#",
+"28R@#",
+"28RC@#",
+"29@",
+"29<CR>",
+"29@",
+"3@",
+"3<CR>",
+"3@",
+"30@",
+"31@",
+"31<CR>",
+"31@",
+"32@",
+"33@",
+"34<CR>",
+"34@",
+"35@",
+"36@",
+"36<CR>",
+"36@",
+"37@",
+"37<CR>",
+"37@",
+"38<CR>",
+"38@",
+"39@",
+"4@",
+"4<CR>",
+"4@",
+"40@",
+"40<CR>",
+"40@",
+"40@70@01@",
+"40@70@66@01@",
+"40@70@67@01@",
+"40@70@69@01@",
+"40@77@01@",
+"40@77@66@01@",
+"40@77@67@01@",
+"40@77@69@01@",
+"40@80@01@",
+"40@80@66@01@",
+"40@80@67@01@",
+"40@80@69@01@",
+"40@81@01@",
+"40@81@66@01@",
+"40@81@67@01@",
+"40@81@69@01@",
+"41@",
+"42@",
+"43@",
+"44@",
+"44<CR>",
+"44@",
+"44@70@05@",
+"44@70@66@05@",
+"44@70@67@05@",
+"44@70@69@05@",
+"44@77@05@",
+"44@77@66@05@",
+"44@77@67@05@",
+"44@77@69@05@",
+"44@80@05@",
+"44@80@66@05@",
+"44@80@67@05@",
+"44@80@69@05@",
+"44@81@05@",
+"44@81@66@05@",
+"44@81@67@05@",
+"44@81@69@05@",
+"45@",
+"45<CR>",
+"45@",
+"45@70@05@",
+"45@70@66@05@",
+"45@70@67@05@",
+"45@70@69@05@",
+"45@77@05@",
+"45@77@66@05@",
+"45@77@67@05@",
+"45@77@69@05@",
+"45@80@05@",
+"45@80@66@05@",
+"45@80@67@05@",
+"45@80@69@05@",
+"45@81@05@",
+"45@81@66@05@",
+"45@81@67@05@",
+"45@81@69@05@",
+"46@",
+"46<CR>",
+"46@",
+"46@70@05@",
+"46@70@66@05@",
+"46@70@67@05@",
+"46@70@69@05@",
+"46@77@05@",
+"46@77@66@05@",
+"46@77@67@05@",
+"46@77@69@05@",
+"46@80@05@",
+"46@80@66@05@",
+"46@80@67@05@",
+"46@80@69@05@",
+"46@81@05@",
+"46@81@66@05@",
+"46@81@67@05@",
+"46@81@69@05@",
+"47@",
+"47<CR>",
+"47@",
+"47@70@10@",
+"47@70@66@10@",
+"47@70@67@10@",
+"47@70@69@10@",
+"47@77@10@",
+"47@77@66@10@",
+"47@77@67@10@",
+"47@77@69@10@",
+"47@80@10@",
+"47@80@66@10@",
+"47@80@67@10@",
+"47@80@69@10@",
+"47@81@10@",
+"47@81@66@10@",
+"47@81@67@10@",
+"47@81@69@10@",
+"48@",
+"48<CR>",
+"48@",
+"48@70@11@",
+"48@70@66@11@",
+"48@70@67@11@",
+"48@70@69@11@",
+"48@77@11@",
+"48@77@66@11@",
+"48@77@67@11@",
+"48@77@69@11@",
+"48@80@11@",
+"48@80@66@11@",
+"48@80@67@11@",
+"48@80@69@11@",
+"48@81@11@",
+"48@81@66@11@",
+"48@81@67@11@",
+"48@81@69@11@",
+"49@",
+"49<CR>",
+"49@",
+"49@70@13@",
+"49@70@66@13@",
+"49@70@67@13@",
+"49@70@69@13@",
+"49@77@13@",
+"49@77@66@13@",
+"49@77@67@13@",
+"49@77@69@13@",
+"49@80@13@",
+"49@80@66@13@",
+"49@80@67@13@",
+"49@80@69@13@",
+"49@81@13@",
+"49@81@66@13@",
+"49@81@67@13@",
+"49@81@69@13@",
+"5@",
+"5<CR>",
+"5@",
+"5@66@",
+"5@67@",
+"5@69@",
+"50@",
+"50<CR>",
+"50@",
+"50@70@12@",
+"50@70@66@12@",
+"50@70@67@12@",
+"50@70@69@12@",
+"50@77@12@",
+"50@77@66@12@",
+"50@77@67@12@",
+"50@77@69@12@",
+"50@80@12@",
+"50@80@66@12@",
+"50@80@67@12@",
+"50@80@69@12@",
+"50@81@12@",
+"50@81@66@12@",
+"50@81@67@12@",
+"50@81@69@12@",
+"51@",
+"51<CR>",
+"51@",
+"51@70@14@",
+"51@70@66@14@",
+"51@70@67@14@",
+"51@70@69@14@",
+"51@77@14@",
+"51@77@66@14@",
+"51@77@67@14@",
+"51@77@69@14@",
+"51@80@14@",
+"51@80@66@14@",
+"51@80@67@14@",
+"51@80@69@14@",
+"51@81@14@",
+"51@81@66@14@",
+"51@81@67@14@",
+"51@81@69@14@",
+"52@",
+"52<CR>",
+"52@",
+"52@70@15@",
+"52@70@66@15@",
+"52@70@67@15@",
+"52@70@69@15@",
+"52@77@15@",
+"52@77@66@15@",
+"52@77@67@15@",
+"52@77@69@15@",
+"52@80@15@",
+"52@80@66@15@",
+"52@80@67@15@",
+"52@80@69@15@",
+"52@81@15@",
+"52@81@66@15@",
+"52@81@67@15@",
+"52@81@69@15@",
+"53@",
+"53<CR>",
+"53@",
+"53@70@59@",
+"53@70@66@59@",
+"53@70@67@59@",
+"53@70@69@59@",
+"53@77@59@",
+"53@77@66@59@",
+"53@77@67@59@",
+"53@77@69@59@",
+"53@80@59@",
+"53@80@66@59@",
+"53@80@67@59@",
+"53@80@69@59@",
+"53@81@59@",
+"53@81@66@59@",
+"53@81@67@59@",
+"53@81@69@59@",
+"54@",
+"54<CR>",
+"54@70@16@",
+"54@70@66@16@",
+"54@70@67@16@",
+"54@70@69@16@",
+"54@77@16@",
+"54@77@66@16@",
+"54@77@67@16@",
+"54@77@69@16@",
+"54@80@16@",
+"54@80@66@16@",
+"54@80@67@16@",
+"54@80@69@16@",
+"54@81@16@",
+"54@81@66@16@",
+"54@81@67@16@",
+"54@81@69@16@",
+"55@",
+"55<CR>",
+"55@",
+"55@70@61@",
+"55@70@66@61@",
+"55@70@67@61@",
+"55@70@69@61@",
+"55@77@61@",
+"55@77@66@61@",
+"55@77@67@61@",
+"55@77@69@61@",
+"55@80@61@",
+"55@80@66@61@",
+"55@80@67@61@",
+"55@80@69@61@",
+"55@81@61@",
+"55@81@66@61@",
+"55@81@67@61@",
+"55@81@69@61@",
+"56@",
+"56@70@62@",
+"56@70@66@62@",
+"56@70@67@62@",
+"56@70@69@62@",
+"56@77@62@",
+"56@77@66@62@",
+"56@77@67@62@",
+"56@77@69@62@",
+"56@80@62@",
+"56@80@66@62@",
+"56@80@67@62@",
+"56@80@69@62@",
+"56@81@62@",
+"56@81@66@62@",
+"56@81@67@62@",
+"56@81@69@62@",
+"57@",
+"57@70@63@",
+"57@70@66@63@",
+"57@70@67@63@",
+"57@70@69@63@",
+"57@77@63@",
+"57@77@66@63@",
+"57@77@67@63@",
+"57@77@69@63@",
+"57@80@63@",
+"57@80@66@63@",
+"57@80@67@63@",
+"57@80@69@63@",
+"57@81@63@",
+"57@81@66@63@",
+"57@81@67@63@",
+"57@81@69@63@",
+"58@",
+"58@70@64@",
+"58@70@66@64@",
+"58@70@67@64@",
+"58@70@69@64@",
+"58@77@64@",
+"58@77@66@64@",
+"58@77@67@64@",
+"58@77@69@64@",
+"58@80@64@",
+"58@80@66@64@",
+"58@80@67@64@",
+"58@80@69@64@",
+"58@81@64@",
+"58@81@66@64@",
+"58@81@67@64@",
+"58@81@69@64@",
+"59@",
+"5L@#",
+"5LC@#",
+"5R@#",
+"5RC@#",
+"6@",
+"6<CR>",
+"6@",
+"60@",
+"60<CR>",
+"60@",
+"61@",
+"62@",
+"63@",
+"63@66@",
+"63@67@",
+"63@69@",
+"64@",
+"64@66@",
+"64@67@",
+"64@69@",
+"65@",
+"66@",
+"66<CR>",
+"66@",
+"67@",
+"67<CR>",
+"67@",
+"68@",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"7@",
+"7<CR>",
+"7@",
+"70@",
+"70<CR>",
+"70@",
+"71@",
+"72@",
+"73@",
+"74@",
+"75@",
+"76@",
+"77@",
+"77<CR>",
+"77@",
+"78@",
+"79@",
+"8@",
+"8<CR>",
+"8@",
+"80@",
+"80<CR>",
+"80@",
+"81@",
+"82@",
+"83@",
+"84@",
+"85@",
+"86@",
+"87@",
+"88@",
+"89@",
+"9@",
+"9<CR>",
+"9@",
+"9@#",
+"90@",
+"91@",
+"92@",
+"93@",
+"94@",
+"95@",
+"96@",
+"97@",
+"98@",
+"99@",
+"9L@#",
+"9LC@#",
+"9R@#",
+"9RC@#",
+"ATE0V0",
+"AUTOSTREAM: LEVEL 1",
+"AUTOSTREAM: LEVEL 2",
+"AUTOSTREAM: LEVEL 3",
+"BLACKLISTED",
+"BUSY",
+"CARRIER",
+"CARRIER 0300",
+"CARRIER 1200",
+"CARRIER 1200/75",
+"CARRIER 1200/75/VFC",
+"CARRIER 1200/VFC",
+"CARRIER 12000",
+"CARRIER 12000/VFC",
+"CARRIER 14400",
+"CARRIER 14400/VFC",
+"CARRIER 16800",
+"CARRIER 16800 V.34",
+"CARRIER 16800/VFC",
+"CARRIER 19200",
+"CARRIER 19200 V.34",
+"CARRIER 19200/VFC",
+"CARRIER 21600",
+"CARRIER 21600 V.34",
+"CARRIER 21600/VFC",
+"CARRIER 2400",
+"CARRIER 2400/VFC",
+"CARRIER 24000",
+"CARRIER 24000 V.34",
+"CARRIER 24000/VFC",
+"CARRIER 26400",
+"CARRIER 26400 V.34",
+"CARRIER 26400/VFC",
+"CARRIER 28800",
+"CARRIER 28800 V.34",
+"CARRIER 28800/VFC",
+"CARRIER 300",
+"CARRIER 300/VFC",
+"CARRIER 4800",
+"CARRIER 4800/VFC",
+"CARRIER 7200",
+"CARRIER 7200/VFC",
+"CARRIER 75/1200",
+"CARRIER 75/1200/VFC",
+"CARRIER 9600",
+"CARRIER 9600/VFC",
+"CLIENT",
+"CLIENTSERVER",
+"COMPRESSION: ADC",
+"COMPRESSION: CLASS 5",
+"COMPRESSION: CLASS5",
+"COMPRESSION: MNP5",
+"COMPRESSION: NONE",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V42BIS",
+"COMPRESSION:CLASS5",
+"COMPRESSION:MNP5",
+"COMPRESSION:NONE",
+"COMPRESSION:V.42bis",
+"CONNECT",
+"CONNECT 0300",
+"CONNECT 0300/ARQ",
+"CONNECT 0300/LAP-M",
+"CONNECT 0300/MNP",
+"CONNECT 0300/REL",
+"CONNECT 0300/REL-5",
+"CONNECT 0300/REL-LAPM",
+"CONNECT 0300/REL-LAPM-COMP",
+"CONNECT 0300/REL-MNP",
+"CONNECT 0300/REL-MNP-COMP",
+"CONNECT 0300/REL-V.42",
+"CONNECT 0300/V42b",
+"CONNECT 0300/V42BIS",
+"CONNECT 0600",
+"CONNECT 0600/ARQ",
+"CONNECT 0600/LAP-M",
+"CONNECT 0600/LAPM",
+"CONNECT 0600/MNP",
+"CONNECT 0600/NONE",
+"CONNECT 0600/REL",
+"CONNECT 0600/REL-5",
+"CONNECT 0600/REL-LAPM",
+"CONNECT 0600/REL-LAPM-COMP",
+"CONNECT 0600/REL-MNP",
+"CONNECT 0600/REL-MNP-COMP",
+"CONNECT 0600/REL-V.42",
+"CONNECT 0600/V42",
+"CONNECT 0600/V42b",
+"CONNECT 0600/V42BIS",
+"CONNECT 115,200",
+"CONNECT 115,200/ARQ",
+"CONNECT 115,200/LAP-M",
+"CONNECT 115,200/MNP",
+"CONNECT 115,200/NONE",
+"CONNECT 115,200/REL",
+"CONNECT 115,200/REL-5",
+"CONNECT 115,200/REL-V.42",
+"CONNECT 115,200/V42",
+"CONNECT 115,200/V42b",
+"CONNECT 115,200/V42BIS",
+"CONNECT 115200",
+"CONNECT 115200/ARQ",
+"CONNECT 115200/LAP-M",
+"CONNECT 115200/LAPM",
+"CONNECT 115200/MNP",
+"CONNECT 115200/NONE",
+"CONNECT 115200/REL",
+"CONNECT 115200/REL-5",
+"CONNECT 115200/REL-LAPM",
+"CONNECT 115200/REL-LAPM-COMP",
+"CONNECT 115200/REL-MNP",
+"CONNECT 115200/REL-MNP-COMP",
+"CONNECT 115200/REL-V.42",
+"CONNECT 115200/REL/VFC",
+"CONNECT 115200/V42",
+"CONNECT 115200/V42b",
+"CONNECT 115200/V42BIS",
+"CONNECT 115200/VFC",
+"CONNECT 1200",
+"CONNECT 1200/75",
+"CONNECT 1200/75/ARQ",
+"CONNECT 1200/75/LAP-M",
+"CONNECT 1200/75/LAPM",
+"CONNECT 1200/75/MNP",
+"CONNECT 1200/75/NONE",
+"CONNECT 1200/75/REL",
+"CONNECT 1200/75/REL-5",
+"CONNECT 1200/75/REL-LAPM",
+"CONNECT 1200/75/REL-LAPM-COMP",
+"CONNECT 1200/75/REL-MNP",
+"CONNECT 1200/75/REL-MNP-COMP",
+"CONNECT 1200/75/REL-V.42",
+"CONNECT 1200/75/V42",
+"CONNECT 1200/75/V42b",
+"CONNECT 1200/75/V42BIS",
+"CONNECT 1200/ARQ",
+"CONNECT 1200/ECL",
+"CONNECT 1200/ECLC",
+"CONNECT 1200/LAP-M",
+"CONNECT 1200/LAPM",
+"CONNECT 1200/MNP",
+"CONNECT 1200/NONE",
+"CONNECT 1200/REL",
+"CONNECT 1200/REL-5",
+"CONNECT 1200/REL-LAPM",
+"CONNECT 1200/REL-LAPM-COMP",
+"CONNECT 1200/REL-LAPM V.42 BIS",
+"CONNECT 1200/REL-MNP",
+"CONNECT 1200/REL-MNP-COMP",
+"CONNECT 1200/REL-MNP 5",
+"CONNECT 1200/REL-V.42",
+"CONNECT 1200/V42",
+"CONNECT 1200/V42b",
+"CONNECT 1200/V42BIS",
+"CONNECT 12000",
+"CONNECT 12000/ARQ",
+"CONNECT 12000/ECL",
+"CONNECT 12000/ECLC",
+"CONNECT 12000/LAP-M",
+"CONNECT 12000/LAPM",
+"CONNECT 12000/MNP",
+"CONNECT 12000/NONE",
+"CONNECT 12000/REL",
+"CONNECT 12000/REL-5",
+"CONNECT 12000/REL-LAPM",
+"CONNECT 12000/REL-LAPM-COMP",
+"CONNECT 12000/REL-LAPM V.42 BIS",
+"CONNECT 12000/REL-MNP",
+"CONNECT 12000/REL-MNP-COMP",
+"CONNECT 12000/REL-MNP 5",
+"CONNECT 12000/REL-V.42",
+"CONNECT 12000/V42",
+"CONNECT 12000/V42b",
+"CONNECT 12000/V42BIS",
+"CONNECT 1200TX/75RX",
+"CONNECT 1200TX/75RX/ARQ",
+"CONNECT 1200TX/75RX/LAP-M",
+"CONNECT 1200TX/75RX/LAPM",
+"CONNECT 1200TX/75RX/MNP",
+"CONNECT 1200TX/75RX/NONE",
+"CONNECT 1200TX/75RX/REL",
+"CONNECT 1200TX/75RX/REL-5",
+"CONNECT 1200TX/75RX/REL-LAPM",
+"CONNECT 1200TX/75RX/REL-LAPM-COMP",
+"CONNECT 1200TX/75RX/REL-MNP",
+"CONNECT 1200TX/75RX/REL-MNP-COMP",
+"CONNECT 1200TX/75RX/REL-V.42",
+"CONNECT 1200TX/75RX/V42",
+"CONNECT 1200TX/75RX/V42b",
+"CONNECT 1200TX/75RX/V42BIS",
+"CONNECT 14400",
+"CONNECT 14400/ARQ",
+"CONNECT 14400/ECL",
+"CONNECT 14400/ECLC",
+"CONNECT 14400/LAP-M",
+"CONNECT 14400/LAPM",
+"CONNECT 14400/MNP",
+"CONNECT 14400/NONE",
+"CONNECT 14400/REL",
+"CONNECT 14400/REL-5",
+"CONNECT 14400/REL-LAPM",
+"CONNECT 14400/REL-LAPM-COMP",
+"CONNECT 14400/REL-LAPM V.42 BIS",
+"CONNECT 14400/REL-MNP",
+"CONNECT 14400/REL-MNP-COMP",
+"CONNECT 14400/REL-MNP 5",
+"CONNECT 14400/REL-V.42",
+"CONNECT 14400/V42",
+"CONNECT 14400/V42b",
+"CONNECT 14400/V42BIS",
+"CONNECT 14400/VFC",
+"CONNECT 16800",
+"CONNECT 16800/ARQ",
+"CONNECT 16800/ECL",
+"CONNECT 16800/ECLC",
+"CONNECT 16800/LAP-M",
+"CONNECT 16800/LAPM",
+"CONNECT 16800/MNP",
+"CONNECT 16800/NONE",
+"CONNECT 16800/REL",
+"CONNECT 16800/REL-5",
+"CONNECT 16800/REL-LAPM",
+"CONNECT 16800/REL-LAPM-COMP",
+"CONNECT 16800/REL-MNP",
+"CONNECT 16800/REL-MNP-COMP",
+"CONNECT 16800/REL-V.42",
+"CONNECT 16800/V42",
+"CONNECT 16800/V42b",
+"CONNECT 16800/V42BIS",
+"CONNECT 16800/VFC",
+"CONNECT 19200",
+"CONNECT 19200/ARQ",
+"CONNECT 19200/ECL",
+"CONNECT 19200/ECLC",
+"CONNECT 19200/LAP-M",
+"CONNECT 19200/LAPM",
+"CONNECT 19200/MNP",
+"CONNECT 19200/NONE",
+"CONNECT 19200/REL",
+"CONNECT 19200/REL-5",
+"CONNECT 19200/REL-LAPM",
+"CONNECT 19200/REL-LAPM-COMP",
+"CONNECT 19200/REL-MNP",
+"CONNECT 19200/REL-MNP-COMP",
+"CONNECT 19200/REL-V.42",
+"CONNECT 19200/V42",
+"CONNECT 19200/V42b",
+"CONNECT 19200/V42BIS",
+"CONNECT 19200/VFC",
+"CONNECT 21600",
+"CONNECT 21600/ARQ",
+"CONNECT 21600/ECL",
+"CONNECT 21600/ECLC",
+"CONNECT 21600/LAP-M",
+"CONNECT 21600/LAPM",
+"CONNECT 21600/MNP",
+"CONNECT 21600/NONE",
+"CONNECT 21600/REL",
+"CONNECT 21600/REL-5",
+"CONNECT 21600/REL-LAPM-COMP",
+"CONNECT 21600/REL-MNP",
+"CONNECT 21600/REL-MNP-COMP",
+"CONNECT 21600/REL-REL-LAPM",
+"CONNECT 21600/REL-V.42",
+"CONNECT 21600/V42",
+"CONNECT 21600/V42b",
+"CONNECT 21600/V42BIS",
+"CONNECT 21600/VFC",
+"CONNECT 230400",
+"CONNECT 230400/ARQ",
+"CONNECT 230400/LAP-M",
+"CONNECT 230400/MNP",
+"CONNECT 230400/NONE",
+"CONNECT 230400/REL",
+"CONNECT 230400/V42",
+"CONNECT 230400/V42b",
+"CONNECT 230400/V42BIS",
+"CONNECT 2400",
+"CONNECT 2400/ARQ",
+"CONNECT 2400/ECL",
+"CONNECT 2400/ECLC",
+"CONNECT 2400/LAP-M",
+"CONNECT 2400/LAPM",
+"CONNECT 2400/MNP",
+"CONNECT 2400/NONE",
+"CONNECT 2400/REL",
+"CONNECT 2400/REL-5",
+"CONNECT 2400/REL-LAPM",
+"CONNECT 2400/REL-LAPM-COMP",
+"CONNECT 2400/REL-LAPM V.42 BIS",
+"CONNECT 2400/REL-MNP",
+"CONNECT 2400/REL-MNP-COMP",
+"CONNECT 2400/REL-MNP 5",
+"CONNECT 2400/REL-V.42",
+"CONNECT 2400/V42",
+"CONNECT 2400/V42b",
+"CONNECT 2400/V42BIS",
+"CONNECT 24000",
+"CONNECT 24000/ARQ",
+"CONNECT 24000/ECL",
+"CONNECT 24000/ECLC",
+"CONNECT 24000/LAP-M",
+"CONNECT 24000/LAPM",
+"CONNECT 24000/MNP",
+"CONNECT 24000/NONE",
+"CONNECT 24000/REL",
+"CONNECT 24000/REL-5",
+"CONNECT 24000/REL-LAPM",
+"CONNECT 24000/REL-LAPM-COMP",
+"CONNECT 24000/REL-MNP",
+"CONNECT 24000/REL-MNP-COMP",
+"CONNECT 24000/REL-V.42",
+"CONNECT 24000/V42",
+"CONNECT 24000/V42b",
+"CONNECT 24000/V42BIS",
+"CONNECT 24000/VFC",
+"CONNECT 26400",
+"CONNECT 26400/ARQ",
+"CONNECT 26400/ECL",
+"CONNECT 26400/ECLC",
+"CONNECT 26400/LAP-M",
+"CONNECT 26400/LAPM",
+"CONNECT 26400/MNP",
+"CONNECT 26400/NONE",
+"CONNECT 26400/REL",
+"CONNECT 26400/REL-5",
+"CONNECT 26400/REL-LAPM",
+"CONNECT 26400/REL-LAPM-COMP",
+"CONNECT 26400/REL-MNP",
+"CONNECT 26400/REL-MNP-COMP",
+"CONNECT 26400/REL-V.42",
+"CONNECT 26400/V42",
+"CONNECT 26400/V42b",
+"CONNECT 26400/V42BIS",
+"CONNECT 26400/VFC",
+"CONNECT 28800",
+"CONNECT 28800/ARQ",
+"CONNECT 28800/ARQ/VFC",
+"CONNECT 28800/ECL",
+"CONNECT 28800/ECLC",
+"CONNECT 28800/LAP-M",
+"CONNECT 28800/LAPM",
+"CONNECT 28800/MNP",
+"CONNECT 28800/NONE",
+"CONNECT 28800/REL",
+"CONNECT 28800/REL-5",
+"CONNECT 28800/REL-LAPM",
+"CONNECT 28800/REL-LAPM-COMP",
+"CONNECT 28800/REL-MNP",
+"CONNECT 28800/REL-MNP-COMP",
+"CONNECT 28800/REL-V.42",
+"CONNECT 28800/REL/VFC",
+"CONNECT 28800/V42",
+"CONNECT 28800/V42b",
+"CONNECT 28800/V42BIS",
+"CONNECT 28800/VFC",
+"CONNECT 300",
+"CONNECT 300/ARQ",
+"CONNECT 300/ECL",
+"CONNECT 300/ECLC",
+"CONNECT 300/LAP-M",
+"CONNECT 300/LAPM",
+"CONNECT 300/MNP",
+"CONNECT 300/NONE",
+"CONNECT 300/REL",
+"CONNECT 300/REL-5",
+"CONNECT 300/REL-LAPM",
+"CONNECT 300/REL-LAPM-COMP",
+"CONNECT 300/REL-LAPM V.42 BIS",
+"CONNECT 300/REL-MNP",
+"CONNECT 300/REL-MNP-COMP",
+"CONNECT 300/REL-MNP 5",
+"CONNECT 300/REL-V.42",
+"CONNECT 300/V42",
+"CONNECT 300/V42b",
+"CONNECT 300/V42BIS",
+"CONNECT 38400",
+"CONNECT 38400/ARQ",
+"CONNECT 38400/LAP-M",
+"CONNECT 38400/LAPM",
+"CONNECT 38400/MNP",
+"CONNECT 38400/NONE",
+"CONNECT 38400/REL",
+"CONNECT 38400/REL-5",
+"CONNECT 38400/REL-LAPM",
+"CONNECT 38400/REL-LAPM-COMP",
+"CONNECT 38400/REL-MNP",
+"CONNECT 38400/REL-MNP-COMP",
+"CONNECT 38400/REL-V.42",
+"CONNECT 38400/REL/VFC",
+"CONNECT 38400/V42",
+"CONNECT 38400/V42b",
+"CONNECT 38400/V42BIS",
+"CONNECT 38400/VFC",
+"CONNECT 4800",
+"CONNECT 4800/ARQ",
+"CONNECT 4800/ECL",
+"CONNECT 4800/ECLC",
+"CONNECT 4800/LAP-M",
+"CONNECT 4800/LAPM",
+"CONNECT 4800/MNP",
+"CONNECT 4800/NONE",
+"CONNECT 4800/REL",
+"CONNECT 4800/REL-5",
+"CONNECT 4800/REL-LAPM",
+"CONNECT 4800/REL-LAPM-COMP",
+"CONNECT 4800/REL-LAPM V.42 BIS",
+"CONNECT 4800/REL-MNP",
+"CONNECT 4800/REL-MNP-COMP",
+"CONNECT 4800/REL-MNP 5",
+"CONNECT 4800/REL-V.42",
+"CONNECT 4800/V42",
+"CONNECT 4800/V42b",
+"CONNECT 4800/V42BIS",
+"CONNECT 57600",
+"CONNECT 57600/ARQ",
+"CONNECT 57600/LAP-M",
+"CONNECT 57600/LAPM",
+"CONNECT 57600/MNP",
+"CONNECT 57600/NONE",
+"CONNECT 57600/REL",
+"CONNECT 57600/REL-5",
+"CONNECT 57600/REL-LAPM",
+"CONNECT 57600/REL-LAPM-COMP",
+"CONNECT 57600/REL-MNP",
+"CONNECT 57600/REL-MNP-COMP",
+"CONNECT 57600/REL-V.42",
+"CONNECT 57600/REL/VFC",
+"CONNECT 57600/V42",
+"CONNECT 57600/V42b",
+"CONNECT 57600/V42BIS",
+"CONNECT 57600/VFC",
+"CONNECT 600",
+"CONNECT 600/ARQ",
+"CONNECT 600/ECL",
+"CONNECT 600/ECLC",
+"CONNECT 600/LAP-M",
+"CONNECT 600/LAPM",
+"CONNECT 600/MNP",
+"CONNECT 600/NONE",
+"CONNECT 600/REL",
+"CONNECT 600/REL-5",
+"CONNECT 600/REL-LAPM",
+"CONNECT 600/REL-LAPM-COMP",
+"CONNECT 600/REL-LAPM V.42 BIS",
+"CONNECT 600/REL-MNP",
+"CONNECT 600/REL-MNP-COMP",
+"CONNECT 600/REL-MNP 5",
+"CONNECT 600/REL-V.42",
+"CONNECT 600/V42",
+"CONNECT 600/V42b",
+"CONNECT 600/V42BIS",
+"CONNECT 7200",
+"CONNECT 7200/ARQ",
+"CONNECT 7200/ECL",
+"CONNECT 7200/ECLC",
+"CONNECT 7200/LAP-M",
+"CONNECT 7200/LAPM",
+"CONNECT 7200/MNP",
+"CONNECT 7200/NONE",
+"CONNECT 7200/REL",
+"CONNECT 7200/REL-5",
+"CONNECT 7200/REL-LAPM",
+"CONNECT 7200/REL-LAPM-COMP",
+"CONNECT 7200/REL-LAPM V.42 BIS",
+"CONNECT 7200/REL-MNP",
+"CONNECT 7200/REL-MNP-COMP",
+"CONNECT 7200/REL-MNP 5",
+"CONNECT 7200/REL-V.42",
+"CONNECT 7200/V42",
+"CONNECT 7200/V42b",
+"CONNECT 7200/V42BIS",
+"CONNECT 75/1200",
+"CONNECT 75/1200/ARQ",
+"CONNECT 75/1200/LAP-M",
+"CONNECT 75/1200/MNP",
+"CONNECT 75/1200/NONE",
+"CONNECT 75/1200/REL",
+"CONNECT 75/1200/REL-5",
+"CONNECT 75/1200/REL-LAPM",
+"CONNECT 75/1200/REL-LAPM-COMP",
+"CONNECT 75/1200/REL-MNP",
+"CONNECT 75/1200/REL-MNP-COMP",
+"CONNECT 75/1200/REL-V.42",
+"CONNECT 75/1200/V42",
+"CONNECT 75/1200/V42b",
+"CONNECT 75/1200/V42BIS",
+"CONNECT 75TX/1200RX",
+"CONNECT 75TX/1200RX/ARQ",
+"CONNECT 75TX/1200RX/LAP-M",
+"CONNECT 75TX/1200RX/LAPM",
+"CONNECT 75TX/1200RX/MNP",
+"CONNECT 75TX/1200RX/NONE",
+"CONNECT 75TX/1200RX/REL",
+"CONNECT 75TX/1200RX/REL-5",
+"CONNECT 75TX/1200RX/REL-LAPM",
+"CONNECT 75TX/1200RX/REL-LAPM-COMP",
+"CONNECT 75TX/1200RX/REL-MNP",
+"CONNECT 75TX/1200RX/REL-MNP-COMP",
+"CONNECT 75TX/1200RX/REL-V.42",
+"CONNECT 75TX/1200RX/V42",
+"CONNECT 75TX/1200RX/V42b",
+"CONNECT 75TX/1200RX/V42BIS",
+"CONNECT 9600",
+"CONNECT 9600/ARQ",
+"CONNECT 9600/ECL",
+"CONNECT 9600/ECLC",
+"CONNECT 9600/LAP-M",
+"CONNECT 9600/LAPM",
+"CONNECT 9600/MNP",
+"CONNECT 9600/NONE",
+"CONNECT 9600/REL",
+"CONNECT 9600/REL-5",
+"CONNECT 9600/REL-LAPM",
+"CONNECT 9600/REL-LAPM-COMP",
+"CONNECT 9600/REL-LAPM V.42 BIS",
+"CONNECT 9600/REL-MNP",
+"CONNECT 9600/REL-MNP-COMP",
+"CONNECT 9600/REL-MNP 5",
+"CONNECT 9600/REL-V.42",
+"CONNECT 9600/V42",
+"CONNECT 9600/V42b",
+"CONNECT 9600/V42BIS",
+"CONNECT ECL",
+"CONNECT ECLC",
+"CONNECT/ARQ",
+"CONNECT/LAP-M",
+"CONNECT/LAPM",
+"CONNECT/MNP",
+"CONNECT/NONE",
+"CONNECT/REL",
+"CONNECT/V42",
+"CONNECT/V42b",
+"CONNECT/V42BIS",
+"DATA",
+"DELAYED",
+"DIALING",
+"ERROR",
+"FAX",
+"HOST DRIVER TIMEOUT",
+"mdmblatz.inf:HKR, Responses,",
+"mdmbsb.inf:HKR, Responses,",
+"mdmbsch.inf:HKR, Responses,",
+"mdmhaeus.inf:HKR, Responses,",
+"mdmico.inf:HKR, Responses,",
+"mdminsys.inf:HKR, Responses,",
+"mdmke.inf:HKR, Responses,",
+"mdmmart.inf:HKR, Responses,",
+"mdmneuhs.inf:HKR, Responses,",
+"mdmrfi.inf:HKR, Responses,",
+"mdmtelnk.inf:HKR, Responses,",
+"mdmtger.inf:HKR, Responses,",
+"mdmtkr.inf:HKR, Responses,",
+"mdmusrcr.inf:HKR,Responses,",
+"mdmusrg.inf:HKR,Responses,",
+"mdmusrsp.inf:HKR,Responses,",
+"mdmusrwp.inf:HKR,Responses,",
+"mdmwoer.inf:HKR, Responses,",
+"MESG = ",
+"NAME = ",
+"NMBR = ",
+"NO ANSWER",
+"NO CARRIER",
+"NO DIAL TONE",
+"NO DIALTONE",
+"NoResponse",
+"OK",
+"PROTOCOL: ALT",
+"PROTOCOL: ALT-CELLULAR",
+"PROTOCOL: ALT - CELLULAR",
+"PROTOCOL: ERROR-CONTROL/LAPB",
+"PROTOCOL: ERROR-CONTROL/LAPB/AFT",
+"PROTOCOL: ERROR-CONTROL/LAPB/HDX",
+"PROTOCOL: LAP-M",
+"PROTOCOL: LAP-M/AFT",
+"PROTOCOL: LAP-M/ETC",
+"PROTOCOL: LAP-M/HDX",
+"PROTOCOL: LAPM",
+"PROTOCOL: LAPM/AFT",
+"PROTOCOL: LAPM/HDX",
+"PROTOCOL: MNP",
+"PROTOCOL: MNP 2",
+"PROTOCOL: MNP 2, 4",
+"PROTOCOL: MNP 3",
+"PROTOCOL: MNP 3, 4",
+"PROTOCOL: MNP 4",
+"PROTOCOL: MNP10",
+"PROTOCOL: MNP2",
+"PROTOCOL: MNP3",
+"PROTOCOL: MNP4",
+"PROTOCOL: NONE",
+"PROTOCOL: X.25/LAPB",
+"PROTOCOL: X.25/LAPB/AFT",
+"PROTOCOL: X.25/LAPB/HDX",
+"PROTOCOL:MNP 2, 4",
+"PROTOCOL:MNP 3, 4",
+"PROTOCOL:NONE",
+"RING",
+"RINGING",
+"RRING",
+"TIME = ",
+"VOICE",
+NULL
+};
+
+
+CHAR *rgpszActualResp[] =
+{
+ "0@",
+ "2@",
+ "3@",
+ "4@",
+ "6@",
+ "7@",
+ "8@",
+ "@",
+ "@#BUSY@#",
+ "@#CONNECT 1200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 1200/ARQ/LAPM/MNP5@#",
+ "@#CONNECT 1200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 1200/ARQ/LAPM@#",
+ "@#CONNECT 1200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 1200/ARQ/MNP/V42BIS@#",
+ "@#CONNECT 1200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 1200/ARQ/V32/LAPM@#",
+ "@#CONNECT 1200/ARQ/V32/MNP@#",
+ "@#CONNECT 1200/ARQ/V34/LAPM@#",
+ "@#CONNECT 1200/ARQ/V34/MNP@#",
+ "@#CONNECT 1200/ARQ@#",
+ "@#CONNECT 1200/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 12000/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V32/MNP@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V34/MNP@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ@#",
+ "@#CONNECT 12000/HST/NONE@#",
+ "@#CONNECT 12000/V32/NONE@#",
+ "@#CONNECT 12000/V34/NONE@#",
+ "@#CONNECT 12000/VFC/NONE@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 14400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V32/MNP@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V34/MNP@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ@#",
+ "@#CONNECT 14400/HST/NONE@#",
+ "@#CONNECT 14400/V32/NONE@#",
+ "@#CONNECT 14400/V34/NONE@#",
+ "@#CONNECT 14400/VFC/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 16800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V32/MNP@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V34/MNP@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ@#",
+ "@#CONNECT 16800/HST/NONE@#",
+ "@#CONNECT 16800/V32/NONE@#",
+ "@#CONNECT 16800/V34/NONE@#",
+ "@#CONNECT 16800/VFC/NONE@#",
+ "@#CONNECT 19200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 19200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V32/MNP@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V34/MNP@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ@#",
+ "@#CONNECT 19200/V32/NONE@#",
+ "@#CONNECT 19200/V34/NONE@#",
+ "@#CONNECT 19200/VFC/NONE@#",
+ "@#CONNECT 21600/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 21600/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V32/MNP@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V34/MNP@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ@#",
+ "@#CONNECT 21600/V32/NONE@#",
+ "@#CONNECT 21600/V34/NONE@#",
+ "@#CONNECT 21600/VFC/NONE@#",
+ "@#CONNECT 2400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 2400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/LAPM@#",
+ "@#CONNECT 2400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 2400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V32/LAPM@#",
+ "@#CONNECT 2400/ARQ/V32/MNP@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V34/MNP@#",
+ "@#CONNECT 2400/ARQ@#",
+ "@#CONNECT 2400/NONE@#",
+ "@#CONNECT 2400/V34/NONE@#",
+ "@#CONNECT 24000/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 24000/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V32/LAPM@#",
+ "@#CONNECT 24000/ARQ/V32/MNP@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V34/MNP@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 24000/ARQ@#",
+ "@#CONNECT 24000/V34/NONE@#",
+ "@#CONNECT 24000/VFC/NONE@#",
+ "@#CONNECT 26400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 26400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V32/LAPM@#",
+ "@#CONNECT 26400/ARQ/V32/MNP@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V34/MNP@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 26400/ARQ@#",
+ "@#CONNECT 26400/V34/NONE@#",
+ "@#CONNECT 26400/VFC/NONE@#",
+ "@#CONNECT 28800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 28800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V32/LAPM@#",
+ "@#CONNECT 28800/ARQ/V32/MNP@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V34/MNP@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 28800/ARQ@#",
+ "@#CONNECT 28800/V34/NONE@#",
+ "@#CONNECT 28800/VFC/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 4800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/LAPM@#",
+ "@#CONNECT 4800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V32/MNP@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V34/MNP@#",
+ "@#CONNECT 4800/ARQ@#",
+ "@#CONNECT 4800/HST/NONE@#",
+ "@#CONNECT 4800/V32/NONE@#",
+ "@#CONNECT 4800/V34/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 7200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/LAPM@#",
+ "@#CONNECT 7200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V32/MNP@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V34/MNP@#",
+ "@#CONNECT 7200/ARQ@#",
+ "@#CONNECT 7200/HST/NONE@#",
+ "@#CONNECT 7200/V32/NONE@#",
+ "@#CONNECT 7200/V34/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 9600/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V32/MNP@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V34/MNP@#",
+ "@#CONNECT 9600/ARQ@#",
+ "@#CONNECT 9600/HST/NONE@#",
+ "@#CONNECT 9600/V32/NONE@#",
+ "@#CONNECT 9600/V34/NONE@#",
+ "@#CONNECT@#",
+ "@#ERROR@#",
+ "@#NO ANSWER@#",
+ "@#NO CARRIER@#",
+ "@#NO DIAL TONE@#",
+ "@#NO DIALTONE@#",
+ "@#OK@#",
+ "@#RING@#",
+ "@#RINGING@#",
+ "@#VOICE@#",
+ "#",
+ NULL
+};
diff --git a/private/unimodem/new/mic/alloc.h b/private/unimodem/new/mic/alloc.h
new file mode 100644
index 000000000..ae5637608
--- /dev/null
+++ b/private/unimodem/new/mic/alloc.h
@@ -0,0 +1,86 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// ALLOC.H -- Header for Classes:
+// CAllococator
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+#if (TODO)
+
+
+class CAllocator
+{
+ Allocator(UINT uSize) : m_uSize(uSize)
+ {
+ ASSERT(!(uSize %sizeof(void *)));
+ m_uBlockSize = (uSize+sizeof(void *))
+ if (uSize<1000)
+ m_uBlockSize = m_uBlockSize*10 + sizeof(void *)
+
+ m_uBlockSize += sizeof (void*);
+ }
+
+ ~Allocator()
+ {
+ void *pList = m_pBlockList;
+ while(pList)
+ {
+ void *pOld = pList;
+ pList = (void *) *pList;
+ GlobalFree(pOld);
+ }
+ }
+
+ void * Alloc(void)
+ {
+ m_sync.EnterCrit();
+
+ void *pvRet = m_pFreeList;
+
+ if (!m_pFreeList)
+ {
+ void *pv = GlobalAlloc(LPTR, m_uBlockSize);
+ void *pvEnd = pv+m_uBlockSize;
+ if (pv)
+ {
+ *pv = m_pvBlockList;
+ m_pvBlockList = pv;
+ m_pFreeList = ++pv;
+ for(;;pv = *pv)
+ {
+ *pv = pv + m_uSize + sizeof (void *);
+ if (*pv >= pvEnd) {*pv=NULL;break;}
+ pv = *pv;
+ }
+ pvRet = m_pFreeList;
+ }
+ }
+
+ m_sync.LeaveCrit();
+
+ return pvRet;
+ }
+
+ void Free(void *pv)
+ {
+ m_sync.EnterCrit();
+ pv--;
+ *pv = m_pFreeList;
+ m_pFreeList=*pv;
+ m_sync.LeaveCrit();
+ }
+
+private:
+
+ void * m_pFreeList;
+ void * m_pBlockList;
+ const UINT m_uSize;
+ UINT m_uBlockSize;
+ CSync m_sync;
+}
+#endif (TODO)
diff --git a/private/unimodem/new/mic/chksum.cpp b/private/unimodem/new/mic/chksum.cpp
new file mode 100644
index 000000000..55e936eaa
--- /dev/null
+++ b/private/unimodem/new/mic/chksum.cpp
@@ -0,0 +1,57 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// CHKSUM.CPP -- Implementation Checksum()
+//
+// History:
+// 05/24/96 JosephJ Created
+//
+//
+#include "common.h"
+
+//---------------- ::Checksum -----------------------------------
+// Compute a 32-bit checksum of the specified bytes
+// 0 is retured if pb==NULL or cb==0
+DWORD Checksum(const BYTE *pb, UINT cb)
+{
+ const UINT MAXSIZE = 1024;
+ DWORD dwRet = 0;
+ //DWORD rgdwBuf[MAXSIZE/sizeof(DWORD)];
+
+
+ if (!pb) goto end;
+
+
+ // TODO: replace by crc32
+ while(cb--) {dwRet ^= dwRet<<1 ^ *pb++;}
+
+#if (TODO)
+ // If buffer not dword aligned, we copy it over to a buffer which is,
+ // and pad it
+ if (cb & 0x3)
+ {
+ if (cb>=MAXSIZE)
+ {
+ ASSERT(FALSE);
+ goto end;
+ }
+ CopyMemory(rgdwBuf, pb, cb);
+ }
+#endif (TODO)
+
+end:
+ return dwRet;
+}
+
+
+//---------------- ::AddToChecksumDW ----------------------------
+// Set *pdwChkSum to a new checksum, computed using it's previous value and dw.
+void AddToChecksumDW(DWORD *pdwChkSum, DWORD dw)
+{
+ DWORD rgdw[2];
+ rgdw[0] = *pdwChkSum;
+ rgdw[1] = dw;
+
+ *pdwChkSum = Checksum((const BYTE *) rgdw, sizeof(rgdw));
+}
diff --git a/private/unimodem/new/mic/chksum.h b/private/unimodem/new/mic/chksum.h
new file mode 100644
index 000000000..e5af9e49f
--- /dev/null
+++ b/private/unimodem/new/mic/chksum.h
@@ -0,0 +1,23 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// CHKSUM.H -- Header for Checksum computation
+//
+// History:
+// 05/24/96 JosephJ Created
+//
+//
+#ifndef _CHKSUM_H_
+#define _CHKSUM_H_
+
+//---------------- ::Checksum -----------------------------------
+// Compute a 32-bit checksum of the specified bytes
+// 0 is retured if pb==NULL or cb==0
+DWORD Checksum(const BYTE *pb, UINT cb);
+
+//---------------- ::AddToChecksumDW ----------------------------
+// Set *pdwChkSum to a new checksum, computed using it's previous value and dw.
+void AddToChecksumDW(DWORD *pdwChkSum, DWORD dw);
+
+#endif // _CHKSUM_H_
diff --git a/private/unimodem/new/mic/common.h b/private/unimodem/new/mic/common.h
new file mode 100644
index 000000000..6dfe74c45
--- /dev/null
+++ b/private/unimodem/new/mic/common.h
@@ -0,0 +1,32 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+// COMMON.H -- Common header
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+
+#ifndef _COMMON_H_
+#define _COMMON_H_
+
+#include <windows.h>
+#include <stdio.h>
+
+#define ASSERT(_c) \
+ ((_c) ? 0: printf( \
+ "\n***Assertion failed in %s:%d\n***\n",\
+ __FILE__,\
+ __LINE__\
+ ))
+
+#include "consts.h"
+#include "chksum.h"
+#include "ilist.h"
+#include "sync.h"
+#include "sym.h"
+#include "globals.h"
+
+
+#endif // _COMMON_H_
diff --git a/private/unimodem/new/mic/consts.h b/private/unimodem/new/mic/consts.h
new file mode 100644
index 000000000..68d39d3b7
--- /dev/null
+++ b/private/unimodem/new/mic/consts.h
@@ -0,0 +1,30 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+// CONSTS.H -- Common constants
+//
+// History:
+// 06/13/96 JosephJ Created
+//
+//
+#ifndef _CONSTS_H_
+#define _CONSTS_H_
+
+// Platforms
+enum ePLATFORM
+{
+ ePLAT_ALL,
+ ePLAT_NT_ALL,
+ ePLAT_NT_ALPHA,
+ ePLAT_NT_PPC,
+ ePLAT_NT_MIPS
+};
+
+// Object signatures.
+enum eOBJSIG
+{
+ eOBJSIG_INVALID = 0,
+ eOBJSIG_CInfManufacturerSection = 1234
+};
+
+#endif // _CONSTS_H_
diff --git a/private/unimodem/new/mic/dev.cpp b/private/unimodem/new/mic/dev.cpp
new file mode 100644
index 000000000..051632a5c
--- /dev/null
+++ b/private/unimodem/new/mic/dev.cpp
@@ -0,0 +1,1103 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// DEV.C -- Implementation for Classes:
+// CInfDevice
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+#include "common.h"
+#include "ini.h"
+#include "inf.h"
+#include "dev.h"
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfDevice
+///////////////////////////////////////////////////////////////////////////
+
+
+//-------------- Dump ------------------
+// Dump state
+void CInfDevice::Dump(void) const
+{
+ // Dump Version
+ m_pVersion->Dump();
+
+ // Dump manufacturer name
+ m_pSymManufacturerName->Dump();
+
+ // Dump model name
+ m_pSymDeviceName->Dump();
+
+ // Dump AddRegList
+ {
+ const CInfList *pList = m_pAddRegList;
+
+ for (;pList; pList=pList->Next())
+ {
+ const CInfAddRegEntry * pAddRegEntry =
+ (const CInfAddRegEntry *) pList->GetData();
+ pAddRegEntry->Dump();
+ }
+
+ }
+
+ // Dump CopyFilesList
+ {
+ const CInfList *pList = m_pCopyFilesList;
+
+ for (;pList; pList=pList->Next())
+ {
+ const CInfCopyFilesEntry * pCopyFilesEntry =
+ (const CInfCopyFilesEntry *) pList->GetData();
+ pCopyFilesEntry->Dump();
+ }
+
+ }
+
+ // NoResDup section
+ {
+ // [Modem6.NoResDup]
+ // UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15
+
+ // TODO: unimplemented
+
+ }
+
+ // PosDup section
+ {
+ // [Modem12.PosDup]
+ // *PNP0500
+
+ // TODO: unimplemented
+ }
+ // TODO: UpdateInis, Uninstall, NoResDup, PosDup
+
+}
+
+
+//-------------- Load ------------------
+// Load (init), using information from the specified inf file and model entry.
+BOOL CInfDevice::Load
+(
+ const CInfFile *pInf,
+ const CInfManufacturerEntry *pManuE,
+ const CInfModelEntry *pModelE
+)
+{
+ BOOL fRet = FALSE;
+
+ mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginLoad
+
+ ASSERT
+ (
+ !m_pvInfSession
+ && !m_pInfFile
+ && !m_pManufacturerEntry
+ && !m_pModelEntry
+ && !m_pVersion
+ && !m_pSymManufacturerName
+ && !m_pSymDeviceName
+ && !m_pCopyFilesList
+ && !m_pAddRegList
+ );
+
+ if (!pInf || !pManuE || !pModelE) goto end;
+
+ // Keep a reference to the Inf file and manufacturer and model entry
+ m_pInfFile = pInf;
+ m_pModelEntry = pModelE;
+ m_pManufacturerEntry = pManuE;
+
+ // Open a session with the inf file.
+ m_pvInfSession = pInf->OpenSession ();
+
+ if (!m_pvInfSession)
+ {
+ printf("Error calling pInf->OpenSession()\n");
+ goto end;
+ }
+
+ // version
+ m_pVersion = pInf->GetVersion();
+
+ // manufacturer name
+ m_pSymManufacturerName = pManuE->GetName();
+
+ // model name
+ m_pSymDeviceName = pModelE->GetName();
+
+ // TODO: UpdateInis, Uninstall
+
+ if (
+ m_pvInfSession
+ && m_pInfFile
+ && m_pModelEntry
+ && m_pManufacturerEntry
+ && m_pVersion
+ && m_pSymManufacturerName
+ && m_pSymDeviceName
+ )
+ {
+ fRet = mfn_CreateAddRegList(pModelE);
+ fRet = fRet && mfn_CreateCopyFilesList(pModelE);
+ }
+
+ // Create signatures
+
+ // Version
+ m_dwSigVersion = m_pVersion->Checksum();
+
+ // Make and Model
+ m_dwSigManuAndModel = m_pSymManufacturerName->Checksum();
+ AddToChecksumDW(&m_dwSigManuAndModel, m_pSymDeviceName->Checksum());
+
+ // Control Flags
+ m_dwSigFlags = m_pModelEntry->GetControlFlags(ePLAT_ALL);
+ AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_ALL));
+ AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_ALPHA));
+ AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_PPC));
+ AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_MIPS));
+
+ // AddReg -- got created by mfn_CreateAddRegList
+
+ // Copy files -- got created by mfn_CreateCopyFilesList
+
+ // NoResDup and PosDup
+ {
+ const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection();
+ DWORD dwSigNoResDup=0;
+ DWORD dwSigPosDup=0;
+ const CInfList *pSymList = pInstall->GetNoResDupIDList();
+ while(pSymList)
+ {
+ const CInfSymbol *pSym = (const CInfSymbol *) pSymList->GetData();
+ // We use XOR to combine the checksum, because we don't care about
+ // order.
+ dwSigNoResDup ^= pSym->Checksum();
+ pSymList = pSymList->Next();
+ }
+
+ pSymList = pInstall->GetPosDupIDList();
+ while(pSymList)
+ {
+ const CInfSymbol *pSym = (const CInfSymbol *) pSymList->GetData();
+ // We use XOR to combine the checksum, because we don't care about
+ // order.
+ dwSigPosDup ^= pSym->Checksum();
+ pSymList = pSymList->Next();
+ }
+
+ // Combine, and this time we *are* sensitive to the order.
+ m_dwSigDup = dwSigNoResDup;
+ AddToChecksumDW(&m_dwSigDup, dwSigPosDup);
+ }
+
+ // Rank0
+ m_dwSigRank0 = (m_pModelEntry->GetRank0ID())->Checksum();
+
+ // All ranks
+ m_dwSigRanks = m_dwSigRank0;
+ AddToChecksumDW(&m_dwSigRanks, (m_pModelEntry->GetRank1ID())->Checksum());
+ AddToChecksumDW(&m_dwSigRanks, (m_pModelEntry->GetRank2ID())->Checksum());
+
+ // Signature of everything.
+ m_dwSigAll = m_dwSigVersion;
+ AddToChecksumDW(&m_dwSigAll, m_dwSigManuAndModel);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigFlags);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigAddReg);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigCopyFiles);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigDup);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigRanks);
+
+end:
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ mfn_LeaveCrit();
+
+ return fRet;
+}
+
+//-------------- Unload ------------------
+// Unloads a previously loaded file.
+HANDLE CInfDevice::Unload (void)
+{
+ HANDLE hUnload = NULL;
+
+ mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginUnload to try to put us in unloadable state.
+
+ mfn_Cleanup();
+
+ mfn_LeaveCrit();
+
+ return hUnload;
+}
+
+//-------------- WriteInf ------------------
+// Creates an inf file with all the information of this device.
+BOOL CInfDevice::WriteInf(LPCTSTR lpctszIniFile) const
+{
+ // String-related constants
+ LPCTSTR lpctszStrings = TEXT("Strings");
+
+ BOOL fRet = FALSE;
+ const CInfSymbol * pSym=NULL;
+
+ printf(TEXT("Writing inf [%s]\n"), lpctszIniFile);
+
+ // Create/truncate file, and write header comment
+ if (!mfn_write_header(lpctszIniFile)) goto end;
+
+end:
+ return fRet;
+}
+
+
+// Cleanup by freeing any allocated resources.
+void CInfDevice::mfn_Cleanup (void)
+{
+ mfn_EnterCrit();
+
+ // TODO: ASSERT(state == loading or state == unloading)
+
+ if (m_pAddRegList)
+ {
+ // Explicitly cast to non-const because we're deleting it.
+ CInfList::FreeList((CInfList *) m_pAddRegList);
+ }
+
+ if (m_pCopyFilesList)
+ {
+ // Explicitly cast to non-const because we're deleting it.
+ CInfList::FreeList((CInfList *) m_pCopyFilesList);
+ }
+
+ if (m_pvInfSession)
+ {
+ ASSERT(m_pInfFile);
+ m_pInfFile->CloseSession(m_pvInfSession);
+ }
+
+ m_pAddRegList = NULL;
+ m_pCopyFilesList = NULL;
+ m_pvInfSession = NULL;
+ m_pInfFile = NULL;
+ m_pModelEntry = NULL;
+ m_pManufacturerEntry = NULL;
+ m_pVersion = NULL;
+ m_pSymManufacturerName = NULL;
+ m_pSymDeviceName = NULL;
+
+ m_dwSigVersion = 0;
+ m_dwSigManuAndModel = 0;
+ m_dwSigFlags = 0;
+ m_dwSigAddReg = 0;
+ m_dwSigCopyFiles = 0;
+ m_dwSigRank0 = 0;
+ m_dwSigRanks = 0;
+
+
+ mfn_LeaveCrit();
+}
+
+
+// Initializes m_pAddRegList to list of addreg entries.
+BOOL CInfDevice::mfn_CreateAddRegList(const CInfModelEntry *pModelE)
+{
+ const CInfInstallSection * pInstall = pModelE->GetInstallSection();
+ const CInfList * pAddRegList = pInstall->GetAddRegSectionList();
+
+ ASSERT(!m_pAddRegList);
+
+ // Initialize this here -- it is modified by mfn_AddToAddRegList.
+ m_dwSigAddReg = 0;
+
+ // Walk AddReg list, adding each entry for each addreg section.
+ for (;pAddRegList; pAddRegList=pAddRegList->Next())
+ {
+ const CInfAddRegSection * pAddRegSection =
+ (const CInfAddRegSection *) pAddRegList->GetData();
+
+ ASSERT(pAddRegSection);
+
+ // Add all the entries in the section, overwriting previous entries
+ // with the same subkey/value-name.
+ const CInfAddRegEntry * pAddRegEntry =
+ pAddRegSection->GetFirstAddRegEntry ();
+ for(;pAddRegEntry; pAddRegEntry = pAddRegEntry->Next())
+ {
+ mfn_AddToAddRegList(pAddRegEntry);
+ }
+ }
+
+ return TRUE;
+}
+
+void CInfDevice::mfn_AddToAddRegList (const CInfAddRegEntry *pAddRegEntry)
+{
+ // TODO: need to overwrite or not, depending on the addreg flags.
+ // for now, simply add to front of list.
+ m_pAddRegList = new CInfList ((void *) pAddRegEntry, m_pAddRegList);
+ AddToChecksumDW(&m_dwSigAddReg, pAddRegEntry->Checksum());
+}
+
+BOOL CInfDevice::mfn_CreateCopyFilesList(const CInfModelEntry *pModelE)
+{
+
+ const CInfInstallSection * pInstall = pModelE->GetInstallSection();
+ const CInfList * pCopyFilesList = pInstall->GetCopyFilesSectionList();
+
+ ASSERT(!m_pCopyFilesList);
+
+ // Initialize this here -- it is modified by mfn_AddToCopyFilesList.
+ m_dwSigCopyFiles = 0;
+
+ // Walk CopyFiles list, adding each entry for each copyfile section.
+ for (;pCopyFilesList; pCopyFilesList=pCopyFilesList->Next())
+ {
+ const CInfCopyFilesSection * pCopyFilesSection =
+ (const CInfCopyFilesSection *) pCopyFilesList->GetData();
+
+ ASSERT(pCopyFilesSection);
+
+ // Add all the entries in the section, overwriting previous entries
+ // with the name and destination.
+ const CInfCopyFilesEntry * pCopyFilesEntry =
+ pCopyFilesSection->GetFirstCopyFilesEntry();
+ for(;pCopyFilesEntry; pCopyFilesEntry = pCopyFilesEntry->Next())
+ {
+ mfn_AddToCopyFilesList(pCopyFilesEntry);
+ }
+ }
+
+ return TRUE;
+}
+
+void CInfDevice::mfn_AddToCopyFilesList (
+ const CInfCopyFilesEntry *pCopyFilesEntry
+ )
+{
+ // TODO: need to overwrite or not, depending on the addreg flags.
+ // for now, simply add to front of list.
+ m_pCopyFilesList = new CInfList (
+ (void *) pCopyFilesEntry,
+ m_pCopyFilesList
+ );
+ AddToChecksumDW(&m_dwSigCopyFiles, pCopyFilesEntry->Checksum());
+}
+
+
+
+// Create/Truncate inf file for just this device, and write header.
+BOOL CInfDevice::mfn_write_header (
+ LPCTSTR lpctszIniFile
+ )
+const
+{
+ LPCTSTR lpctszOrigFile = TEXT("");
+ LPCTSTR lpctszManuS = TEXT("");
+ LPCTSTR lpctszManuName = TEXT("");
+ LPCTSTR lpctszModelLHS = TEXT("");
+ LPCTSTR lpctszModelName = TEXT("");
+ LPCTSTR lpctszRank0 = TEXT("");
+ LPCTSTR lpctszRank1 = TEXT("");
+ LPCTSTR lpctszRank2 = TEXT("");
+ LPCTSTR lpctszProviderName = TEXT("");
+
+ BOOL fRet = FALSE;
+ const CInfSymbol * pSym=NULL;
+
+ TCHAR rgchBuf[4098];
+ HANDLE hFile=NULL;
+
+ SYSTEMTIME st;
+ UINT u = 0;
+ GetLocalTime(&st);
+
+ // Open file
+ {
+ TCHAR rgchPathName[MAX_PATH];
+ const TCHAR tchBack = (TCHAR) '\\';
+ const TCHAR tchColon = (TCHAR) ':';
+ const uLen = lstrlen(lpctszIniFile);
+
+ if (!uLen || (uLen+2) > sizeof(rgchPathName)/sizeof(TCHAR)) goto end;
+
+ rgchPathName[0] = 0;
+
+ u=0;
+ // Append %windir% if file name is not of the form
+ // "\.*" or "?:.*"
+ #if 0 // Don't do this anymore.
+ if ( (lpctszIniFile[0] != tchBack)
+ && (uLen<2 || lpctszIniFile[1]!=tchColon))
+ {
+ const UINT uMax = sizeof(rgchPathName)/sizeof(TCHAR) - uLen - 2;
+ u = GetWindowsDirectory
+ (
+ rgchPathName,
+ uMax
+ );
+
+ if (!u || u >= uMax) goto end;
+ lstrcpy(rgchPathName+u, TEXT("\\"));
+ u++;
+ }
+ #endif // 0
+
+ ASSERT((u+uLen+1)<(sizeof(rgchPathName)/sizeof(TCHAR)));
+ lstrcpy(rgchPathName+u, lpctszIniFile);
+ printf("Ini Path Name = [%s]\n", rgchPathName);
+
+
+ // Open file, nuke it if it exists.
+ hFile = CreateFile
+ (
+ rgchPathName,
+ GENERIC_WRITE,
+ 0, // deny sharing
+ NULL,
+ CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL
+ );
+
+ if (hFile==INVALID_HANDLE_VALUE)
+ {
+ printf("Create file fails with error %08lu\n", GetLastError());
+ hFile = NULL;
+ goto end;
+ }
+ else
+ {
+ printf("File opened\n");
+ }
+ }
+
+ // write header.
+ {
+ //;
+ //; OUT.INF
+ //;
+ //; Inf generated for a single modem.
+ //;
+ //; Created: Fri 05-24-1996 12:13:42
+ //; Checksum: 12507659
+ //; Original Inf: mdmgen.inf/[Rockwell]/%Rockwell1%
+ //; Manufacturer: "Rockwell"
+ //; Model: "14400 bps PCMCIA Data-Fax Modem"
+ //; Rank0ID: GEN_Apex1
+ //; Rank1ID: PCMCIA\RIPICAA-RC144ACL-845A
+ //; Rank2ID: PCMCIA\RIPICAA-YYY-ZZZ
+ //;
+ //; Rank0 Version M&M Flags AddReg CopyFile Ranks
+ //; SIG= 12342412 12222233 12334444 12234444 12244444 53265123 52366664
+ //;
+
+ const CInfSymbol *pSym = NULL;
+
+ // File name
+ pSym = m_pInfFile->GetFileName();
+ lpctszOrigFile = pSym->GetText();
+
+ // Manufacturer section name
+ {
+ const CInfManufacturerSection * pManuS =
+ m_pManufacturerEntry->GetManufacturerSection();
+ if (pManuS)
+ {
+ pSym = pManuS->GetSectionName();
+ lpctszManuS = pSym->GetText();
+ }
+ }
+
+ // Model entry name (LHS)
+ pSym = m_pModelEntry->GetLHS();
+ lpctszModelLHS = pSym->GetText();
+
+ // Manufacturer name
+ pSym = m_pSymManufacturerName;
+ lpctszManuName = pSym->GetText();
+
+ // Model name
+ pSym = m_pSymDeviceName;
+ lpctszModelName = pSym->GetText();
+
+ // Rank 0
+ pSym = m_pModelEntry->GetRank0ID();
+ lpctszRank0 = pSym->GetText();
+
+
+ // Rank 1
+ pSym = m_pModelEntry->GetRank1ID();
+ lpctszRank1 = pSym->GetText();
+
+ // Rank 1
+ pSym = m_pModelEntry->GetRank1ID();
+ lpctszRank1 = pSym->GetText();
+
+ u = wsprintf
+ (
+ rgchBuf,
+ TEXT
+ (
+ ";\r\n"
+ "; OUT.INF\r\n"
+ ";\r\n"
+ "; Inf generated for a single modem.\r\n"
+ ";\r\n"
+ "; Created: %02u-%02u-%04u %02u:%02u:%02u\r\n"
+ "; Checksum: %08lx\r\n"
+ ),
+ st.wMonth,
+ st.wDay,
+ st.wYear,
+ st.wHour,
+ st.wMinute,
+ st.wSecond,
+ m_dwSigAll
+ );
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "; Original Inf: %s/[%s]/%s\r\n"
+ "; Manufacturer: \"%s\"\r\n"
+ "; Model: \"%s\"\r\n"
+ "; Rank0ID: %s\r\n"
+ "; Rank1ID: %s\r\n"
+ "; Rank2ID: %s\r\n"
+ ),
+ lpctszOrigFile, // original inf file
+ lpctszManuS, // manufacturer section
+ lpctszModelLHS, // model entry name
+ lpctszManuName, // manufacturer name
+ lpctszModelName,// model name
+ lpctszRank0, // Rank0 ID
+ lpctszRank1, // Rank1 ID
+ lpctszRank2 // Rank2 ID
+ );
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ ";\r\n"
+"; Rank0 Version M&M Flags AddReg CopyFile Dup Ranks\r\n"
+ "; SIG= %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\r\n"
+ ";\r\n"
+ ),
+ m_dwSigRank0,
+ m_dwSigVersion,
+ m_dwSigManuAndModel,
+ m_dwSigFlags,
+ m_dwSigAddReg,
+ m_dwSigCopyFiles,
+ m_dwSigDup, // NoResDup and PosDup
+ m_dwSigRanks
+ );
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+ } // end write header
+
+ // Write Version
+ {
+ // Sample:
+ //; ---------------------- VERSION ------------------------------
+ //[Version]
+ //LayoutFile=layout.inf
+ //Signature="$CHICAGO$"
+ //Class=Modem
+ //ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318}
+ //Provider=%provider%
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- VERSION ------------------------------\r\n"
+ "[Version]\r\n"
+ )
+ );
+
+ // LayoutFile
+ pSym = m_pVersion->GetLayoutFile();
+ if (pSym)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("LayoutFile=%s\r\n"),
+ pSym->GetText()
+ );
+ }
+
+ // Signature
+ pSym = m_pVersion->GetSignature();
+ if (pSym)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("Signature=%s\r\n"),
+ pSym->GetText()
+ );
+ }
+
+ // Class
+ pSym = m_pVersion->GetClass();
+ if (pSym)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("Class=%s\r\n"),
+ pSym->GetText()
+ );
+ }
+
+ // ClassGUID
+ pSym = m_pVersion->GetClassGUID();
+ if (pSym)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ClassGUID=%s\r\n"),
+ pSym->GetText()
+ );
+ }
+
+ // Provider
+ pSym = m_pVersion->GetProvider();
+ if (pSym)
+ {
+ lpctszProviderName = pSym->GetText();
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("Provider=%%provider%%\r\n")
+ );
+ }
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing version info
+
+
+ // Write Control flags section
+ // Sample:
+ // -------------------- CONTROLFLAGS ---------------------------
+ // [ControlFlags]
+ // ExcludeFromSelect=SERENUM\MNP0281
+ // ExcludeFromSelect.NT=LPTENUM\MICROCOMTRAVELPORTE_1FF4
+ {
+ DWORD dwFlagsAll;
+ DWORD dwFlagsNTAll;
+ DWORD dwFlagsNTAlpha;
+ DWORD dwFlagsNTPPC;
+ DWORD dwFlagsNTMips;
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT(
+ "\r\n"
+ "\r\n"
+ "; -------------------- CONTROLFLAGS ---------------------------\r\n"
+ "[ControlFlags]\r\n"
+ )
+ );
+
+ dwFlagsAll = m_pModelEntry->GetControlFlags(ePLAT_ALL);
+ dwFlagsNTAll = m_pModelEntry->GetControlFlags(ePLAT_NT_ALL);
+ dwFlagsNTAlpha = m_pModelEntry->GetControlFlags(ePLAT_NT_ALPHA);
+ dwFlagsNTPPC = m_pModelEntry->GetControlFlags(ePLAT_NT_PPC);
+ dwFlagsNTMips = m_pModelEntry->GetControlFlags(ePLAT_NT_MIPS);
+
+ if(dwFlagsAll & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ if(dwFlagsNTAll & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect.NT=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ if(dwFlagsNTAlpha & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect.NT.Alpha=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ if(dwFlagsNTPPC & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect.NT.PPC=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ if(dwFlagsNTMips & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect.NT.Mips=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ // TODO: unimplemented: Other control flags.
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing control flags section
+
+
+ // Write Manufacturer section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; -------------------- MANUFACTURER ---------------------------\r\n"
+ "[Manufacturer]\r\n"
+ "%%make%%= Make\r\n"
+ )
+ );
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing Manufacturer section
+
+
+ // Write make section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ----------------------- MAKE --------------------------------\r\n"
+ "[Make]\r\n"
+ "%%model%%= Model, %s"
+ ),
+ lpctszRank0
+ );
+ if (*lpctszRank1 || *lpctszRank2)
+ {
+ u+= wsprintf (rgchBuf+u, ", %s", lpctszRank1);
+ }
+ if (*lpctszRank2)
+ {
+ u+= wsprintf (rgchBuf+u, ", %s", lpctszRank2);
+ }
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing make section
+
+ // Write Model section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "\r\n"
+ "; ----------------------- MODEL -------------------------------\r\n"
+ "[Model]\r\n"
+ "AddReg=AddReg\r\n"
+ "CopyFiles=CopyFiles\r\n"
+ )
+ );
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing Model section
+
+
+ // NoResDup section
+ {
+ // [Make.NoResDup]
+ // UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15
+ const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection();
+ const CInfList *pSymList = pInstall->GetNoResDupIDList();
+ const CInfSymbol *pSym = NULL;
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- NORESDUP -----------------------------\r\n"
+ "[Model.NoResDup]\r\n"
+ )
+ );
+
+ while(pSymList)
+ {
+ if (pSym) { u+= wsprintf (rgchBuf+u, TEXT(",")); }
+ pSym = (const CInfSymbol *) pSymList->GetData();
+ u+= wsprintf (rgchBuf+u, TEXT("%s"), pSym->GetText());
+
+ pSymList = pSymList->Next();
+ }
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ }
+
+
+ // PosDup section
+ {
+ // [Make.PosDup]
+ // *PNP0500
+ const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection();
+ const CInfList *pSymList = pInstall->GetPosDupIDList();
+ const CInfSymbol *pSym = NULL;
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- POSDUP -------------------------------\r\n"
+ "[Model.PosDup]\r\n"
+ )
+ );
+
+ while(pSymList)
+ {
+ if (pSym) { u+= wsprintf (rgchBuf+u, TEXT(",")); }
+ pSym = (const CInfSymbol *) pSymList->GetData();
+ u+= wsprintf (rgchBuf+u, TEXT("%s"), pSym->GetText());
+
+ pSymList = pSymList->Next();
+ }
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+ }
+
+
+ // Write CopyFiles section
+ // BUGBUG: we need the concept of muliple copy-file sections, because
+ // each section can have a different destination dir.
+ // Also: the CopyFiles.NT, etc sections.
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; --------------------- COPYFILES -----------------------------\r\n"
+ "[CopyFiles]\r\n"
+ )
+ );
+
+ // Now write each copyfile entry
+ {
+ const CInfList *pList = m_pCopyFilesList;
+
+ for (;pList; pList=pList->Next())
+ {
+ // TODO: unimplemented
+ }
+
+ }
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+
+ } // End writing CopyFiles section
+
+
+ // Write DestinationDirs section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ------------------- DESTINATIONDIRS -------------------------\r\n"
+ "[DestinationDirs]\r\n"
+ )
+ );
+
+ // Now write each copyfile entry
+ // TODO: Need to construct destination-dirs entries
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+
+ } // End writing DestinationDirs section
+
+
+ // TODO: UpdateInis, Uninstall
+
+
+ // Write Addreg section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- ADDREG -------------------------------\r\n"
+ "[AddReg]\r\n"
+ )
+ );
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+
+ // Now write each addreg entry
+ {
+ const CInfList *pList = m_pAddRegList;
+
+ for (;pList; pList=pList->Next())
+ {
+ LPCTSTR lpctszRegRoot = TEXT("");
+ LPCTSTR lpctszSubKey = TEXT("");
+ LPCTSTR lpctszValueName = TEXT("");
+ TCHAR rgchFlag[20] = TEXT("");
+ LPCTSTR lpctszValue = TEXT("");
+ DWORD dwFlag = MAXDWORD;
+ const CInfSymbol *pSym = NULL;
+ const CInfAddRegEntry * pARE =
+ (const CInfAddRegEntry *) pList->GetData();
+ ASSERT(pARE);
+
+ pSym = pARE->GetRegRoot();
+ lpctszRegRoot = pSym->GetText();
+
+ pSym = pARE->GetSubKey();
+ lpctszSubKey = pSym->GetText();
+
+ pSym = pARE->GetValueName();
+ lpctszValueName = pSym->GetText();
+
+ dwFlag = pARE->GetFlag();
+ if (dwFlag!=MAXDWORD)
+ {
+ wsprintf(rgchFlag, TEXT("%lu"), dwFlag);
+ }
+
+ pSym = pARE->GetValue();
+ lpctszValue = pSym->GetText();
+
+//HKR, Settings, Prefix,, "AT"
+//HKR, Responses, "AUTOSTREAM: LEVEL 3", 1, 01, 00, 00,00,00,00, 00,00,00,00
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "%s, %s, %s, %s, %s\r\n"
+ ),
+ lpctszRegRoot,
+ lpctszSubKey,
+ lpctszValueName,
+ rgchFlag,
+ lpctszValue
+ );
+ }
+
+ }
+ } // End writing addreg section
+
+
+ // Write Strings section
+ {
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- STRINGS ------------------------------\r\n"
+ "[Strings]\r\n"
+ "provider=\"%s\"\r\n"
+ "make=\"%s\"\r\n"
+ "model=\"%s\"\r\n"
+ ),
+ lpctszProviderName,
+ lpctszManuName,
+ lpctszModelName
+ );
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End Strings flags section
+
+ DWORD dwWr;
+ if (!WriteFile(hFile, (LPBYTE) rgchBuf, u*sizeof(TCHAR), &dwWr, NULL))
+ {
+ printf("Write file fails with error %08lu\n", GetLastError());
+ goto end;
+ }
+ else
+ {
+ printf("Write file succeeded\n");
+ }
+
+ fRet = TRUE;
+
+end:
+ if (hFile) CloseHandle(hFile);
+
+ return fRet;
+}
diff --git a/private/unimodem/new/mic/dev.h b/private/unimodem/new/mic/dev.h
new file mode 100644
index 000000000..695571f35
--- /dev/null
+++ b/private/unimodem/new/mic/dev.h
@@ -0,0 +1,136 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// DEV.H -- Header for Classes:
+// CInfDevice
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+
+
+class CInfDevice;
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfDevice
+///////////////////////////////////////////////////////////////////////////
+//
+// Represents a single device, as specified by an inf (device information)
+// file.
+//
+
+class CInfDevice
+{
+
+public:
+
+ CInfDevice(const CInfDevice *pNext)
+ : m_pNext(pNext),
+ m_sync(),
+
+ m_pvInfSession(NULL),
+ m_pInfFile(NULL),
+ m_pManufacturerEntry(NULL),
+ m_pModelEntry(NULL),
+ m_pVersion(NULL),
+ m_pSymManufacturerName(NULL),
+ m_pSymDeviceName(NULL),
+ m_pAddRegList(NULL),
+ m_pCopyFilesList(NULL),
+
+ m_dwSigVersion(101),
+ m_dwSigManuAndModel(102),
+ m_dwSigFlags(103),
+ m_dwSigAddReg(104),
+ m_dwSigCopyFiles(105),
+ m_dwSigDup(106),
+ m_dwSigRank0(107),
+ m_dwSigRanks(108),
+ m_dwSigAll(109)
+ {}
+
+ ~CInfDevice() {}
+
+ // --------------- Dump ---------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- Load ---------------
+ // Load (init) the device specifed by the inf file and model entry.
+ BOOL Load (
+ const CInfFile *pInf,
+ const CInfManufacturerEntry *pManuE,
+ const CInfModelEntry *pModelE
+ );
+
+ //-------------- Unload ------------------
+ // Unloads a previously loaded file. If there are open sessions to this
+ // object, Unload returns a handle which will be signalled when all
+ // sessions are closed. New sessions will not be allowed after this
+ // function returns. The call should free the handle.
+ HANDLE Unload (void);
+
+ //-------------- WriteInf ------------------
+ // Creates an inf file with all the information of this device.
+ BOOL WriteInf(LPCTSTR lpctszIniFile) const;
+
+ //-------------- GetRank0Checksum ----------
+ // Returns signature of the rank0 ID
+ DWORD Rank0Checksum(void) const {return m_dwSigRank0;}
+
+ //-------------- Checksum --------------
+ // Returns combined checksum for this device.
+ DWORD Checksum(void) const {return m_dwSigAll;}
+
+ #if (TODO)
+ UpdateInisSection
+ UninstallSection
+ NoResDupIDList
+ PosDupIDList
+ #endif // (TODO)
+
+
+private:
+
+ const CInfDevice * m_pNext;
+ CSync m_sync;
+
+ const void * m_pvInfSession;
+
+ const CInfFile * m_pInfFile;
+ const CInfManufacturerEntry *m_pManufacturerEntry;
+ const CInfModelEntry * m_pModelEntry;
+
+ const CInfVersionSection * m_pVersion;
+ const CInfSymbol * m_pSymManufacturerName;
+ const CInfSymbol * m_pSymDeviceName;
+
+ const CInfList * m_pAddRegList;
+ const CInfList * m_pCopyFilesList;
+
+ BOOL mfn_CreateAddRegList (const CInfModelEntry *);
+ BOOL mfn_CreateCopyFilesList (const CInfModelEntry *);
+ void mfn_AddToAddRegList (const CInfAddRegEntry *);
+ void mfn_AddToCopyFilesList (const CInfCopyFilesEntry *);
+ void mfn_Cleanup (void);
+ BOOL mfn_write_header (LPCTSTR lpctszIniFile) const;
+
+ void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
+ void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
+
+ DWORD m_dwSigVersion; // Checksum of version section
+ DWORD m_dwSigManuAndModel;// Checksum of manufacturer name & model name
+ DWORD m_dwSigFlags; // Group-checksum of control flags.
+ DWORD m_dwSigAddReg; // Group-checksum of add reg section
+ DWORD m_dwSigCopyFiles; // Group-checksum of copyfile section
+ DWORD m_dwSigDup; // Group-checksum of NoResDup and PosDup.
+ DWORD m_dwSigRank0; // Group-checksum of all ranks.
+ DWORD m_dwSigRanks; // Group-checksum of all ranks.
+ DWORD m_dwSigAll; // Checksum of all the info of this device
+ // including version, manufacturer-name &
+ // model-name
+};
diff --git a/private/unimodem/new/mic/globals.cpp b/private/unimodem/new/mic/globals.cpp
new file mode 100644
index 000000000..b25209b6d
--- /dev/null
+++ b/private/unimodem/new/mic/globals.cpp
@@ -0,0 +1,53 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// GLOBALS.CPP -- Defines global data:
+// CInfSymbolTable gSymtab;
+//
+// History:
+// 05/27/96 JosephJ Created
+//
+//
+#include "common.h"
+
+//----------------------- gSymtab -------------------------------
+// Global symbol table.
+CInfSymbolTable gSymtab;
+
+
+
+// --------------------- Global Property Symbols ----------------
+const CInfSymbol *g_pSymPropCopyFilesSection;
+const CInfSymbol *g_pSymPropManufacturerSection;
+const CInfSymbol *g_pSymPropAddRegSection;
+
+LPCTSTR lpctszPropCopyFilesSection = TEXT("InfCFS");
+LPCTSTR lpctszPropManufacturerSection = TEXT("InfMS");
+LPCTSTR lpctszPropAddRegSection = TEXT("InfARS");
+
+BOOL InitializePropertySymbols(void);
+
+
+BOOL InitGlobals(void)
+{
+ return InitializePropertySymbols();
+}
+
+
+BOOL InitializePropertySymbols(void)
+{
+ g_pSymPropCopyFilesSection = gSymtab.Lookup(
+ lpctszPropCopyFilesSection,
+ TRUE
+ );
+ g_pSymPropManufacturerSection = gSymtab.Lookup(
+ lpctszPropManufacturerSection,
+ TRUE
+ );
+ g_pSymPropAddRegSection = gSymtab.Lookup(lpctszPropAddRegSection, TRUE);
+
+ return g_pSymPropCopyFilesSection
+ && g_pSymPropManufacturerSection
+ && g_pSymPropAddRegSection;
+}
diff --git a/private/unimodem/new/mic/globals.h b/private/unimodem/new/mic/globals.h
new file mode 100644
index 000000000..b1bf94e22
--- /dev/null
+++ b/private/unimodem/new/mic/globals.h
@@ -0,0 +1,28 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// GLOBALS.H -- Declares global data:
+// CInfSymbolTable gSymtab;
+//
+// History:
+// 05/27/96 JosephJ Created
+//
+//
+
+//----------------------- gSymtab -------------------------------
+// Global symbol table.
+// This symbol table maintains a global pool of strings -- only one copy of
+// each unique string is maintained.
+extern CInfSymbolTable gSymtab;
+
+// --------------------- Global Property Symbols ----------------
+extern const CInfSymbol *g_pSymPropCopyFilesSection;
+extern const CInfSymbol *g_pSymPropManufacturerSection;
+extern const CInfSymbol *g_pSymPropAddRegSection;
+#define PROP_INFSECTION_MANUFACTURER g_pSymPropManufacturerSection
+#define PROP_INFSECTION_COPYFILES g_pSymPropCopyFilesSection
+#define PROP_INFSECTION_ADDREG g_pSymPropAddRegSection
+
+
+BOOL InitGlobals(void);
diff --git a/private/unimodem/new/mic/ilist.cpp b/private/unimodem/new/mic/ilist.cpp
new file mode 100644
index 000000000..64350a621
--- /dev/null
+++ b/private/unimodem/new/mic/ilist.cpp
@@ -0,0 +1,58 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// ILIST.CPP -- Implementation for Classes:
+// CInfList
+//
+//
+// History:
+// 05/27/96 JosephJ Created
+//
+//
+#include "common.h"
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfList
+///////////////////////////////////////////////////////////////////////////
+
+// Simple singly-linked list which can not be modified once it's been
+// created. Assumes creation and eventual deletion are protected by some
+// external critical section.
+//
+// Sample:
+// for (; pList; pList = pList->Next())
+// {
+// const CInfAddregSection *pAS = (CInfAddregSection *) pList->GetData();
+// }
+
+//-------------- FreeList ------------------
+// Distroys the list.
+void
+CInfList::FreeList (CInfList *pList)
+{
+ while(pList)
+ {
+ // Cast to get rid of the const declaration of pList->Next().
+ CInfList *pNext = (CInfList *) pList->Next();
+ delete pList;
+ pList = pNext;
+ }
+}
+
+//-------------- ReverseList ------------------
+// Reverses the specified list.
+void
+CInfList::ReverseList (const CInfList **ppList)
+{
+ CInfList *pList = (CInfList *) *ppList; // override const
+ const CInfList *pPrev = NULL;
+ while(pList)
+ {
+ const CInfList *pTmp = pList->Next();
+ pList->mfn_SetNext(pPrev);
+ pPrev = pList;
+ pList = (CInfList *) pTmp; // override const
+ }
+ *ppList = pPrev;
+}
diff --git a/private/unimodem/new/mic/ilist.h b/private/unimodem/new/mic/ilist.h
new file mode 100644
index 000000000..ee91756f5
--- /dev/null
+++ b/private/unimodem/new/mic/ilist.h
@@ -0,0 +1,66 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// ILIST.H -- Header for Classes:
+// CInfList
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+
+
+class CInfList;
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfList
+///////////////////////////////////////////////////////////////////////////
+
+// Simple singly-linked list which can not be modified once it's been
+// created. Assumes creation and eventual deletion are protected by some
+// external critical section.
+//
+// Sample:
+// for (; pList; pList = pList->Next())
+// {
+// const CInfAddregSection *pAS = (CInfAddregSection *) pList->GetData();
+// }
+
+class CInfList
+{
+
+public:
+
+ CInfList(void *pvData, const CInfList *pNext)
+ : m_pvData(pvData), m_pNext(pNext) {}
+ ~CInfList() {}
+
+ //-------------- GetData ------------------
+ const void * GetData (void) const {return m_pvData;}
+
+ //-------------- Next ------------------
+ const CInfList * Next (void) const {return m_pNext;}
+
+ //-------------- FreeList ------------------
+ // Distroys the specified list.
+ static void FreeList(CInfList *);
+
+ //-------------- ReverseList ------------------
+ // Reverses the specified list.
+ static void ReverseList(const CInfList **);
+
+private:
+
+ void mfn_SetNext(const CInfList * pNewNext)
+ {
+ m_pNext = pNewNext;
+ }
+
+ void * m_pvData;
+ const CInfList * m_pNext;
+
+};
+
diff --git a/private/unimodem/new/mic/inf.cpp b/private/unimodem/new/mic/inf.cpp
new file mode 100644
index 000000000..471530a1d
--- /dev/null
+++ b/private/unimodem/new/mic/inf.cpp
@@ -0,0 +1,903 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// INF.CPP -- Implemtation for Classes:
+// CInfFile
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+#include "common.h"
+#include "ini.h"
+#include "inf.h"
+
+// Version-related constants
+LPCTSTR lpctszVersion = TEXT("Version");
+LPCTSTR lpctszLayoutFile = TEXT("LayoutFile");
+LPCTSTR lpctszSignature = TEXT("Signature");
+LPCTSTR lpctszClass = TEXT("Class");
+LPCTSTR lpctszClassGUID = TEXT("ClassGUID");
+LPCTSTR lpctszProvider = TEXT("Provider");
+
+
+LPCTSTR lpctszManufacturer = TEXT("Manufacturer");
+LPCTSTR lpctszControlFlags = TEXT("ControlFlags");
+LPCTSTR lpctszStrings = TEXT("Strings");
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfFile
+///////////////////////////////////////////////////////////////////////////
+
+
+CInfFile::CInfFile(void)
+{
+ m_pVersion=NULL;
+ m_pFirstManuE=NULL;
+ m_pSymFileName=NULL;
+ m_pIniFile=NULL;
+}
+
+
+CInfFile::~CInfFile()
+{
+ mfn_EnterCrit();
+
+ // Free resources -- there should be none to free...
+ ASSERT(!m_pVersion);
+ ASSERT(!m_pFirstManuE);
+ ASSERT(!m_pIniFile);
+
+}
+
+
+//-------------- Load ------------------
+// Loads the specified file. (Obviously) only one file can be loaded at
+// a time.
+BOOL CInfFile::Load (const TCHAR rgchPathname[])
+{
+ BOOL fRet = FALSE;
+
+ mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginLoad
+
+ ASSERT(!m_pVersion);
+ ASSERT(!m_pFirstManuE);
+ ASSERT(!m_pIniFile);
+
+ // Save file name
+ m_pSymFileName = gSymtab.Lookup(rgchPathname, TRUE);
+ if (!m_pSymFileName) goto end;
+
+ // Create and Load Ini File
+ m_pIniFile = new CIniFile;
+ if (m_pIniFile)
+ {
+ if (!m_pIniFile->Load(rgchPathname))
+ {
+ delete m_pIniFile;
+ m_pIniFile=NULL;
+ }
+ }
+ if (!m_pIniFile) goto end;
+
+ // Create and Load version
+ {
+ CInfVersionSection *pVS = new CInfVersionSection;
+ if (pVS)
+ {
+ // Override const * declaration of m_pVersion
+ if (!pVS->Load(m_pIniFile))
+ {
+ delete pVS;
+ pVS=NULL;
+ }
+ }
+ m_pVersion = pVS;
+ }
+ if (!m_pVersion) goto end;
+
+ // Create and load Manufacturer list...
+ m_pFirstManuE = sfn_CreateManufacturerList(m_pIniFile);
+ if (!m_pFirstManuE) goto end;
+
+ fRet = TRUE;
+
+end:
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ mfn_LeaveCrit();
+
+ return fRet;
+}
+
+
+//-------------- Unload ------------------
+// Unloads a previously loaded file. If there are open sessions to this
+// object, Unload returns a handle which will be signalled when all
+// sessions are closed. New sessions will not be allowed after this
+// function returns. The call should free the handle.
+HANDLE CInfFile::Unload (void)
+{
+ HANDLE hUnload = NULL;
+
+ mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginUnload to try to put us in unloadable state.
+
+ mfn_Cleanup();
+
+ mfn_LeaveCrit();
+
+
+ return hUnload;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfVersionSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Version section:
+// [Version]
+// LayoutFile=layout.inf
+// Signature="$CHICAGO$"
+// Class=Modem
+// ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318}
+// Provider=%MS%
+
+
+//-------------- Load ------------------
+// TODO: unimplemented
+BOOL CInfVersionSection::Load (const CIniFile *pIniFile)
+{
+ BOOL fRet = FALSE;
+ const CIniFileSection *pISVer = pIniFile->LookupSection(lpctszVersion);
+ const CIniFileSection *pISStr = pIniFile->LookupSection(lpctszStrings);
+ const CIniFileEntry *pIE = NULL;
+
+#if 0
+ m_pSymLayoutFile = gSymtab.Lookup(TEXT("layout.inf"), TRUE);
+ m_pSymSignature = gSymtab.Lookup(TEXT("\"$CHICAGO$\""), TRUE);
+ m_pSymClass = gSymtab.Lookup(TEXT("Modem"), TRUE);
+ m_pSymClassGUID = gSymtab.Lookup
+ (
+ TEXT("{4D36E96D-E325-11CE-BFC1-08002BE10318}"),
+ TRUE
+ );
+ m_pSymProvider = gSymtab.Lookup(TEXT("Microsoft"), TRUE);
+
+ m_dwChecksum = 0x12345678L;
+#endif
+
+ ASSERT
+ (
+ !m_pSymLayoutFile
+ && !m_pSymSignature
+ && !m_pSymClass
+ && !m_pSymClassGUID
+ && !m_pSymProvider
+ && !m_dwChecksum
+ );
+
+ if (!pISVer || !pISStr) goto end;
+
+ // LayoutFile=layout.inf
+ pIE = pISVer->LookupEntry(lpctszLayoutFile);
+ if (pIE)
+ {
+ m_pSymLayoutFile = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ // TODO: further checks here
+ }
+
+ // Signature="$CHICAGO$"
+ pIE = pISVer->LookupEntry(lpctszSignature);
+ if (pIE)
+ {
+ m_pSymSignature = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ // TODO: further checks here
+ }
+
+ // Class=Modem
+ pIE = pISVer->LookupEntry(lpctszClass);
+ if (pIE)
+ {
+ m_pSymClass = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ // TODO: further checks here
+ }
+
+ // ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318}
+ pIE = pISVer->LookupEntry(lpctszClassGUID);
+ if (pIE)
+ {
+ m_pSymClassGUID = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ // TODO: further checks here
+ }
+
+ // Provider=%MS%
+ pIE = pISVer->LookupEntry(lpctszProvider);
+ if (pIE)
+ {
+ const CInfSymbol *pSymLHS = pIE->GetLHS();
+ pIE->Release();pIE=NULL;
+
+ if (pSymLHS)
+ {
+ pIE = pISStr->LookupEntry(pSymLHS->GetText());
+ if (pIE)
+ {
+ m_pSymProvider = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ }
+ }
+ // TODO: further checks here
+ }
+
+ // Compute checksum of entire version structure
+ m_dwChecksum = m_pSymLayoutFile->Checksum();
+ AddToChecksumDW(&m_dwChecksum, m_pSymSignature->Checksum());
+ AddToChecksumDW(&m_dwChecksum, m_pSymClass->Checksum());
+ AddToChecksumDW(&m_dwChecksum, m_pSymClassGUID->Checksum());
+ AddToChecksumDW(&m_dwChecksum, m_pSymProvider->Checksum());
+
+ fRet =TRUE;
+
+end:
+
+ if (pIE) { pIE->Release(); pIE=NULL; }
+ if (pISVer) { pISVer->Release(); pISVer=NULL; }
+ if (pISStr) { pISStr->Release(); pISStr=NULL; }
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ return fRet;
+}
+
+
+//-------------- Unload ------------------
+void CInfVersionSection::Unload (void)
+{
+ // TODO: call m_sync.BeginUnload to try to put us in unloadable state.
+
+ mfn_Cleanup();
+
+ return;
+}
+
+
+
+//-------------- Dump ------------------
+// Dump state
+void
+CInfVersionSection::Dump(void)
+const
+{
+}
+
+// Cleanup by freeing any allocated resources.
+void CInfVersionSection::mfn_Cleanup (void)
+{
+ m_pSymLayoutFile = NULL;
+ m_pSymSignature = NULL;
+ m_pSymClass = NULL;;
+ m_pSymClassGUID = NULL;
+ m_pSymProvider = NULL;
+ m_dwChecksum = 0;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfManufacturerEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Manufacturer list section:
+// [Manufacturer]
+// %Generic% = Generic
+// %MagicRam% = MagicRam
+// ..
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfManufacturerSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Manufacturer section:
+// [Generic]
+// %Gen% = Gen, MDMGEN
+// %Gen3% = Gen3, MDMGEN3
+// %Gen12% = Gen12, MDMGEN12
+// %Gen24% = Gen24, MDMGEN24
+// ...
+
+
+// --------------- GetFirstModelEntry --------------
+// Get first model entry
+const CInfModelEntry *
+CInfManufacturerSection::GetFirstModelEntry (void)
+const
+{
+ return m_pFirstModelE;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfInstallSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Install section:
+// [Modem29]
+// AddReg=All, MfgAddReg, ROCK_VOICE_ALL, ROCK_VOICE_SERWAVE, INTERNAL
+// CopyFiles = VV_Sys, VV_Sock_Sys, VV_App, VV_Help
+// UpdateInis = VView.Inis
+// Uninstall = VoiceView_remove
+//
+// Also contains info from the related PosDup and NoResDup sections.
+
+
+// --------------- GetAddRegSectionList ----------
+// Get generic list whose data items are pointers to
+// CInfAddRegSection objects
+const CInfList *
+CInfInstallSection::GetAddRegSectionList (void)
+const
+{
+ // TODO: unimplemented
+
+ static const CInfAddRegSection AddRegSection;
+ static const CInfList AddRegSectionList((void *) &AddRegSection, NULL);
+
+ return &AddRegSectionList;
+}
+
+
+// --------------- GetCopyFilesSectionList ----------
+// Get generic list whose data items are pointers to
+// CInfCopyFilesSection objects
+const CInfList *
+CInfInstallSection::GetCopyFilesSectionList (void)
+const
+{
+ // TODO: unimplemented
+
+ static const CInfCopyFilesSection CopyFilesSection;
+ static const CInfList CopyFilesSectionList((void *) &CopyFilesSection, NULL);
+
+ return &CopyFilesSectionList;
+}
+
+
+// --------------- GetNoResDupIDList ----------
+// Get generic list whose data items are pointers to
+// InfSymbol objects representing the Rank0 IDs in the corresponding
+// NoResDup section.
+const CInfList *
+CInfInstallSection::GetNoResDupIDList (void)
+const
+{
+ // TODO: unimplemented
+
+ static const CInfList NoResDupIDList
+ (
+ (void *) gSymtab.Lookup(TEXT("NORESDUP-ID"), TRUE),
+ NULL
+ );
+
+ return &NoResDupIDList;
+}
+
+
+// --------------- GetPosDupIDList ----------
+// Get generic list whose data items are pointers to
+// InfSymbol objects representing the Rank0 IDs in the corresponding
+// PosDup section.
+// const CInfList * GetPosDupIDList (void) const;
+const CInfList *
+CInfInstallSection::GetPosDupIDList (void)
+const
+{
+ // TODO: unimplemented
+ static const CInfList PosDupIDList1
+ (
+ (void *) gSymtab.Lookup(TEXT("POSDUP-ID1"), TRUE),
+ NULL
+ );
+ static const CInfList PosDupIDList
+ (
+ (void *) gSymtab.Lookup(TEXT("POSDUP-ID0"), TRUE),
+ &PosDupIDList1
+ );
+
+ return &PosDupIDList;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfAddRegSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample AddReg section:
+// [All]
+// HKR,,FriendlyDriver,,Unimodem.vxd
+// HKR,,DevLoader,,*vcomm
+// HKR,,ConfigDialog,,modemui.dll
+// HKR,,EnumPropPages,,"modemui.dll,EnumPropPages"
+// HKR,,PortSubClass,1,02
+// HKR, Init, 1,, "AT<cr>"
+// HKR, Responses, "<cr><lf>OK<cr><lf>", 1, 00, 00, 00,00,00,00, ...etc.
+// HKR, Responses, "<cr><lf>ERROR<cr><lf>", 1, 03, 00, 00,00,00, ...etc.
+
+
+// Get first addreg entry
+const CInfAddRegEntry *
+CInfAddRegSection::GetFirstAddRegEntry (void)
+const
+{
+ // TODO -- fake static entries
+ static const CInfAddRegEntry FirstAddRegEntry;
+ return &FirstAddRegEntry;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfCopyFilesSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample DestinationDirs section:
+// [DestinationDirs]
+// Register.Copy = 17 ;LDID_INF
+// VV_Sys = 11
+// VV_Sock_Sys = 11 ;LDID_SYS \Windows\system dir
+// VV_Sock_Win = 10 ;LDID_WIN \Windows dir
+// VV_App = 10
+// VV_Help = 18 ;LDID_HELP
+
+// Sample Copyfiles section:
+// [VV_Sys]
+// fte.dll
+// vvexe32.exe
+// wsvv.vxd
+
+
+// --------------- GetFirstCopyFilesEntry ----------
+// Get first copyfiles entry
+const CInfCopyFilesEntry *
+CInfCopyFilesSection::GetFirstCopyFilesEntry (void) const
+{
+ // TODO -- fake static entries
+ static const CInfCopyFilesEntry FirstCopyFilesEntry;
+ return &FirstCopyFilesEntry;
+}
+
+
+// Cleanup by freeing any allocated resources.
+// TODO: unimplemented
+void CInfFile::mfn_Cleanup (void)
+{
+ mfn_EnterCrit();
+
+ // TODO: ASSERT(state == loading or state == unloading)
+
+ // Unload and free version
+ if (m_pVersion)
+ {
+ // override const *
+ CInfVersionSection *pVS = (CInfVersionSection *) m_pVersion;
+ pVS->Unload();
+ delete pVS;
+ m_pVersion=NULL;
+ }
+
+
+ // Unload and free Manufacturerlist.
+ if (m_pFirstManuE)
+ {
+ sfn_DeleteManufacturerList(m_pFirstManuE);
+ m_pFirstManuE=NULL;
+ }
+
+ if (m_pIniFile)
+ {
+ m_pIniFile->Unload();
+ delete (CIniFile *) m_pIniFile; // override const *
+ m_pIniFile=NULL;
+ }
+
+ m_pSymFileName=NULL;
+
+ mfn_LeaveCrit();
+}
+
+// static helper function...
+const CInfManufacturerEntry *
+CInfFile::sfn_CreateManufacturerList (CIniFile *pIniFile)
+{
+ CInfManufacturerEntry * pManuE = NULL;
+ const CIniFileSection *pISStr = pIniFile->LookupSection(lpctszStrings);
+ const CIniFileSection *pISManL =
+ pIniFile->LookupSection(lpctszManufacturer);
+ CIniFileEntry *pIE = NULL;
+
+ if (!pISManL || !pISStr) goto end;
+
+ pIE = pISManL->GetFirstEntry();
+ if (!pIE) goto end;
+
+ // Iterate through manufacturers, building manufacturer entries...
+ do
+ {
+ pManuE = new CInfManufacturerEntry(pManuE);
+ if (!pManuE || !pManuE->Load(pIniFile, pISStr, pIE))
+ {
+ // TODO: warning; for now break out.
+ if (pManuE)
+ {
+ // TODO delete previously-created elements of the list as well!
+ // (Or leave them there and deal with a partial list).
+ delete pManuE;
+ pManuE = NULL;
+ }
+ goto end;
+ }
+
+ } while(pIE->BecomeNext());
+
+ // Reverse list
+ CInfManufacturerEntry::ReverseList(&pManuE);
+
+end:
+ if (pIE) {pIE->Release(); pIE=NULL;}
+ if (pISManL) { pISManL->Release(); pISManL=NULL; }
+ if (pISStr) { pISStr->Release(); pISStr=NULL; }
+
+ return pManuE;
+}
+
+// Static helper function
+void
+CInfFile::sfn_DeleteManufacturerList
+(
+ const CInfManufacturerEntry * pManuEFirst
+)
+{
+ // TODO
+}
+
+// --------------- Load ------------------
+BOOL
+CInfManufacturerEntry::Load
+(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileEntry *pIE
+)
+{
+ BOOL fRet = FALSE;
+ const CInfSymbol *pSymLHS = pIE->GetLHS();
+ const CInfSymbol *pSymManuName = NULL;
+ // TODO need to make manu-section case insensitive!
+ // Basically pSymManuSection should be created based on an upper-case'd
+ // version of pIE->GetRHS().
+ const CInfSymbol *pSymManuSection = pIE->GetRHS();
+ CInfManufacturerSection *pManuS = NULL;
+ BOOL fNew=FALSE;
+
+ ASSERT(!m_pManuS);
+ ASSERT(!m_pSymManuName);
+
+ // Get manufacturer name ...
+ if (pSymLHS)
+ {
+ const CIniFileEntry *pIEStr = pISStr->LookupEntry(pSymLHS->GetText());
+ if (pIEStr)
+ {
+ pSymManuName = pIE->GetRHS();
+ pIEStr->Release();pIEStr=NULL;
+ }
+ }
+
+ pManuS=NULL;
+
+ // Look up/create manufacturer section
+ {
+ void **ppv=NULL;
+ BOOL fExists=FALSE;
+ BOOL fRet = pSymManuSection->GetOrCreatePropLoc(
+ PROP_INFSECTION_MANUFACTURER,
+ &ppv,
+ &fExists);
+ if (fRet)
+ {
+ if (fExists)
+ {
+ // This section already exists...
+ pManuS = (CInfManufacturerSection *) *ppv;
+ ASSERT(pManuS->Validate());
+ }
+ else
+ {
+ // This section doesn't exist -- create it.
+ pManuS = new CInfManufacturerSection();
+ if (pManuS)
+ {
+ if (pManuS->Load(pIniFile, pISStr, pSymManuSection))
+ {
+ // set the property data
+ *ppv = (void *) pManuS;
+ }
+ else
+ {
+ delete pManuS;
+ pManuS=NULL;
+ pSymManuSection->DelProp(PROP_INFSECTION_MANUFACTURER);
+ }
+ }
+ }
+ }
+ }
+
+ if (pManuS)
+ {
+ m_pManuS = pManuS;
+ m_pSymManuName = pSymManuName;
+ fRet = TRUE;
+ }
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ return fRet;
+
+}
+
+// --------------- Unload ------------------
+void CInfManufacturerEntry::Unload(void)
+// TODO
+{
+ m_pManuS = NULL;
+ m_pSymManuName = NULL;
+ // TODO: decrement ref count for the section and delete it and delprop
+ // it when done.
+ mfn_Cleanup();
+
+}
+
+
+// --------------- Cleanup ------------------
+// Cleanup by freeing any allocated resources.
+void CInfManufacturerEntry::mfn_Cleanup (void)
+{
+ m_pManuS = NULL;
+ m_pSymManuName = NULL;
+}
+
+
+// --------------- Load ------------------
+BOOL
+CInfManufacturerSection::Load
+(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CInfSymbol *pSymManuSection
+)
+{
+ BOOL fRet = FALSE;
+ const CIniFileSection *pIS =
+ pIniFile->LookupSection(pSymManuSection->GetText());
+
+ ASSERT(!m_pSymSectionName);
+ ASSERT(!m_pFirstModelE);
+ ASSERT(m_eObjSig==eOBJSIG_CInfManufacturerSection);
+
+ if (!pIS)
+ {
+ goto end;
+ }
+
+ m_pSymSectionName = pSymManuSection;
+
+ // Create and load model list
+ m_pFirstModelE = sfn_CreateModelList(pIniFile, pISStr, pIS);
+
+ if (!m_pFirstModelE)
+ {
+ goto end;
+ }
+
+ fRet = TRUE;
+
+end:
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ return fRet;
+}
+
+// --------------- Unload ------------------
+void CInfManufacturerSection::Unload(void)
+{
+ mfn_Cleanup();
+}
+
+
+// --------------- Cleanup ------------------
+// Cleanup by freeing any allocated resources.
+void CInfManufacturerSection::mfn_Cleanup (void)
+// TODO
+{
+ m_pSymSectionName = NULL;
+ m_pFirstModelE = NULL;
+}
+
+
+// Static helper function to create the list of models for this manufacturer
+const CInfModelEntry *
+CInfManufacturerSection::sfn_CreateModelList
+(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileSection *pISManuS
+)
+{
+ CInfModelEntry * pModelE = NULL;
+ CIniFileEntry *pIE = NULL;
+
+ if (!pISManuS || !pISStr) goto end;
+
+ pIE = pISManuS->GetFirstEntry();
+ if (!pIE) goto end;
+
+ // Iterate through models, building model entries...
+ do
+ {
+ pModelE = new CInfModelEntry(pModelE);
+ if (!pModelE || !pModelE->Load(pIniFile, pISStr, pIE))
+ {
+ // TODO: warning; for now break out.
+ if (pModelE)
+ {
+ // TODO delete previously-created elements of the list as well!
+ // (Or leave them there and deal with a partial list).
+ delete pModelE;
+ pModelE = NULL;
+ }
+ goto end;
+ }
+
+ } while(pIE->BecomeNext());
+
+ // Reverse list
+ CInfModelEntry::ReverseList(&pModelE);
+
+end:
+ if (pIE) {pIE->Release(); pIE=NULL;}
+ //if (pISManL) { pISManL->Release(); pISManL=NULL; }
+ //if (pISStr) { pISStr->Release(); pISStr=NULL; }
+
+ return pModelE;
+}
+
+
+// --------------- Cleanup ------------------
+// Cleanup by freeing any allocated resources.
+void CInfModelEntry::mfn_Cleanup (void)
+// TODO
+{
+}
+
+
+// --------------- Load ------------------
+BOOL
+CInfModelEntry::Load
+(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileEntry *pIE
+)
+// TODO
+{
+ return TRUE;
+#if 0
+ BOOL fRet = FALSE;
+ const CInfSymbol *pSymLHS = pIE->GetLHS();
+ const CInfSymbol *pSymManuName = NULL;
+ // TODO need to make manu-section case insensitive!
+ // Basically pSymManuSection should be created based on an upper-case'd
+ // version of pIE->GetRHS().
+ const CInfSymbol *pSymManuSection = pIE->GetRHS();
+ CInfManufacturerSection *pManuS = NULL;
+ BOOL fNew=FALSE;
+
+ ASSERT(!m_pManuS);
+ ASSERT(!m_pSymManuName);
+
+ // Get manufacturer name ...
+ if (pSymLHS)
+ {
+ const CIniFileEntry *pIEStr = pISStr->LookupEntry(pSymLHS->GetText());
+ if (pIEStr)
+ {
+ pSymManuName = pIE->GetRHS();
+ pIEStr->Release();pIEStr=NULL;
+ }
+ }
+
+ pManuS=NULL;
+
+ // Look up/create manufacturer section
+ {
+ void **ppv=NULL;
+ BOOL fExists=FALSE;
+ BOOL fRet = pSymManuSection->GetOrCreatePropLoc(
+ PROP_INFSECTION_MANUFACTURER,
+ &ppv,
+ &fExists);
+ if (fRet)
+ {
+ if (fExists)
+ {
+ // This section already exists...
+ pManuS = (CInfManufacturerSection *) *ppv;
+ ASSERT(pManuS->Validate());
+ }
+ else
+ {
+ // This section doesn't exist -- create it.
+ pManuS = new CInfManufacturerSection();
+ if (pManuS)
+ {
+ if (pManuS->Load(pIniFile, pISStr, pSymManuSection))
+ {
+ // set the property data
+ *ppv = (void *) pManuS;
+ }
+ else
+ {
+ delete pManuS;
+ pManuS=NULL;
+ pSymManuSection->DelProp(PROP_INFSECTION_MANUFACTURER);
+ }
+ }
+ }
+ }
+ }
+
+ if (pManuS)
+ {
+ m_pManuS = pManuS;
+ m_pSymManuName = pSymManuName;
+ fRet = TRUE;
+ }
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ return fRet;
+#endif
+
+}
+
+// --------------- Unload ------------------
+void CInfModelEntry::Unload(void)
+// TODO
+{
+ mfn_Cleanup();
+}
diff --git a/private/unimodem/new/mic/inf.h b/private/unimodem/new/mic/inf.h
new file mode 100644
index 000000000..32e1ae85a
--- /dev/null
+++ b/private/unimodem/new/mic/inf.h
@@ -0,0 +1,998 @@
+// // Copyright (c) 1996 Microsoft Corporation
+//
+//
+// INF.H -- Header for Classes:
+//
+// CInfFile
+//
+// CInfVersionSection
+// CInfManufacturerSection
+// CInfInstallSection
+// CInfAddRegSection
+// CInfCopyFilesSection
+//
+// CInfManufacturerEntry
+// CInfModelEntry
+// CInfCopyFilesEntry
+// CInfAddRegEntry
+//
+// CInfModelEntryAux
+//
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+
+
+class CInfVersionSection;
+class CInfManufacturerEntry;
+class CInfManufacturerSection;
+class CInfModelEntry;
+class CInfInstallSection;
+class CInfAddRegSection;
+class CInfAddRegEntry;
+class CInfCopyFilesEntry;
+class CInfCopyFilesSection;
+class CInfModelEntryAux;
+
+
+// Control flags
+const DWORD dwCF_EXCLUDE_FROM_SELECT = 0x1<<0;
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfFile
+///////////////////////////////////////////////////////////////////////////
+
+// Represents an inf (device information) file -- which is a special kind
+// of INI file.
+
+
+class CInfFile
+{
+
+public:
+
+ CInfFile(void);
+ ~CInfFile();
+
+ //-------------- Load ------------------
+ // Loads the specified file. (Obviously) only one file can be loaded at
+ // a time.
+ BOOL Load (const TCHAR rgchPathname[]);
+
+ //-------------- Unload ------------------
+ // Unloads a previously loaded file. If there are open sessions to this
+ // object, Unload returns a handle which will be signalled when all
+ // sessions are closed. New sessions will not be allowed after this
+ // function returns. The call should free the handle.
+ // See CloseSession for more info.
+ HANDLE Unload (void);
+
+ //-------------- OpenSession ------------------
+ // Open a session to this object. The object will not be unloaded until
+ // this session is closed. 0 indicates failure.
+ // TODO: unimplemented
+ const void * OpenSession (void) const {return (const void *) 1;}
+
+ //-------------- CloseSession ------------------
+ // Close the specified session to this object.
+ // If the reference count goes to zero and we're marked for unloading,
+ // the object is unloaded as well.
+ // TODO: unimplemented
+ void CloseSession (const void *) const {}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetFileName ------------------
+ // Get Version info
+ const CInfSymbol * GetFileName(void) const
+ {
+ return m_pSymFileName;
+ }
+
+ // --------------- GetVersion ------------------
+ // Get Version info
+ const CInfVersionSection * GetVersion(void) const
+ {
+ return m_pVersion;
+ }
+
+ // --------------- GetFirstManufacturerEntry ------
+ // Get first manufacturer entry under the manufacturer section
+ const CInfManufacturerEntry * GetFirstManufacturerEntry(void) const
+ {
+ return m_pFirstManuE;
+ }
+
+ #if (TODO)
+ // --------------- GetFirstStringEntry --------------
+ // Get first string entry under the strings section
+ const CInfStringEntry * GetFirstStringEntry(void) const;
+ DestinationDirs
+
+ // --------------- LookupManufacturerSection ----------
+ // Lookup and return the manufacturer section with the specified name.
+ const CInfManufacturerSection *
+ LookupInstallSection(const CInfSymbol *pSymManSection)
+ const;
+
+ // --------------- LookupInstallSection ----------
+ // Lookup and return the install section with the specified name.
+ const CInfInstallSection * LookupInstallSection(const TCHAR pchName[])const;
+
+ // --------------- LookupAddRegSection --------------
+ // Lookup and return the addreg section with the specifed name.
+ const CInfAddRegSection * LookupAddRegSection(const TCHAR pchName[]) const;
+
+ // --------------- LookupString --------------
+ // Lookup and return the specified string
+ const CInfSymbol * LookupString(const TCHAR pchName[]) const;
+#endif // TODO
+
+
+private:
+
+ // ============= PRIVATE MEMBER FUNCTIONS ===============
+ void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
+ void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
+ void mfn_Cleanup(void);
+
+ // ============= PRIVATE STATIC HELPER FUNCTIONS ========
+
+ static
+ const CInfManufacturerEntry *
+ sfn_CreateManufacturerList(CIniFile *);
+
+ static
+ void
+ sfn_DeleteManufacturerList(const CInfManufacturerEntry *);
+
+ // ======================= DATA ========================
+ const CInfVersionSection * m_pVersion;
+ const CInfManufacturerEntry * m_pFirstManuE;
+ const CInfSymbol * m_pSymFileName;
+ CSync m_sync;
+
+ CIniFile *m_pIniFile;
+
+};
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfVersionSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Version section:
+// [Version]
+// LayoutFile=layout.inf
+// Signature="$CHICAGO$"
+// Class=Modem
+// ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318}
+// Provider=%MS%
+
+class CInfVersionSection
+{
+
+public:
+
+ CInfVersionSection(void)
+ {
+ m_pSymLayoutFile = NULL;
+ m_pSymSignature = NULL;
+ m_pSymClass = NULL;;
+ m_pSymClassGUID = NULL;
+ m_pSymProvider = NULL;
+ m_dwChecksum = 0;
+ }
+
+ ~CInfVersionSection()
+ {
+ }
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- Checksum ------------------
+ // Return checksum of contents
+ DWORD Checksum(void) const
+ {
+ return m_dwChecksum;
+ }
+
+ // --------------- GetLayoutFile ------------------
+ const CInfSymbol * GetLayoutFile (void) const
+ {
+ return m_pSymLayoutFile;
+ }
+
+ // --------------- GetSignature ------------------
+ const CInfSymbol * GetSignature (void) const
+ {
+ return m_pSymSignature;
+ }
+
+ // --------------- GetClass ------------------
+ const CInfSymbol * GetClass (void) const
+ {
+ return m_pSymClass;
+ }
+
+ // --------------- GetClassGUID ------------------
+ const CInfSymbol * GetClassGUID (void) const
+ {
+ return m_pSymClassGUID;
+ }
+
+ // --------------- GetProvider ------------------
+ const CInfSymbol * GetProvider (void) const
+ {
+ return m_pSymProvider;
+ }
+
+
+private:
+
+ friend class CInfFile;
+
+ BOOL Load(const CIniFile *);
+ void Unload(void);
+
+ void mfn_Cleanup(void);
+
+ const CInfSymbol * m_pSymLayoutFile;
+ const CInfSymbol * m_pSymSignature;
+ const CInfSymbol * m_pSymClass;
+ const CInfSymbol * m_pSymClassGUID;
+ const CInfSymbol * m_pSymProvider;
+ DWORD m_dwChecksum;
+
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfManufacturerEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Manufacturer list section:
+// [Manufacturer]
+// %Generic% = Generic
+// %MagicRam% = MagicRam
+// ..
+
+class CInfManufacturerEntry: private CInfList
+{
+
+public:
+
+ CInfManufacturerEntry(const CInfManufacturerEntry *pNext)
+ : CInfList(NULL, pNext),
+ m_pManuS(NULL),
+ m_pSymManuName(NULL)
+ {}
+
+ ~CInfManufacturerEntry() {}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetManufacturerSection ----------
+ // Get manufacturer section
+ const CInfManufacturerSection * GetManufacturerSection (void) const
+ {
+ return m_pManuS;
+ }
+
+ // --------------- GetName ------------------
+ // Get manufacturer name (actual manufacturer name, not %xxxx%.)
+ const CInfSymbol * GetName (void) const
+ {
+ return m_pSymManuName;
+ }
+
+ // --------------- Next ------------------
+ // Get next Entry. NULL if no more...
+ const CInfManufacturerEntry * Next(void) const
+ {
+ return (const CInfManufacturerEntry *) CInfList::Next();
+ }
+
+ // --------------- Load ------------------
+ BOOL
+ Load(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileEntry *pIE
+ );
+
+ // --------------- Unload ------------------
+ void Unload(void);
+
+ //-------------- ReverseList ------------------
+ // Reverses the implicit list of manufacturer entries
+ static void ReverseList(CInfManufacturerEntry **ppManuE)
+ {
+ CInfList::ReverseList((const CInfList **) ppManuE);
+ }
+
+private:
+
+ void mfn_Cleanup(void);
+
+ const CInfManufacturerSection *m_pManuS;
+ const CInfSymbol *m_pSymManuName;
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfManufacturerSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Manufacturer section:
+// [Generic]
+// %Gen% = Gen, MDMGEN
+// %Gen3% = Gen3, MDMGEN3
+// %Gen12% = Gen12, MDMGEN12
+// %Gen24% = Gen24, MDMGEN24
+// ...
+
+class CInfManufacturerSection
+{
+
+public:
+
+ CInfManufacturerSection(void)
+ {
+ m_eObjSig=eOBJSIG_CInfManufacturerSection;
+ m_pSymSectionName = NULL;
+ m_pFirstModelE = NULL;
+ }
+
+ ~CInfManufacturerSection()
+ //TODO
+ {
+ m_eObjSig = eOBJSIG_INVALID;
+ }
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetFirstModelEntry --------------
+ // Get first model entry
+ const CInfModelEntry * GetFirstModelEntry (void) const;
+
+ // --------------- GetSectionName ------------------
+ // Get section name
+ const CInfSymbol * GetSectionName (void) const
+ {
+ return m_pSymSectionName;
+ }
+
+ // --------------- Load ------------------
+ BOOL
+ Load
+ (
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CInfSymbol *pSymManuSection
+ );
+
+ // --------------- Unload ------------------
+ void Unload(void);
+
+ // --------------- Validate ------------------
+ BOOL Validate(void) const
+ {
+ // TODO: can place in try-except clause...
+ return this && m_eObjSig==eOBJSIG_CInfManufacturerSection;
+ }
+
+ #if (TODO)
+ // --------------- GetName ------------------
+ // Get manufacturer name (actual manufacturer name),
+ const CInfSymbol * GetName (void) const;
+ #endif
+
+private:
+
+ void mfn_Cleanup(void);
+
+ // Static helper function
+ const CInfModelEntry *
+ sfn_CreateModelList(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileSection *pISManuS
+ );
+
+ const CInfSymbol *m_pSymSectionName;
+ const CInfModelEntry * m_pFirstModelE;
+ eOBJSIG m_eObjSig;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfModelEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Model entry:
+// %Gen% = Gen, MDMGEN
+
+class CInfModelEntry : private CInfList
+{
+
+public:
+
+ CInfModelEntry(const CInfModelEntry *pNext)
+ : CInfList(NULL, pNext)
+ {
+ /*TODO*/
+ m_dwControlFlags_All = dwCF_EXCLUDE_FROM_SELECT;
+ m_dwControlFlags_NT_All = dwCF_EXCLUDE_FROM_SELECT;
+ m_dwControlFlags_NT_Alpha = dwCF_EXCLUDE_FROM_SELECT;
+ m_dwControlFlags_NT_PPC = dwCF_EXCLUDE_FROM_SELECT;
+ m_dwControlFlags_NT_Mips = dwCF_EXCLUDE_FROM_SELECT;
+ }
+
+ ~CInfModelEntry() {/*TODO*/}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+
+ // --------------- Load ------------------
+ BOOL
+ Load(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileEntry *pIE
+ );
+
+ // --------------- Unload ------------------
+ void Unload(void);
+
+ // --------------- GetNext ------------------
+ // Get next Entry. NULL if no more...
+ const CInfModelEntry * Next(void) const
+ {
+ return (const CInfModelEntry *) CInfList::Next();
+ }
+
+ //-------------- ReverseList ------------------
+ // Reverses the implicit list of model entries
+ static void ReverseList(CInfModelEntry **ppModelE)
+ {
+ CInfList::ReverseList((const CInfList **) ppModelE);
+ }
+
+ // --------------- GetLHS ------------------
+ // Get next Entry. NULL if no more...
+ const CInfSymbol * GetLHS(void) const
+ {
+ // TODO
+ return gSymtab.Lookup(TEXT("%bongo101%"), TRUE);
+ }
+
+ // --------------- GetInstallSection --------------
+ // Get install section
+ const CInfInstallSection * GetInstallSection (void) const
+ {
+ return m_pInstallSection;
+ }
+
+ // --------------- GetName ------------------
+ // Get model name (actual model name, not %xxx%)
+ const CInfSymbol * GetName (void) const
+ {
+ // TODO
+ //return m_pSymName;
+ return gSymtab.Lookup(TEXT("Christy Brinkly"), TRUE);
+ }
+
+ // --------------- GetRank0ID ------------------
+ // Rank-0 ID
+ const CInfSymbol * GetRank0ID (void) const
+ {
+ // TODO
+ //return m_pSymRank0ID;
+ // TODO
+ return gSymtab.Lookup(TEXT("RANK-0-ID"), TRUE);
+
+ }
+
+ // --------------- GetRank1ID ------------------
+ // Rank-1 ID
+ const CInfSymbol * GetRank1ID (void) const
+ {
+ // TODO
+ // return m_pSymRank1ID;
+ return gSymtab.Lookup(TEXT("RANK-1-ID"), TRUE);
+ }
+
+ // --------------- GetRank2ID ------------------
+ // Rank-2 ID
+ const CInfSymbol * GetRank2ID (void) const
+ {
+ // TODO
+ // return m_pSymRank2ID;
+ return gSymtab.Lookup(TEXT("RANK-2-ID"), TRUE);
+ }
+
+ // --------------- GetControlFlags -----------------
+ // Return install flags (one or more dwCF_* flags) for the specified
+ // platform.
+ DWORD GetControlFlags(ePLATFORM ePlat) const
+ {
+ DWORD dwRet = 0;
+
+ switch(ePlat)
+ {
+ case ePLAT_ALL:
+ break;
+ case ePLAT_NT_ALL:
+ dwRet = m_dwControlFlags_NT_All;
+ break;
+
+ case ePLAT_NT_ALPHA:
+ dwRet = m_dwControlFlags_NT_Alpha;
+ break;
+
+ case ePLAT_NT_PPC:
+ dwRet = m_dwControlFlags_NT_PPC;
+ break;
+
+ case ePLAT_NT_MIPS:
+ dwRet = m_dwControlFlags_NT_Mips;
+ break;
+
+ default:
+ break;
+ }
+
+ return dwRet;
+ }
+
+private:
+
+ void mfn_Cleanup(void);
+
+ const CInfInstallSection * m_pInstallSection;
+ // Pointer to install section
+
+ const CInfSymbol * m_pSymName;
+ // Device name
+
+ const CInfSymbol * m_pSymRank0ID;
+ // Rank-0 ID (primary device ID)
+
+ const CInfSymbol * m_pSymRank1ID;
+ // Rank-1 ID (compatible device ID)
+
+ const CInfSymbol * m_pSymRank2ID;
+ // Rank-2 ID (Rank 2 ID)
+
+ DWORD m_dwControlFlags_All;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to all platforms.
+
+ DWORD m_dwControlFlags_NT_All;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to all NT platforms.
+
+ DWORD m_dwControlFlags_NT_Alpha;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to NT Alpha platform.
+
+ DWORD m_dwControlFlags_NT_PPC;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to NT PPC platform.
+
+ DWORD m_dwControlFlags_NT_Mips;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to NT MIPS platform.
+};
+
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfInstallSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Install section:
+// [Modem29]
+// AddReg=All, MfgAddReg, ROCK_VOICE_ALL, ROCK_VOICE_SERWAVE, INTERNAL
+// CopyFiles = VV_Sys, VV_Sock_Sys, VV_App, VV_Help
+// UpdateInis = VView.Inis
+// Uninstall = VoiceView_remove
+//
+// Also contains info from the related PosDup and NoResDup sections:
+//
+// [Modem12.PosDup]
+// *PNP0500
+//
+// [Modem6.NoResDup]
+// UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15
+//
+
+class CInfInstallSection
+{
+
+public:
+
+ CInfInstallSection(void);
+ ~CInfInstallSection();
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetAddRegSectionList ----------
+ // Get generic list whose data items are pointers to
+ // CInfAddRegSection objects
+ const CInfList * GetAddRegSectionList (void) const;
+
+ // --------------- GetCopyFilesSectionList ----------
+ // Get generic list whose data items are pointers to
+ // CInfCopyFilesSection objects
+ const CInfList * GetCopyFilesSectionList (void) const;
+
+ // --------------- GetNoResDupIDList ----------
+ // Get generic list whose data items are pointers to
+ // InfSymbol objects representing the Rank0 IDs in the corresponding
+ // NoResDup section.
+ const CInfList * GetNoResDupIDList (void) const;
+
+ // --------------- GetPosDupIDList ----------
+ // Get generic list whose data items are pointers to
+ // InfSymbol objects representing the Rank0 IDs in the corresponding
+ // PosDup section.
+ const CInfList * GetPosDupIDList (void) const;
+
+ #if (TODO)
+
+ // --------------- GetUpdateInisSectionList ------
+ // Get generic list whose data items are pointers to
+ // CInfUpdateInisSection objects
+ const CInfList * GetUpdateInisSectionList (void) const;
+
+ // --------------- GetUninstallSectionList ------
+ // Get generic list whose data items are pointers to
+ // CInfUninstallSection objects
+ const CInfList * GetUninstallSectionList (void) const;
+
+ // TODO: Also, treat as errors any sections which we don't understand or
+ // don't expect in a modem inf file or we don't support in the compiler:
+ // eg rename sections, and other fancy INF file constructs.
+
+ #endif // (TODO)
+
+private:
+
+ void mfn_Cleanup(void);
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfAddRegSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample AddReg section:
+// [All]
+// HKR,,FriendlyDriver,,Unimodem.vxd
+// HKR,,DevLoader,,*vcomm
+// HKR,,ConfigDialog,,modemui.dll
+// HKR,,EnumPropPages,,"modemui.dll,EnumPropPages"
+// HKR,,PortSubClass,1,02
+// HKR, Init, 1,, "AT<cr>"
+// HKR, Responses, "<cr><lf>OK<cr><lf>", 1, 00, 00, 00,00,00,00, ...etc.
+// HKR, Responses, "<cr><lf>ERROR<cr><lf>", 1, 03, 00, 00,00,00, ...etc.
+
+class CInfAddRegSection
+{
+
+public:
+
+ CInfAddRegSection(void) {/*TODO*/}
+ ~CInfAddRegSection() {/*TODO*/}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void
+ Dump(void)
+ const;
+
+ // --------------- GetFirstAddRegEntry --------------
+ // Get first addreg entry
+ const
+ CInfAddRegEntry *
+ GetFirstAddRegEntry (void)
+ const;
+
+private:
+
+ void mfn_Cleanup(void);
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfAddRegEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample AddReg entry:
+// HKR, Init, 1,, "AT<cr>"
+
+class CInfAddRegEntry
+{
+
+public:
+
+ CInfAddRegEntry(void)
+ {
+ // TODO -- faked out
+
+ m_pSymRegRoot = gSymtab.Lookup(TEXT("HKR"), TRUE);
+ m_pSymSubKey = gSymtab.Lookup(TEXT("Init"), TRUE);
+ m_pSymValueName = gSymtab.Lookup(TEXT("1"), TRUE);
+ m_dwFlag = MAXDWORD;
+ m_pSymValue = gSymtab.Lookup(TEXT("\"AT<cr>\""), TRUE);
+ m_dwChecksum = 1000;
+ }
+
+ ~CInfAddRegEntry() {/*TODO*/}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void
+ Dump(void)
+ const
+ {
+ // TODO: unimplemented
+ printf(" HKR, Init, 1,, \"AT<cr>\"\n");
+ }
+
+ // --------------- Checksum ------------------
+ // Compute and return checksum of contents
+ DWORD
+ Checksum(void)
+ const
+ {
+ return m_dwChecksum;
+ }
+
+ // --------------- Next ------------------
+ // Get next Entry. NULL if no more...
+ const CInfAddRegEntry *
+ Next(void)
+ const
+ {
+ // TODO: unimplemented
+ return NULL;
+ }
+
+ // --------------- GetRegRoot ------------------
+ // Get reg-root-string key (HKR, etc)
+ const CInfSymbol *
+ GetRegRoot (void)
+ const
+ {
+ return m_pSymRegRoot;
+ }
+
+ // --------------- GetSubKey ------------------
+ // Get sub key, NULL if none.
+ const CInfSymbol *
+ GetSubKey (void)
+ const
+ {
+ return m_pSymSubKey;
+ }
+
+ // --------------- GetValueName ------------------
+ // Get value-name, NULL if none.
+ const CInfSymbol *
+ GetValueName (void)
+ const
+ {
+ return m_pSymValueName;
+ }
+
+ // --------------- GetFlag ------------------
+ // Get flag-name, MAXDWORD if none.
+ DWORD
+ GetFlag (void)
+ const
+ {
+ return m_dwFlag;
+ }
+
+ // --------------- GetValue ------------------
+ // Get value-name, NULL if none.
+ // For binary data, this represents a normalized version of the
+ // string specified in the inf file: it has the format: "xxyxxyxx.."
+ // where xx is 2-digit hex representation of a byte and y is the space
+ // character (' '). For ASCII data, the value is the ascii string without
+ // the enclosing quotes. Extending '\' characters are processed.
+ const CInfSymbol *
+ GetValue (void)
+ const
+ {
+ return m_pSymValue;
+ }
+
+ #if (TODO)
+ ... more stuff
+ #endif
+
+private:
+
+ void mfn_Cleanup(void);
+
+ const CInfSymbol * m_pSymRegRoot;
+ const CInfSymbol * m_pSymSubKey;
+ const CInfSymbol * m_pSymValueName;
+ const CInfSymbol * m_pSymValue;
+ DWORD m_dwFlag;
+ DWORD m_dwChecksum;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfCopyFilesSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample DestinationDirs section:
+// [DestinationDirs]
+// Register.Copy = 17 ;LDID_INF
+// VV_Sys = 11
+// VV_Sock_Sys = 11 ;LDID_SYS \Windows\system dir
+// VV_Sock_Win = 10 ;LDID_WIN \Windows dir
+// VV_App = 10
+// VV_Help = 18 ;LDID_HELP
+
+// Sample Copyfiles section:
+// [VV_Sys]
+// fte.dll
+// vvexe32.exe
+// wsvv.vxd
+
+// Note: each CInfCopyFilesEntry object keeps a pointer to its destination
+// directory (all the entries for a particular section will have the same
+// destination dir, because in the inf, a destination directory is associated
+// with an entire section.
+
+class CInfCopyFilesSection
+{
+
+public:
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetFirstCopyFilesEntry ----------
+ // Get first copyfiles entry
+ const CInfCopyFilesEntry * GetFirstCopyFilesEntry (void) const;
+
+ #if (TODO)
+ // Following reflect the Copyfiles.NT* extensions. We need to keep
+ // this information along with the section.
+ enum {PROC_X86, PROC_MIPS, PROC_ALPHA, PROC_PPC} eProcessorType;
+ enum {PLAT_NT, , PLAT_WIN9X} ePlatformType;
+ #endif // (TODO)
+
+ // TODO: remove following friend declaration once
+ // CInfInstallSection::GetCopyFilesList
+ // is properly implemented (it currently needs to access this
+ // class's constructor.
+ // Also, move ~CInfCopyFIlesEntry to protected when done.
+ friend class CInfInstallSection;
+ ~CInfCopyFilesSection() {/*TODO*/}
+
+protected:
+
+ CInfCopyFilesSection(void) {/*TODO*/}
+
+
+private:
+
+ void mfn_Cleanup(void);
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfCopyFilesEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample CopyFiles entry:
+// fte.dll
+// Note: each CInfCopyFilesEntry object keeps a pointer to its destination
+// directory.
+// TODO: keep information about platform & processor as well (see TODO
+// notes under CInfCopyFilesSection).
+
+class CInfCopyFilesEntry
+{
+
+public:
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const
+ {
+ // TODO: unimplemented
+ printf(" fte.dll ; goes to 11\n");
+ }
+
+ // --------------- Checksum ------------------
+ // Compute and return checksum of contents
+ // Compute and return checksum of contents
+ DWORD
+ Checksum(void)
+ const
+ {
+ return m_dwChecksum;
+ }
+
+ // --------------- GetNext ------------------
+ // Get next Entry. NULL if no more...
+ const CInfCopyFilesEntry * Next(void) const
+ {
+ // TODO: unimplemented
+ return NULL;
+ }
+
+ // --------------- GetFileName ------------------
+ // Get file name to be copied.
+ const CInfSymbol * GetFileName (void) const;
+
+ // --------------- GetDestDir ------------------
+ // Get file name to be copied.
+ const CInfSymbol * GetDestDir (void) const;
+
+ // TODO: remove following friend declaration once
+ // CInfCopyFilesSection::GetFirstCopyFilesEntry
+ // is properly implemented (it currently needs to access this
+ // class's constructor.
+ // Also, move ~CInfCopyFIlesEntry to protected when done.
+ friend class CInfCopyFilesSection;
+ ~CInfCopyFilesEntry() {/*TODO*/}
+
+protected:
+
+ CInfCopyFilesEntry(void)
+ {
+ // TODO -- faked out
+ m_dwChecksum = 1001;
+ }
+
+private:
+
+ void mfn_Cleanup(void);
+
+ DWORD m_dwChecksum;
+
+};
+
+#if 0
+pInf->Load("mdmgen.inf");
+pManuf = pInf->GetFirstManufacturerEntry();
+for(;pManuf; pManuf = pManuf->Next())
+{
+ pNewDevice = new ModemDevice(pDevice);
+ pDevice->Load(pInf, pManuf);
+ pDevice->Dump();
+ pDevice = pNewDevice;
+}
+pInf->Unload("
+NewSession()
+FreeSession()
+#endif
diff --git a/private/unimodem/new/mic/ini.cpp b/private/unimodem/new/mic/ini.cpp
new file mode 100644
index 000000000..617471ec9
--- /dev/null
+++ b/private/unimodem/new/mic/ini.cpp
@@ -0,0 +1,153 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// INI.CPP -- Implemtation for Classes:
+// CIniFile
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+#include "common.h"
+#include "ini.h"
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFile
+///////////////////////////////////////////////////////////////////////////
+
+
+CIniFile::CIniFile(void)
+{
+}
+
+
+CIniFile::~CIniFile()
+{
+ mfn_EnterCrit();
+
+ // Free resources
+}
+
+
+//-------------- Load ------------------
+// Loads the specified file. (Obviously) only one file can be loaded at
+// a time.
+// TODO: unimplemented
+BOOL CIniFile::Load (const TCHAR rgchPathname[])
+{
+ BOOL fRet = FALSE;
+
+ //mfn_EnterCrit();
+
+ fRet = TRUE;
+
+// end:
+
+ if (!fRet)
+ {
+ //mfn_Cleanup();
+ }
+
+ //mfn_LeaveCrit();
+
+ return fRet;
+}
+
+
+//-------------- Unload ------------------
+// Unloads a previously loaded file. If there are open sessions to this
+// object, Unload returns a handle which will be signalled when all
+// sessions are closed. New sessions will not be allowed after this
+// function returns. The call should free the handle.
+// TODO: unimplemented
+HANDLE CIniFile::Unload (void)
+{
+ HANDLE hUnload = NULL;
+
+ // mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginUnload to try to put us in unloadable state.
+
+ // mfn_Cleanup();
+
+ // mfn_LeaveCrit();
+
+
+ return hUnload;
+}
+
+
+//-------------- LookupSection ------------------
+// Unloads a previously loaded file. If there are open sessions to this
+const CIniFileSection *
+CIniFile::LookupSection(const TCHAR *lptcszSection)
+const
+// TODO
+{
+ static const CIniFileSection * pIS;
+ if (!pIS) pIS = new CIniFileSection;
+ return pIS;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileSection
+///////////////////////////////////////////////////////////////////////////
+
+
+//-------------- LookupEntry ------------------
+const CIniFileEntry *
+CIniFileSection::LookupEntry(const TCHAR *lptcszEntry)
+const
+// TODO
+{
+ static const CIniFileEntry * pIE;
+ if (!pIE) pIE = new CIniFileEntry;
+ return pIE;
+}
+
+//-------------- GetFirstEntry ------------------
+CIniFileEntry *
+CIniFileSection::GetFirstEntry (void)
+// TODO
+const
+{
+ static CIniFileEntry * pIE;
+ if (!pIE) pIE = new CIniFileEntry;
+ return pIE;
+}
+
+//-------------- Release ------------------
+void
+CIniFileSection::Release(void)
+const
+// TODO
+{
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileEntry
+///////////////////////////////////////////////////////////////////////////
+
+
+//-------------- GetRHS ------------------
+const CInfSymbol *
+CIniFileEntry::GetRHS(void)
+const
+// TODO
+{
+ return gSymtab.Lookup("[RHS]", TRUE);
+}
+
+
+//-------------- Release ------------------
+void
+CIniFileEntry::Release(void)
+const
+// TODO
+{
+}
+
diff --git a/private/unimodem/new/mic/ini.h b/private/unimodem/new/mic/ini.h
new file mode 100644
index 000000000..1c2933b1b
--- /dev/null
+++ b/private/unimodem/new/mic/ini.h
@@ -0,0 +1,210 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// INI.H -- Header for Classes:
+// CIniFile
+// CIniFileLine
+// CIniFileSection
+// CIniFileEntry
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+
+class CIniFile;
+class CIniFileLine;
+class CIniFileSection;
+class CIniFileEntry;
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFile
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a windows INI file.
+
+class CIniFile
+{
+
+public:
+
+ CIniFile(void);
+ ~CIniFile();
+
+ //-------------- Load ------------------
+ // Loads the specified file. (Obviously) only one file can be loaded at
+ // a time.
+ BOOL Load (const TCHAR rgchPathname[]);
+
+ //-------------- Unload ------------------
+ // Unloads a previously loaded file. If there are open sessions to this
+ // object, Unload returns a handle which will be signalled when all
+ // sessions are closed. New sessions will not be allowed after this
+ // function returns. The call should free the handle.
+ HANDLE Unload (void);
+
+ //-------------- OpenSession ------------------
+ // Open a session to this object. The object will not be unloaded until
+ // this session is closed. 0 indicates failure.
+ // TODO: unimplemented
+ const void * OpenSession (void) const {return (const void *) 1;}
+
+ //-------------- CloseSession ------------------
+ // Close the specified session to this object.
+ // TODO: unimplemented
+ void CloseSession (const void *) const {}
+
+ //-------------- GetFirstLine ------------------
+ // Get the first line in the file. Subsequent lines can be got by
+ // calling Next() on the line object.
+ const CIniFileLine * GetFirstLine (void) const;
+
+ //-------------- GetFirstSection ------------------
+ // Get the first section in the file.
+ const CIniFileSection * GetFirstSection (void) const;
+
+ //-------------- LookupSection ------------------
+ // Lookup a section in the file, given a name. Comparison is case-
+ // insensitive.
+ const CIniFileSection * LookupSection (const TCHAR * pchName) const;
+
+ //-------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ //-------------- GetName ------------------
+ // Returns the file name
+ const CInfSymbol * GetName (void) const
+ {
+ return m_pSymFileName;
+ }
+
+protected:
+
+ //-------------- mfn_GetProp ---------------
+ // Gets the property value associated with this object.
+ void * mfn_GetProp(void) {return m_pvProp;}
+
+ //-------------- mfn_SetProp ---------------
+ // Sets the property value associated with this object.
+ // Returns previously-set value, if any.
+ void * mfn_SetProp(void *pvNew)
+ {
+ void *pv;
+ mfn_EnterCrit();
+ pv = m_pvProp;
+ m_pvProp = pvNew;
+ mfn_LeaveCrit();
+ return pv;
+ }
+
+ //-------------- mfn_EnterCrit ------------------
+ void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
+
+
+ //-------------- mfn_LeaveCrit ------------------
+ void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
+
+
+private:
+
+ CSync m_sync;
+ void * m_pvProp;
+ const CInfSymbol * m_pSymFileName;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileLine
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a single line in an INI file.
+// TODO: unimplemented
+// Note: Only CIniFile member functions can construct/destruct these
+// objects.
+
+class CIniFileLine
+{
+
+protected:
+
+ CIniFileLine(void) {}
+ ~CIniFileLine() {}
+
+private:
+
+ friend class CIniFile;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileSection
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a single section in an INI file.
+// Note: Only CIniFile member functions can construct/destruct these
+// objects.
+
+class CIniFileSection
+{
+
+public:
+
+ const CInfSymbol * GetName (void) const
+ {
+ // TODO
+ return gSymtab.Lookup(TEXT("Steroids"), TRUE);
+ }
+
+ CIniFileEntry * GetFirstEntry (void) const;
+ const CIniFileEntry * LookupEntry (const TCHAR rgchName[]) const;
+ const CIniFileSection * Next(void) const;
+ void Release(void) const;
+protected:
+
+ CIniFileSection(void) {/*TODO*/}
+ ~CIniFileSection() {/*TODO*/}
+
+private:
+
+ friend class CIniFile;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a single entry in a section in an INI file.
+// Note: Only CIniFileSection member functions can construct/destruct these
+// objects.
+
+class CIniFileEntry
+{
+
+public:
+
+ const CInfSymbol * GetLHS (void) const
+ {
+ // TODO
+ return gSymtab.Lookup(TEXT("%bongo101%"), TRUE);
+ }
+ const CInfSymbol * GetRHS (void) const;
+ const CIniFileLine * GetFirstLine (void) const;
+ BOOL * BecomeNext (void)
+ {
+ return FALSE;
+ }
+
+ void Release(void) const;
+
+protected:
+
+ CIniFileEntry(void) {/*TODO*/}
+ ~CIniFileEntry() {/*TODO*/}
+
+private:
+
+ friend class CIniFileSection;
+};
diff --git a/private/unimodem/new/mic/main.cpp b/private/unimodem/new/mic/main.cpp
new file mode 100644
index 000000000..a83cab10f
--- /dev/null
+++ b/private/unimodem/new/mic/main.cpp
@@ -0,0 +1,18 @@
+#include "common.h"
+#include "test.h"
+#include "mic.h"
+
+//#define MAIN_T main_tdev
+#define MAIN_T main_mic
+
+int __cdecl main(int argc, char * argv[])
+{
+ int iRet = 0;
+
+ if (!InitGlobals()) goto end;
+
+ iRet = MAIN_T (argc, argv);
+
+end:
+ return iRet;
+}
diff --git a/private/unimodem/new/mic/makefile b/private/unimodem/new/mic/makefile
new file mode 100644
index 000000000..6ee4f43fa
--- /dev/null
+++ b/private/unimodem/new/mic/makefile
@@ -0,0 +1,6 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the components of NT OS/2
+#
+!INCLUDE $(NTMAKEENV)\makefile.def
diff --git a/private/unimodem/new/mic/mic.cpp b/private/unimodem/new/mic/mic.cpp
new file mode 100644
index 000000000..9fa79d695
--- /dev/null
+++ b/private/unimodem/new/mic/mic.cpp
@@ -0,0 +1,167 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// MIC.CPP -- Modem INF Compiler -- basic version
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// History:
+// 06/04/96 JosephJ Created
+//
+#include "common.h"
+#include "ini.h"
+#include "inf.h"
+#include "dev.h"
+#include "test.h"
+
+#define SIMPLE 0
+#define COMPLEX 1
+#define ACTUAL 2
+
+//#define TEST_TYPE (SIMPLE)
+#define TEST_TYPE (COMPLEX)
+//#define TEST_TYPE (ACTUAL)
+
+
+#if (TEST_TYPE==SIMPLE)
+#elif (TEST_TYPE==COMPLEX)
+#elif (TEST_TYPE==ACTUAL)
+#endif
+
+class CMicOptions
+{
+public:
+ CMicOptions(void) {}
+ ~CMicOptions() {}
+ BOOL Load (int argc, const char *argv[]);
+ void Unload(void) {}
+ static void Usage(void);
+ const TCHAR *OrigInfPath(void) {return m_rgchOrigInfPath;}
+ const TCHAR *NewInfDir(void) {return m_rgchNewInfDir;}
+
+private:
+
+ TCHAR m_rgchOrigInfPath[MAX_PATH];
+ TCHAR m_rgchNewInfDir[MAX_PATH];
+
+};
+
+CMicOptions gMicOptions;
+
+BOOL CMicOptions::Load (int argc, const char *argv[])
+{
+ BOOL fRet = FALSE;
+ UINT u;
+
+ if (argc!=3) goto end;
+
+ if (lstrlen(argv[1]) >= (sizeof(m_rgchOrigInfPath)/sizeof(TCHAR)))
+ {
+ goto end;
+ }
+
+ u = lstrlen(argv[2]);
+ // Extra space for possible addition of '\\'.
+ if ((u+1) >= (sizeof(m_rgchNewInfDir)/sizeof(TCHAR)))
+ {
+ goto end;
+ }
+
+ lstrcpy(m_rgchOrigInfPath, argv[1]);
+ lstrcpy(m_rgchNewInfDir, argv[2]);
+
+ ASSERT(u);
+
+ // Add final \, if required.
+ {
+ TCHAR tch = m_rgchNewInfDir[u-1];
+ if ( (tch!=(TCHAR) '\\') && (u>2 || tch!=(TCHAR)':'))
+ {
+ m_rgchNewInfDir[u]=TCHAR('\\');
+ m_rgchNewInfDir[u+1]=0;
+ }
+ }
+
+ printf
+ (
+ "OrigIP=[%s]; NewID=[%s]\n",
+ m_rgchOrigInfPath,
+ m_rgchNewInfDir
+ );
+ fRet = TRUE;
+
+end:
+ return fRet;
+}
+
+void CMicOptions::Usage (void)
+{
+ printf(TEXT("\nUsage: mic <original-inf-path> <destination-dir>\n\n"));
+}
+
+int main_mic(int argc, char * argv[])
+{
+ const CInfManufacturerEntry *pManuE = NULL;
+ CInfFile *pInf= NULL;
+ CInfDevice *pDev = NULL;
+
+
+ // Parse Options
+ // Format: mic <original inf path> <destination-dir>
+ if (!gMicOptions.Load(argc, (const char **) argv))
+ {
+ CMicOptions::Usage();
+ return 1;
+ }
+
+ pInf= new CInfFile();
+ pDev = new CInfDevice(NULL);
+
+ if (!pInf || !pDev) goto end;
+
+ if (pInf->Load(gMicOptions.OrigInfPath()))
+ {
+ pManuE = pInf->GetFirstManufacturerEntry();
+ }
+
+ for (;pManuE; pManuE = pManuE->Next())
+ {
+ const CInfManufacturerSection *pManuS=pManuE->GetManufacturerSection();
+ const CInfModelEntry *pModelE = NULL;
+ if (pManuS)
+ {
+ pModelE = pManuS->GetFirstModelEntry();
+ }
+ for (;pModelE; pModelE = pModelE->Next())
+ {
+ if (pDev->Load(pInf, pManuE, pModelE))
+ {
+ TCHAR rgchNewInf[MAX_PATH];
+ DWORD dwRank0Checksum = pDev->Rank0Checksum();
+ DWORD dwDeviceChecksum = pDev->Checksum();
+ wsprintf
+ (
+ rgchNewInf,
+ TEXT("%s%08lx_%08lx.inf"),
+ gMicOptions.NewInfDir(),
+ dwRank0Checksum,
+ dwDeviceChecksum
+ );
+ pDev->Dump();
+
+ pDev->WriteInf(rgchNewInf);
+ pDev->Unload();
+ }
+ }
+ }
+
+end:
+ if (pDev) {delete pDev; pDev=NULL;}
+ if (pInf) {pInf->Unload(); delete pInf; pInf=NULL;}
+
+ gMicOptions.Unload();
+
+ return 0;
+}
diff --git a/private/unimodem/new/mic/mic.h b/private/unimodem/new/mic/mic.h
new file mode 100644
index 000000000..2d1fd1697
--- /dev/null
+++ b/private/unimodem/new/mic/mic.h
@@ -0,0 +1 @@
+int main_mic(int argc, char * argv[]);
diff --git a/private/unimodem/new/mic/notes.txt b/private/unimodem/new/mic/notes.txt
new file mode 100644
index 000000000..08a196351
--- /dev/null
+++ b/private/unimodem/new/mic/notes.txt
@@ -0,0 +1,231 @@
+Modem Inf Compiler -- MIC
+-------------------------
+
+History:
+ 5/18/96 JosephJ Created
+
+Files:
+
+
+Classes:
+
+-------------------------------
+ CIniFile
+ Bind(FilePath pFilePath)
+ Out(FilePath pFilePath)
+ Section(szName)
+ UnBind()
+ Name
+
+ CIniFileSection
+ CIniFileSection
+ EntryIterator
+ Out(HFILE);
+ Name
+ Line
+
+ CIniFileEntry
+ Name
+ RHS
+ Out(HFILE);
+ Line
+
+ CIniFileEntryIterator
+ NextEntry
+
+ CIniFileLine
+ //Can be one of: blank, annotations, section-header,
+ // entry, entry-continuation, or unknown
+ //State can be one of: ok, warning, error(%d)
+ Type
+ State
+ Text
+
+
+ CIniFileAnnotation
+
+-------------------------------
+
+ CInfFile
+
+ CIniFile
+
+
+ CInfDevice
+
+ CSymbolTable
+ Lookup
+
+ CSymbol
+ GetText
+ GetTextLength
+
+ CInfAddRegList
+ CInfCopyFileList
+
+ CInfRank
+
+ CDisplay
+
+--------------------------------
+
+CModemDevice::CreateModem(CInfFile *pInf, CDeviceLocation *pDevLoc)
+{
+ // GetVersion
+ pInf->Version
+
+ // Get manufacturer
+ ptbszManufacturer = pDevLoc->ptbszManufacturer;
+
+ // Get Device name.
+ ptbszName = pDevLoc->Name
+
+ // Get InstallSection
+ pInstallSec = pInf->InstallSection(pDevice->ptbszInstallSection);
+
+ // Walk Addreg list
+ {
+ DWORD rgdwChecksum[MAX];
+ CAddregIterator pAddregIter = pDevLoc->AddregIterator();
+
+ for (int i=0, CAddreg pAddReg=0;(pAddreg=pAddregIter->Iterate());i++)
+ {
+ // For mow, add checksum to array
+ rgdwChecksum[i++] = pAddreg->Checksum();
+ }
+
+ // Compute Addreg checksum
+ ::CRC16((LPBYTE)rgdwChecksum, (i)? (i-1) : 0);
+ }
+
+ // Walk other list...
+ // Copyfiles
+ {
+ }
+
+}
+-------------------------------
+
+Files
+
+Class headers:
+ inf.h CIniFile
+ ini.h CInfFile
+ device.h CInfDevice
+ sym.h CInfSymbol
+---------------------------------
+
+class CGenericIterator
+{
+
+public:
+ CGenericIterator(void * pData, const CGenericIterator *pNext)
+ {m_pData=pData; m_pNext = pNext;}
+ ~CGenericIterator();
+
+ const CGenericIterator * Next (void) const {return pNext;}
+ void * Data (void) const {return pData;}
+
+private:
+
+ const CGenericIterator * m_pNext;
+ void * m_pNext;
+};
+
+for (; pIter, pIter = pIter->Next())
+{
+ const CAddregSection * pAddreg = (const CAddregSection *) pIter;
+ // blah blah...
+}
+
+ CInfString
+------------------------------------------
+
+CSyncObject
+
+ Load
+ Unload
+
+ DWORD OpenSession(void)
+ void CloseSession(DWORD)
+
+ EnterCrit
+ LeaveCrit
+
+private:
+ CRITICAL_SECTION
+ Slist EventList
+ UINT uRefCount;
+ enum {UNLOADED, MARKED_FOR_UNLOAD, LOADED} eState;
+
+--------------------------------------------------
+[Support APIs from sdk\inc\setupi.h]
+SetupGetInfInformation
+SetupQueryInfFileInformation useful?
+SetupQueryInfVersionInformation useful?
+SetupGetInfFileList useful?
+SetupOpenInfFile
+SetupOpenMasterInf
+SetupOpenAppendInfFileW
+SetupCloseInfFile
+SetupFindFirstLineA useful?
+SetupFindNextLine useful?
+SetupFindNextMatchLine useful?
+SetupGetLineByIndex useful?
+SetupGetLineCount useful?
+SetupGetLineText useful?
+SetupGetFieldCount useful?
+SetupGetStringField useful?
+SetupGetIntField useful?
+SetupGetMultiSzField useful?
+SetupGetBinaryField useful?
+SetupGetFileCompressionInfo
+SetupGetSourceFileLocation useful?
+SetupGetSourceFileSize
+SetupGetTargetPath useful?
+Error codes:
+ Inf parse outcomes:
+ ERROR_EXPECTED_SECTION_NAME
+ ERROR_BAD_SECTION_NAME_LINE
+ ERROR_SECTION_NAME_TOO_LONG
+ ERROR_GENERAL_SYNTAX
+
+ Inf runtime errors:
+ ERROR_WRONG_INF_STYLE
+ ERROR_SECTION_NOT_FOUND
+ ERROR_LINE_NOT_FOUND
+--------------------
+6/9/96
+
+Inf:Load:
+
+-- Read Version Information
+-- Read Manufacturer List Section
+ Read Manufacturer Entry
+ Read Manufacturer Section
+ Read Model Entry
+ Read Install Section
+ Read AddregSection
+ ...
+ Read ControlFlags section
+
+---------
+6/12/96
+-- concept of a Validate member function for each class:
+BOOL Validate(void)
+{
+ if (!this) return FALSE;
+
+ _try
+ {
+ test other things, like an object-type signature (each object can
+ have an object-type signature, which is assigned by the constructur
+ and cleared by the destructor.
+ }
+ _except(....)
+ {
+ }
+
+end:
+
+}
diff --git a/private/unimodem/new/mic/resp.cpp b/private/unimodem/new/mic/resp.cpp
new file mode 100644
index 000000000..fcb92de7d
--- /dev/null
+++ b/private/unimodem/new/mic/resp.cpp
@@ -0,0 +1,3538 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+#include <windows.h>
+
+const TCHAR *rgpszSimpleResp[] =
+{
+ "How",
+ "Now",
+ "Brown",
+ "Cow!",
+ NULL
+};
+
+const TCHAR *rgpszComplexResp[] =
+{
+"-SFA",
+"-SMD",
+"-SRA",
+"-SRC:",
+"-SRQ",
+"-SSV",
+"-STO",
+"-SVM",
+"+F4",
+"+F4/+FCERROR",
+"+F4@",
+"+FC-FCERROR",
+"+FC@",
+"+FCERROR",
+"+FCON",
+"@",
+"@#-SFA@#",
+"@#-SMD@#",
+"@#-SRA@#",
+"@#-SRC:@#",
+"@#-SRQ@#",
+"@#-SSV@#",
+"@#-STO@#",
+"@#-SVM@#",
+"@# CONNECT 1200 LAPM COMPRESSED@#",
+"@#+FCERROR@@#",
+"@#+FCERROR@#",
+"@#@#NO CARRIER@#",
+"@#ABORD@#",
+"@#ABORTED@#",
+"@#AUTOLOGON FAILED@#",
+"@#BLACKLISTED@#",
+"@#BUSY@#",
+"@#C@#",
+"@#CALL LOCKED:BLACKLISTED@#",
+"@#CARRIER 1200@#",
+"@#CARRIER 2400@#",
+"@#CARRIER 300@#",
+"@#CARRIER 600@#",
+"@#CARRIER 1200 V.34@#",
+"@#CARRIER 1200/75",
+"@#CARRIER 1200/75 V.23@#",
+"@#CARRIER 1200/75/VFC@#",
+"@#CARRIER 1200/75@#",
+"@#CARRIER 1200/VFC@#",
+"@#CARRIER 1200@#",
+"@#CARRIER 12000/VFC@#",
+"@#CARRIER 12000@#",
+"@#CARRIER 1200TX/75RX V.23@#",
+"@#CARRIER 14400 V.34@#",
+"@#CARRIER 14400/VFC@ @#",
+"@#CARRIER 14400/VFC@#",
+"@#CARRIER 14400@#",
+"@#CARRIER 16800 V.34@#",
+"@#CARRIER 16800/VFC@@#",
+"@#CARRIER 16800/VFC@#",
+"@#CARRIER 16800@#",
+"@#CARRIER 19200 V.34@#",
+"@#CARRIER 19200/VFC@@#",
+"@#CARRIER 19200/VFC@#",
+"@#CARRIER 19200@#",
+"@#CARRIER 21600 V.34@#",
+"@#CARRIER 21600/VFC@@#",
+"@#CARRIER 21600/VFC@#",
+"@#CARRIER 21600@#",
+"@#CARRIER 2400 V.34@#",
+"@#CARRIER 2400/VFC@#",
+"@#CARRIER 2400@#",
+"@#CARRIER 24000 V.34@#",
+"@#CARRIER 24000/VFC@@#",
+"@#CARRIER 24000/VFC@#",
+"@#CARRIER 24000@#",
+"@#CARRIER 26400 V.34@#",
+"@#CARRIER 26400/VFC@@#",
+"@#CARRIER 26400/VFC@#",
+"@#CARRIER 26400@#",
+"@#CARRIER 28800 V.34@#",
+"@#CARRIER 28800/VFC@@#",
+"@#CARRIER 28800/VFC@#",
+"@#CARRIER 28800@#",
+"@#CARRIER 300 V.34@#",
+"@#CARRIER 300/VFC@#",
+"@#CARRIER 300@#",
+"@#CARRIER 4800 V.34@#",
+"@#CARRIER 4800/VFC@#",
+"@#CARRIER 4800@#",
+"@#CARRIER 600@#",
+"@#CARRIER 64000@#",
+"@#CARRIER 7200 V.34@#",
+"@#CARRIER 7200/VFC@#",
+"@#CARRIER 7200@#",
+"@#CARRIER 75/1200",
+"@#CARRIER 75/1200 V.23@#",
+"@#CARRIER 75/1200/VFC@#",
+"@#CARRIER 75/1200@#",
+"@#CARRIER 75TX/1200RX V.23@#",
+"@#CARRIER 9600 V.34@#",
+"@#CARRIER 9600/VFC@#",
+"@#CARRIER 9600@#",
+"@#CED@# ",
+"@#COMPRESSION :CLASS5@#",
+"@#COMPRESSION NONE@#",
+"@#COMPRESSION V.42BIS@#",
+"@#COMPRESSION: ADC",
+"@#COMPRESSION: ADC@#",
+"@#COMPRESSION: CLASS 5@#",
+"@#COMPRESSION: CLASS5@#",
+"@#COMPRESSION: MNP5@#",
+"@#COMPRESSION: NONE@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V42BIS@#",
+"@#COMPRESSION:CLASS 5@#",
+"@#COMPRESSION:NONE@#",
+"@#COMPRESSION:V.42bis@#",
+"@#COMPRESSION:V.42BIS@#",
+"@#CONNECT 0600/ARQ@#",
+"@#CONNECT 0600/LAP-M/COMPRESSION@#",
+"@#CONNECT 0600/LAP-M@#",
+"@#CONNECT 0600/LAPM/COMP@#",
+"@#CONNECT 0600/LAPM@#",
+"@#CONNECT 0600/MNP@#",
+"@#CONNECT 0600/NONE@#",
+"@#CONNECT 0600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 0600/REL/COMP@#",
+"@#CONNECT 0600/REL@#",
+"@#CONNECT 0600/V42BIS@#",
+"@#CONNECT 0600@#",
+"@#CONNECT 112000/ARQ/MLP /V120/V42b@#",
+"@#CONNECT 112000/ARQ/MLP /V120@#",
+"@#CONNECT 112000@#",
+"@#CONNECT 115,200/ARQ@#",
+"@#CONNECT 115,200/LAP-M/COMPRESSION@#",
+"@#CONNECT 115,200/LAP-M@#",
+"@#CONNECT 115,200/LAPM/COMP@#",
+"@#CONNECT 115,200/LAPM@#",
+"@#CONNECT 115,200/MNP@#",
+"@#CONNECT 115,200/NONE@#",
+"@#CONNECT 115,200/REL/COMP@#",
+"@#CONNECT 115,200/REL@#",
+"@#CONNECT 115,200/V42@#",
+"@#CONNECT 115,200/V42BIS@#",
+"@#CONNECT 115,200@#",
+"@#CONNECT 115200 ALT / MNP5@#",
+"@#CONNECT 115200 ALT /MNP 5@#",
+"@#CONNECT 115200 ALT@#",
+"@#CONNECT 115200 LAPM / V.42bis@#",
+"@#CONNECT 115200 LAPM /V.42bis@#",
+"@#CONNECT 115200 LAPM@#",
+"@#CONNECT 115200 REL/MNP5@#",
+"@#CONNECT 115200 REL@#",
+"@#CONNECT 115200/ARQ@#",
+"@#CONNECT 115200/LAP-M/COMPRESSION@#",
+"@#CONNECT 115200/LAP-M@#",
+"@#CONNECT 115200/LAPM/COMP@#",
+"@#CONNECT 115200/LAPM@#",
+"@#CONNECT 115200/MNP COMPRESSED@#",
+"@#CONNECT 115200/MNP@#",
+"@#CONNECT 115200/NONE@#",
+"@#CONNECT 115200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 115200/REL-LAPM@#",
+"@#CONNECT 115200/REL-V.42@#",
+"@#CONNECT 115200/REL/COMP@#",
+"@#CONNECT 115200/REL@#",
+"@#CONNECT 115200/V42@#",
+"@#CONNECT 115200/V42BIS@#",
+"@#CONNECT 115200/VBIS@#",
+"@#CONNECT 115200@#",
+"@#CONNECT 115200T/V42BIS@#",
+"@#CONNECT 1200 ALT / MNP5@#",
+"@#CONNECT 1200 ALT /MNP 5@#",
+"@#CONNECT 1200 ALT@#",
+"@#CONNECT 1200 EC/V42BIS@#",
+"@#CONNECT 1200 EC@#",
+"@#CONNECT 1200 LAPM / V.42bis@#",
+"@#CONNECT 1200 LAPM /V.42bis@#",
+"@#CONNECT 1200 LAPM COMPRESSED@#",
+"@#CONNECT 1200 LAPM@#",
+"@#CONNECT 1200 NORMAL@#",
+"@#CONNECT 1200 REL/MNP5@#",
+"@#CONNECT 1200 REL/V42@#",
+"@#CONNECT 1200 REL/V42BIS@#",
+"@#CONNECT 1200 REL@#",
+"@#CONNECT 1200 RELIABLE COMPRESSED@#",
+"@#CONNECT 1200 RELIABLE@#",
+"@#CONNECT 1200 V.42@#",
+"@#CONNECT 1200/75",
+"@#CONNECT 1200/75/ARQ@#",
+"@#CONNECT 1200/75/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200/75/LAP-M@#",
+"@#CONNECT 1200/75/LAPM/COMP@#",
+"@#CONNECT 1200/75/LAPM@#",
+"@#CONNECT 1200/75/MNP@#",
+"@#CONNECT 1200/75/NONE@#",
+"@#CONNECT 1200/75/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200/75/REL/COMP@#",
+"@#CONNECT 1200/75/REL@#",
+"@#CONNECT 1200/75/V42@#",
+"@#CONNECT 1200/75/V42BIS@#",
+"@#CONNECT 1200/75@#",
+"@#CONNECT 1200/ARQ/MNP4@#",
+"@#CONNECT 1200/ARQ/MNP5@#",
+"@#CONNECT 1200/ARQ/V.42@#",
+"@#CONNECT 1200/ARQ/V.42bis@#",
+"@#CONNECT 1200/ARQ/V22 /MNP4@#",
+"@#CONNECT 1200/ARQ/V22 /MNP5@#",
+"@#CONNECT 1200/ARQ/V22 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22 /V42 @#",
+"@#CONNECT 1200/ARQ/V22 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22 /V42b@#",
+"@#CONNECT 1200/ARQ/V22/MNP4@#",
+"@#CONNECT 1200/ARQ/V22/MNP5@#",
+"@#CONNECT 1200/ARQ/V22/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22/V42 @#",
+"@#CONNECT 1200/ARQ/V22/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22/V42b@#",
+"@#CONNECT 1200/ARQ/V22b /MNP4@#",
+"@#CONNECT 1200/ARQ/V22b /MNP5@#",
+"@#CONNECT 1200/ARQ/V22b /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22b /V42 @#",
+"@#CONNECT 1200/ARQ/V22b /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22b /V42b@#",
+"@#CONNECT 1200/ARQ/V22b/MNP4@#",
+"@#CONNECT 1200/ARQ/V22b/MNP5@#",
+"@#CONNECT 1200/ARQ/V22b/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22b/V42 @#",
+"@#CONNECT 1200/ARQ/V22b/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22b/V42b@#",
+"@#CONNECT 1200/ARQ/V32 /MNP4@#",
+"@#CONNECT 1200/ARQ/V32 /MNP5@#",
+"@#CONNECT 1200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42 @#",
+"@#CONNECT 1200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42b@#",
+"@#CONNECT 1200/ARQ/V32 /MNP4@#",
+"@#CONNECT 1200/ARQ/V32 /MNP5@#",
+"@#CONNECT 1200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42 @#",
+"@#CONNECT 1200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42b@#",
+"@#CONNECT 1200/ARQ/V32b /MNP4@#",
+"@#CONNECT 1200/ARQ/V32b /MNP5@#",
+"@#CONNECT 1200/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32b /V42 @#",
+"@#CONNECT 1200/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32b /V42b@#",
+"@#CONNECT 1200/ARQ/V32b/MNP4@#",
+"@#CONNECT 1200/ARQ/V32b/MNP5@#",
+"@#CONNECT 1200/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32b/V42 @#",
+"@#CONNECT 1200/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32b/V42b@#",
+"@#CONNECT 1200/ARQ/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V42 @#",
+"@#CONNECT 1200/ARQ/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V42b@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 @#",
+"@#CONNECT 1200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42b@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 @#",
+"@#CONNECT 1200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42b@#",
+"@#CONNECT 1200/ARQ@#",
+"@#CONNECT 1200/COMP@#",
+"@#CONNECT 1200/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200/LAP-M@#",
+"@#CONNECT 1200/LAPM/COMP@#",
+"@#CONNECT 1200/LAPM/V42BIS@#",
+"@#CONNECT 1200/LAPM@#",
+"@#CONNECT 1200/MNP COMPRESSED@#",
+"@#CONNECT 1200/MNP@#",
+"@#CONNECT 1200/NONE@#",
+"@#CONNECT 1200/NOR@#",
+"@#CONNECT 1200/REL-LAPM-COMP@#",
+"@#CONNECT 1200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200/REL-LAPM@#",
+"@#CONNECT 1200/REL-MNP-COMP@#",
+"@#CONNECT 1200/REL-MNP@#",
+"@#CONNECT 1200/REL-V.42@#",
+"@#CONNECT 1200/REL 1@# ",
+"@#CONNECT 1200/REL 2@# ",
+"@#CONNECT 1200/REL 3@# ",
+"@#CONNECT 1200/REL 4@# ",
+"@#CONNECT 1200/REL 5@# ",
+"@#CONNECT 1200/REL COMP@#",
+"@#CONNECT 1200/REL COMPRESSED@#",
+"@#CONNECT 1200/REL/COMP@#",
+"@#CONNECT 1200/REL@#",
+"@#CONNECT 1200/RELC@#",
+"@#CONNECT 1200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 1200/RELIABLE/LAPM@#",
+"@#CONNECT 1200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 1200/RELIABLE/MNP@#",
+"@#CONNECT 1200/V42@#",
+"@#CONNECT 1200/V42B@#",
+"@#CONNECT 1200/V42BIS@#",
+"@#CONNECT 1200@#",
+"@#CONNECT 12000 ALT / MNP5@#",
+"@#CONNECT 12000 ALT /MNP 5@#",
+"@#CONNECT 12000 ALT@#",
+"@#CONNECT 12000 EC/V42@#",
+"@#CONNECT 12000 EC/V42BIS@#",
+"@#CONNECT 12000 EC@#",
+"@#CONNECT 12000 LAPM / V.42bis@#",
+"@#CONNECT 12000 LAPM /V.42bis@#",
+"@#CONNECT 12000 LAPM COMPRESSED@#",
+"@#CONNECT 12000 LAPM@#",
+"@#CONNECT 12000 REL/MNP5@#",
+"@#CONNECT 12000 REL/V42@#",
+"@#CONNECT 12000 REL/V42BIS@#",
+"@#CONNECT 12000 REL@#",
+"@#CONNECT 12000 RELIABLE COMPRESSED@#",
+"@#CONNECT 12000 RELIABLE@#",
+"@#CONNECT 12000/ARQ/CELL /MNP4@#",
+"@#CONNECT 12000/ARQ/CELL /MNP5@#",
+"@#CONNECT 12000/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/CELL /V42 @#",
+"@#CONNECT 12000/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/CELL /V42b@#",
+"@#CONNECT 12000/ARQ/CELL/MNP4@#",
+"@#CONNECT 12000/ARQ/CELL/MNP5@#",
+"@#CONNECT 12000/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/CELL/V42 @#",
+"@#CONNECT 12000/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/CELL/V42b@#",
+"@#CONNECT 12000/ARQ/MNP4@#",
+"@#CONNECT 12000/ARQ/MNP5@#",
+"@#CONNECT 12000/ARQ/V.34/MNP4@#",
+"@#CONNECT 12000/ARQ/V.34/MNP5@#",
+"@#CONNECT 12000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V.34/V42 @#",
+"@#CONNECT 12000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V.34/V42b@#",
+"@#CONNECT 12000/ARQ/V.42@#",
+"@#CONNECT 12000/ARQ/V.42bis@#",
+"@#CONNECT 12000/ARQ/V32b /MNP4@#",
+"@#CONNECT 12000/ARQ/V32b /MNP5@#",
+"@#CONNECT 12000/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V32b /V42 @#",
+"@#CONNECT 12000/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V32b /V42b@#",
+"@#CONNECT 12000/ARQ/V32b/MNP4@#",
+"@#CONNECT 12000/ARQ/V32b/MNP5@#",
+"@#CONNECT 12000/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V32b/V42 @#",
+"@#CONNECT 12000/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V32b/V42b@#",
+"@#CONNECT 12000/ARQ/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V42 @#",
+"@#CONNECT 12000/ARQ/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V42b@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP4@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP5@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 @#",
+"@#CONNECT 12000/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42b@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP4@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP5@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 @#",
+"@#CONNECT 12000/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42b@#",
+"@#CONNECT 12000/ARQ@#",
+"@#CONNECT 12000/COMP@#",
+"@#CONNECT 12000/LAP-M/COMPRESSION@#",
+"@#CONNECT 12000/LAP-M@#",
+"@#CONNECT 12000/LAPM/COMP@#",
+"@#CONNECT 12000/LAPM/V42BIS@#",
+"@#CONNECT 12000/LAPM@#",
+"@#CONNECT 12000/MNP COMPRESSED@#",
+"@#CONNECT 12000/MNP@#",
+"@#CONNECT 12000/NONE@#",
+"@#CONNECT 12000/NOR@#",
+"@#CONNECT 12000/REL-LAPM-COMP@#",
+"@#CONNECT 12000/REL-LAPM V.42 BIS@#",
+"@#CONNECT 12000/REL-LAPM@#",
+"@#CONNECT 12000/REL-MNP-COMP@#",
+"@#CONNECT 12000/REL-MNP@#",
+"@#CONNECT 12000/REL-V.42@#",
+"@#CONNECT 12000/REL COMP@#",
+"@#CONNECT 12000/REL COMPRESSED@#",
+"@#CONNECT 12000/REL/COMP@#",
+"@#CONNECT 12000/REL@#",
+"@#CONNECT 12000/RELC@#",
+"@#CONNECT 12000/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 12000/RELIABLE/LAPM@#",
+"@#CONNECT 12000/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 12000/RELIABLE/MNP@#",
+"@#CONNECT 12000/V42@#",
+"@#CONNECT 12000/V42B@#",
+"@#CONNECT 12000/V42BIS@#",
+"@#CONNECT 12000@#",
+"@#CONNECT 12000T/V42BIS@#",
+"@#CONNECT 1200T/V42BIS@#",
+"@#CONNECT 1200TX/75RX REL/MNP5@#",
+"@#CONNECT 1200TX/75RX REL@#",
+"@#CONNECT 1200TX/75RX/ARQ@#",
+"@#CONNECT 1200TX/75RX/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200TX/75RX/LAP-M@#",
+"@#CONNECT 1200TX/75RX/LAPM/COMP@#",
+"@#CONNECT 1200TX/75RX/LAPM@#",
+"@#CONNECT 1200TX/75RX/MNP@#",
+"@#CONNECT 1200TX/75RX/NONE@#",
+"@#CONNECT 1200TX/75RX/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200TX/75RX/REL/COMP@#",
+"@#CONNECT 1200TX/75RX/REL@#",
+"@#CONNECT 1200TX/75RX/V42@#",
+"@#CONNECT 1200TX/75RX/V42BIS@#",
+"@#CONNECT 1200TX/75RX@#",
+"@#CONNECT 12200/ARQ/V.34/MNP4@#",
+"@#CONNECT 12200/ARQ/V.34/MNP5@#",
+"@#CONNECT 12200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 12200/ARQ/V.34/V42 @#",
+"@#CONNECT 12200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 12200/ARQ/V.34/V42b@#",
+"@#CONNECT 12200@#",
+"@#CONNECT 1275@#",
+"@#CONNECT 128000/ARQ/MLP /X.75/V42b@#",
+"@#CONNECT 128000/ARQ/MLP /X.75@#",
+"@#CONNECT 128000@#",
+"@#CONNECT 14400 ALT / MNP5@#",
+"@#CONNECT 14400 ALT /MNP 5@#",
+"@#CONNECT 14400 ALT@#",
+"@#CONNECT 14400 EC/V42@#",
+"@#CONNECT 14400 EC/V42BIS@#",
+"@#CONNECT 14400 EC@#",
+"@#CONNECT 14400 LAPM / V.42bis@#",
+"@#CONNECT 14400 LAPM /V.42bis@#",
+"@#CONNECT 14400 LAPM COMPRESSED@#",
+"@#CONNECT 14400 LAPM@#",
+"@#CONNECT 14400 NORMAL@#",
+"@#CONNECT 14400 REL/MNP5@#",
+"@#CONNECT 14400 REL/V42@#",
+"@#CONNECT 14400 REL/V42BIS@#",
+"@#CONNECT 14400 REL@#",
+"@#CONNECT 14400 RELIABLE COMPRESSED@#",
+"@#CONNECT 14400 RELIABLE@#",
+"@#CONNECT 14400 V.42@#",
+"@#CONNECT 14400/ARQ/CELL /MNP4@#",
+"@#CONNECT 14400/ARQ/CELL /MNP5@#",
+"@#CONNECT 14400/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/CELL /V42 @#",
+"@#CONNECT 14400/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/CELL /V42b@#",
+"@#CONNECT 14400/ARQ/CELL/MNP4@#",
+"@#CONNECT 14400/ARQ/CELL/MNP5@#",
+"@#CONNECT 14400/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/CELL/V42 @#",
+"@#CONNECT 14400/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/CELL/V42b@#",
+"@#CONNECT 14400/ARQ/MNP4@#",
+"@#CONNECT 14400/ARQ/MNP5@#",
+"@#CONNECT 14400/ARQ/V.34/MNP4@#",
+"@#CONNECT 14400/ARQ/V.34/MNP5@#",
+"@#CONNECT 14400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V.34/V42 @#",
+"@#CONNECT 14400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V.34/V42b@#",
+"@#CONNECT 14400/ARQ/V.42@#",
+"@#CONNECT 14400/ARQ/V.42bis@#",
+"@#CONNECT 14400/ARQ/V32b /MNP4@#",
+"@#CONNECT 14400/ARQ/V32b /MNP5@#",
+"@#CONNECT 14400/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V32b /V42 @#",
+"@#CONNECT 14400/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V32b /V42b@#",
+"@#CONNECT 14400/ARQ/V32b/MNP4@#",
+"@#CONNECT 14400/ARQ/V32b/MNP5@#",
+"@#CONNECT 14400/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V32b/V42 @#",
+"@#CONNECT 14400/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V32b/V42b@#",
+"@#CONNECT 14400/ARQ/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V42 @#",
+"@#CONNECT 14400/ARQ/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V42b@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 @#",
+"@#CONNECT 14400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42b@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 @#",
+"@#CONNECT 14400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42b@#",
+"@#CONNECT 14400/ARQ@#",
+"@#CONNECT 14400/COMP@#",
+"@#CONNECT 14400/LAP-M/COMPRESSION@#",
+"@#CONNECT 14400/LAP-M@#",
+"@#CONNECT 14400/LAPM/COMP@#",
+"@#CONNECT 14400/LAPM/V42BIS@#",
+"@#CONNECT 14400/LAPM@#",
+"@#CONNECT 14400/MNP COMPRESSED@#",
+"@#CONNECT 14400/MNP@#",
+"@#CONNECT 14400/NONE@#",
+"@#CONNECT 14400/NOR@#",
+"@#CONNECT 14400/REL-LAPM-COMP@#",
+"@#CONNECT 14400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 14400/REL-LAPM@#",
+"@#CONNECT 14400/REL-MNP-COMP@#",
+"@#CONNECT 14400/REL-MNP@#",
+"@#CONNECT 14400/REL-V.42@#",
+"@#CONNECT 14400/REL COMP@#",
+"@#CONNECT 14400/REL COMPRESSED@#",
+"@#CONNECT 14400/REL/COMP@#",
+"@#CONNECT 14400/REL@#",
+"@#CONNECT 14400/RELC@#",
+"@#CONNECT 14400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 14400/RELIABLE/LAPM@#",
+"@#CONNECT 14400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 14400/RELIABLE/MNP@#",
+"@#CONNECT 14400/V42@#",
+"@#CONNECT 14400/V42B@#",
+"@#CONNECT 14400/V42BIS@#",
+"@#CONNECT 14400@#",
+"@#CONNECT 14400T RELIABLE@#",
+"@#CONNECT 14400T V.42@#",
+"@#CONNECT 14400T/V42BIS@#",
+"@#CONNECT 14600/ARQ/V.34/MNP4@#",
+"@#CONNECT 14600/ARQ/V.34/MNP5@#",
+"@#CONNECT 14600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 14600/ARQ/V.34/V42 @#",
+"@#CONNECT 14600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 14600/ARQ/V.34/V42b@#",
+"@#CONNECT 14600@#",
+"@#CONNECT 16000 EC/V42BIS@#",
+"@#CONNECT 16800 EC/V42@#",
+"@#CONNECT 16800 EC/V42BIS@#",
+"@#CONNECT 16800 EC@#",
+"@#CONNECT 16800 LAPM COMPRESSED@#",
+"@#CONNECT 16800 LAPM@#",
+"@#CONNECT 16800 REL/MNP5@#",
+"@#CONNECT 16800 REL/V42@#",
+"@#CONNECT 16800 REL/V42BIS@#",
+"@#CONNECT 16800 REL@#",
+"@#CONNECT 16800 RELIABLE COMPRESSED@#",
+"@#CONNECT 16800 RELIABLE@#",
+"@#CONNECT 16800/ARQ/MNP4@#",
+"@#CONNECT 16800/ARQ/MNP5@#",
+"@#CONNECT 16800/ARQ/V.34/MNP4@#",
+"@#CONNECT 16800/ARQ/V.34/MNP5@#",
+"@#CONNECT 16800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/V.34/V42 @#",
+"@#CONNECT 16800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/V.34/V42b@#",
+"@#CONNECT 16800/ARQ/V.42@#",
+"@#CONNECT 16800/ARQ/V.42bis@#",
+"@#CONNECT 16800/ARQ/V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/V42 @#",
+"@#CONNECT 16800/ARQ/V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/V42b@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 @#",
+"@#CONNECT 16800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42b@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 @#",
+"@#CONNECT 16800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42b@#",
+"@#CONNECT 16800/ARQ@#",
+"@#CONNECT 16800/COMP@#",
+"@#CONNECT 16800/LAP-M/COMPRESSION@#",
+"@#CONNECT 16800/LAP-M@#",
+"@#CONNECT 16800/LAPM/COMP@#",
+"@#CONNECT 16800/LAPM/V42BIS@#",
+"@#CONNECT 16800/LAPM@#",
+"@#CONNECT 16800/MNP COMPRESSED@#",
+"@#CONNECT 16800/MNP@#",
+"@#CONNECT 16800/NONE@#",
+"@#CONNECT 16800/NOR@#",
+"@#CONNECT 16800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 16800/REL-LAPM@#",
+"@#CONNECT 16800/REL-V.42@#",
+"@#CONNECT 16800/REL COMP@#",
+"@#CONNECT 16800/REL/COMP@#",
+"@#CONNECT 16800/REL@#",
+"@#CONNECT 16800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 16800/RELIABLE/LAPM@#",
+"@#CONNECT 16800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 16800/RELIABLE/MNP@#",
+"@#CONNECT 16800/V42@#",
+"@#CONNECT 16800/V42BIS@#",
+"@#CONNECT 16800@#",
+"@#CONNECT 16800T/V42BIS@#",
+"@#CONNECT 17000/ARQ/V.34/MNP4@#",
+"@#CONNECT 17000/ARQ/V.34/MNP5@#",
+"@#CONNECT 17000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 17000/ARQ/V.34/V42 @#",
+"@#CONNECT 17000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 17000/ARQ/V.34/V42b@#",
+"@#CONNECT 17000@#",
+"@#CONNECT 19200 ALT / MNP5@#",
+"@#CONNECT 19200 ALT /MNP 5@#",
+"@#CONNECT 19200 ALT@#",
+"@#CONNECT 19200 EC/BIS@#",
+"@#CONNECT 19200 EC/V42@#",
+"@#CONNECT 19200 EC/V42BIZ@#",
+"@#CONNECT 19200 EC@#",
+"@#CONNECT 19200 LAPM / V.42bis@#",
+"@#CONNECT 19200 LAPM /V.42bis@#",
+"@#CONNECT 19200 LAPM COMPRESSED@#",
+"@#CONNECT 19200 LAPM@#",
+"@#CONNECT 19200 REL/MNP5@#",
+"@#CONNECT 19200 REL/V42@#",
+"@#CONNECT 19200 REL/V42BIS@#",
+"@#CONNECT 19200 REL@#",
+"@#CONNECT 19200 RELIABLE COMPRESSED@#",
+"@#CONNECT 19200 RELIABLE@#",
+"@#CONNECT 19200/ARQ/MNP4@#",
+"@#CONNECT 19200/ARQ/MNP5@#",
+"@#CONNECT 19200/ARQ/V.34/MNP4@#",
+"@#CONNECT 19200/ARQ/V.34/MNP5@#",
+"@#CONNECT 19200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/V.34/V42 @#",
+"@#CONNECT 19200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/V.34/V42b@#",
+"@#CONNECT 19200/ARQ/V.42@#",
+"@#CONNECT 19200/ARQ/V.42bis@#",
+"@#CONNECT 19200/ARQ/V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/V42 @#",
+"@#CONNECT 19200/ARQ/V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/V42b@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 @#",
+"@#CONNECT 19200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42b@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 @#",
+"@#CONNECT 19200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42b@#",
+"@#CONNECT 19200/ARQ@#",
+"@#CONNECT 19200/COMP@#",
+"@#CONNECT 19200/LAP-M/COMPRESSION@#",
+"@#CONNECT 19200/LAP-M@#",
+"@#CONNECT 19200/LAPM/COMP@#",
+"@#CONNECT 19200/LAPM/V42BIS@#",
+"@#CONNECT 19200/LAPM@#",
+"@#CONNECT 19200/MNP COMPRESSED@#",
+"@#CONNECT 19200/MNP@#",
+"@#CONNECT 19200/NONE@#",
+"@#CONNECT 19200/NOR@#",
+"@#CONNECT 19200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 19200/REL-LAPM@#",
+"@#CONNECT 19200/REL-V.42@#",
+"@#CONNECT 19200/REL COMP@#",
+"@#CONNECT 19200/REL/COMP@#",
+"@#CONNECT 19200/REL@#",
+"@#CONNECT 19200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 19200/RELIABLE/LAPM@#",
+"@#CONNECT 19200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 19200/RELIABLE/MNP@#",
+"@#CONNECT 19200/V.110@#",
+"@#CONNECT 19200/V42@#",
+"@#CONNECT 19200/V42BIS@#",
+"@#CONNECT 19200@#",
+"@#CONNECT 19200T/V42BIS@#",
+"@#CONNECT 19400/ARQ/V.34/MNP4@#",
+"@#CONNECT 19400/ARQ/V.34/MNP5@#",
+"@#CONNECT 19400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 19400/ARQ/V.34/V42 @#",
+"@#CONNECT 19400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 19400/ARQ/V.34/V42b@#",
+"@#CONNECT 19400@#",
+"@#CONNECT 21600 LAPM COMPRESSED@#",
+"@#CONNECT 21600 LAPM@#",
+"@#CONNECT 21600 REL/MNP5@#",
+"@#CONNECT 21600 REL@#",
+"@#CONNECT 21600 RELIABLE COMPRESSED@#",
+"@#CONNECT 21600 RELIABLE@#",
+"@#CONNECT 21600/ARQ/V.34/MNP4@#",
+"@#CONNECT 21600/ARQ/V.34/MNP5@#",
+"@#CONNECT 21600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 21600/ARQ/V.34/V42 @#",
+"@#CONNECT 21600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 21600/ARQ/V.34/V42b@#",
+"@#CONNECT 21600/ARQ@#",
+"@#CONNECT 21600/COMP@#",
+"@#CONNECT 21600/LAP-M/COMPRESSION@#",
+"@#CONNECT 21600/LAP-M@#",
+"@#CONNECT 21600/LAPM/COMP@#",
+"@#CONNECT 21600/LAPM/V42BIS@#",
+"@#CONNECT 21600/LAPM@#",
+"@#CONNECT 21600/MNP COMPRESSED@#",
+"@#CONNECT 21600/MNP@#",
+"@#CONNECT 21600/NONE@#",
+"@#CONNECT 21600/NOR@#",
+"@#CONNECT 21600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 21600/REL-LAPM@#",
+"@#CONNECT 21600/REL-V.42@#",
+"@#CONNECT 21600/REL COMP@#",
+"@#CONNECT 21600/REL/COMP@#",
+"@#CONNECT 21600/REL@#",
+"@#CONNECT 21600/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 21600/RELIABLE/LAPM@#",
+"@#CONNECT 21600/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 21600/RELIABLE/MNP@#",
+"@#CONNECT 21600/V42@#",
+"@#CONNECT 21600/V42BIS@#",
+"@#CONNECT 21600@#",
+"@#CONNECT 21600T/V42BIS@#",
+"@#CONNECT 21800/ARQ/V.34/MNP4@#",
+"@#CONNECT 21800/ARQ/V.34/MNP5@#",
+"@#CONNECT 21800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 21800/ARQ/V.34/V42 @#",
+"@#CONNECT 21800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 21800/ARQ/V.34/V42b@#",
+"@#CONNECT 21800@#",
+"@#CONNECT 230400/ARQ@#",
+"@#CONNECT 230400/LAP-M@#",
+"@#CONNECT 230400/LAPM/COMP@#",
+"@#CONNECT 230400/LAPM@#",
+"@#CONNECT 230400/MNP@#",
+"@#CONNECT 230400/NONE@#",
+"@#CONNECT 230400/REL/COMP@#",
+"@#CONNECT 230400/REL@#",
+"@#CONNECT 230400/V42BIS@#",
+"@#CONNECT 230400@#",
+"@#CONNECT 240/MNP@#",
+"@#CONNECT 2400 @#",
+"@#CONNECT 2400 ALT / MNP5@#",
+"@#CONNECT 2400 ALT /MNP 5@#",
+"@#CONNECT 2400 ALT@#",
+"@#CONNECT 2400 EC/V42@#",
+"@#CONNECT 2400 EC/V42BIS@#",
+"@#CONNECT 2400 EC@#",
+"@#CONNECT 2400 LAPM / V.42bis@#",
+"@#CONNECT 2400 LAPM /V.42bis@#",
+"@#CONNECT 2400 LAPM COMPRESSED@#",
+"@#CONNECT 2400 LAPM@#",
+"@#CONNECT 2400 NORMAL@#",
+"@#CONNECT 2400 REL/MNP5@#",
+"@#CONNECT 2400 REL/V42@#",
+"@#CONNECT 2400 REL/V42BIS@#",
+"@#CONNECT 2400 REL@#",
+"@#CONNECT 2400 RELIABLE COMPRESSED@#",
+"@#CONNECT 2400 RELIABLE@#",
+"@#CONNECT 2400 V.42@#",
+"@#CONNECT 2400/ARQ/CELL /MNP4@#",
+"@#CONNECT 2400/ARQ/CELL /MNP5@#",
+"@#CONNECT 2400/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/CELL /V42 @#",
+"@#CONNECT 2400/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/CELL /V42b@#",
+"@#CONNECT 2400/ARQ/CELL/MNP4@#",
+"@#CONNECT 2400/ARQ/CELL/MNP5@#",
+"@#CONNECT 2400/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/CELL/V42 @#",
+"@#CONNECT 2400/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/CELL/V42b@#",
+"@#CONNECT 2400/ARQ/MNP4@#",
+"@#CONNECT 2400/ARQ/MNP5@#",
+"@#CONNECT 2400/ARQ/V.34/MNP4@#",
+"@#CONNECT 2400/ARQ/V.34/MNP5@#",
+"@#CONNECT 2400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V.34/V42 @#",
+"@#CONNECT 2400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V.34/V42b@#",
+"@#CONNECT 2400/ARQ/V.42@#",
+"@#CONNECT 2400/ARQ/V.42bis@#",
+"@#CONNECT 2400/ARQ/V22b /MNP4@#",
+"@#CONNECT 2400/ARQ/V22b /MNP5@#",
+"@#CONNECT 2400/ARQ/V22b /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V22b /V42 @#",
+"@#CONNECT 2400/ARQ/V22b /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V22b /V42b@#",
+"@#CONNECT 2400/ARQ/V22b/MNP4@#",
+"@#CONNECT 2400/ARQ/V22b/MNP5@#",
+"@#CONNECT 2400/ARQ/V22b/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V22b/V42 @#",
+"@#CONNECT 2400/ARQ/V22b/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V22b/V42b@#",
+"@#CONNECT 2400/ARQ/V32 /MNP4@#",
+"@#CONNECT 2400/ARQ/V32 /MNP5@#",
+"@#CONNECT 2400/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42 @#",
+"@#CONNECT 2400/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42b@#",
+"@#CONNECT 2400/ARQ/V32 /MNP4@#",
+"@#CONNECT 2400/ARQ/V32 /MNP5@#",
+"@#CONNECT 2400/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42 @#",
+"@#CONNECT 2400/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42b@#",
+"@#CONNECT 2400/ARQ/V32b /MNP4@#",
+"@#CONNECT 2400/ARQ/V32b /MNP5@#",
+"@#CONNECT 2400/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32b /V42 @#",
+"@#CONNECT 2400/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32b /V42b@#",
+"@#CONNECT 2400/ARQ/V32b/MNP4@#",
+"@#CONNECT 2400/ARQ/V32b/MNP5@#",
+"@#CONNECT 2400/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32b/V42 @#",
+"@#CONNECT 2400/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32b/V42b@#",
+"@#CONNECT 2400/ARQ/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V42 @#",
+"@#CONNECT 2400/ARQ/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V42b@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 @#",
+"@#CONNECT 2400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42b@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 @#",
+"@#CONNECT 2400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42b@#",
+"@#CONNECT 2400/ARQ@#",
+"@#CONNECT 2400/COMP@#",
+"@#CONNECT 2400/LAP-M/COMPRESSION@#",
+"@#CONNECT 2400/LAP-M@#",
+"@#CONNECT 2400/LAPM/COMP@#",
+"@#CONNECT 2400/LAPM/V42BIS@#",
+"@#CONNECT 2400/LAPM@#",
+"@#CONNECT 2400/MNP COMPRESSED@#",
+"@#CONNECT 2400/MNP@#",
+"@#CONNECT 2400/NONE@#",
+"@#CONNECT 2400/NOR@#",
+"@#CONNECT 2400/REL-LAPM-COMP@#",
+"@#CONNECT 2400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 2400/REL-LAPM@#",
+"@#CONNECT 2400/REL-MNP-COMP@#",
+"@#CONNECT 2400/REL-MNP@#",
+"@#CONNECT 2400/REL-V.42@#",
+"@#CONNECT 2400/REL 1@# ",
+"@#CONNECT 2400/REL 2@# ",
+"@#CONNECT 2400/REL 3@# ",
+"@#CONNECT 2400/REL 4@# ",
+"@#CONNECT 2400/REL 5@# ",
+"@#CONNECT 2400/REL COMP@#",
+"@#CONNECT 2400/REL COMPRESSED@#",
+"@#CONNECT 2400/REL/COMP@#",
+"@#CONNECT 2400/REL@#",
+"@#CONNECT 2400/RELC@#",
+"@#CONNECT 2400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 2400/RELIABLE/LAPM@#",
+"@#CONNECT 2400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 2400/RELIABLE/MNP@#",
+"@#CONNECT 2400/V42@#",
+"@#CONNECT 2400/V42B@#",
+"@#CONNECT 2400/V42BIS@#",
+"@#CONNECT 2400@#",
+"@#CONNECT 24000 LAPM COMPRESSED@#",
+"@#CONNECT 24000 LAPM@#",
+"@#CONNECT 24000 REL/MNP5@#",
+"@#CONNECT 24000 REL@#",
+"@#CONNECT 24000 RELIABLE COMPRESSED@#",
+"@#CONNECT 24000 RELIABLE@#",
+"@#CONNECT 24000/ARQ/V.34/MNP4@#",
+"@#CONNECT 24000/ARQ/V.34/MNP5@#",
+"@#CONNECT 24000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 24000/ARQ/V.34/V42 @#",
+"@#CONNECT 24000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 24000/ARQ/V.34/V42b@#",
+"@#CONNECT 24000/ARQ@#",
+"@#CONNECT 24000/COMP@#",
+"@#CONNECT 24000/LAP-M/COMPRESSION@#",
+"@#CONNECT 24000/LAP-M@#",
+"@#CONNECT 24000/LAPM/COMP@#",
+"@#CONNECT 24000/LAPM/V42BIS@#",
+"@#CONNECT 24000/LAPM@#",
+"@#CONNECT 24000/MNP COMPRESSED@#",
+"@#CONNECT 24000/MNP@#",
+"@#CONNECT 24000/NONE@#",
+"@#CONNECT 24000/NOR@#",
+"@#CONNECT 24000/REL-LAPM V.42 BIS@#",
+"@#CONNECT 24000/REL-LAPM@#",
+"@#CONNECT 24000/REL-V.42@#",
+"@#CONNECT 24000/REL COMP@#",
+"@#CONNECT 24000/REL/COMP@#",
+"@#CONNECT 24000/REL@#",
+"@#CONNECT 24000/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 24000/RELIABLE/LAPM@#",
+"@#CONNECT 24000/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 24000/RELIABLE/MNP@#",
+"@#CONNECT 24000/V42@#",
+"@#CONNECT 24000/V42BIS@#",
+"@#CONNECT 24000@#",
+"@#CONNECT 24000T/V42BIS@#",
+"@#CONNECT 2400T/V42BIS@#",
+"@#CONNECT 24200/ARQ/V.34/MNP4@#",
+"@#CONNECT 24200/ARQ/V.34/MNP5@#",
+"@#CONNECT 24200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 24200/ARQ/V.34/V42 @#",
+"@#CONNECT 24200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 24200/ARQ/V.34/V42b@#",
+"@#CONNECT 24200@#",
+"@#CONNECT 2600/ARQ/V.34/MNP4@#",
+"@#CONNECT 2600/ARQ/V.34/MNP5@#",
+"@#CONNECT 2600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 2600/ARQ/V.34/V42 @#",
+"@#CONNECT 2600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 2600/ARQ/V.34/V42b@#",
+"@#CONNECT 2600@#",
+"@#CONNECT 26400 LAPM COMPRESSED<cR>#",
+"@#CONNECT 26400 LAPM@#",
+"@#CONNECT 26400 REL/MNP5@#",
+"@#CONNECT 26400 REL@#",
+"@#CONNECT 26400 RELIABLE COMPRESSED<cR>#",
+"@#CONNECT 26400 RELIABLE@#",
+"@#CONNECT 26400/ARQ/V.34/MNP4@#",
+"@#CONNECT 26400/ARQ/V.34/MNP5@#",
+"@#CONNECT 26400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 26400/ARQ/V.34/V42 @#",
+"@#CONNECT 26400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 26400/ARQ/V.34/V42b@#",
+"@#CONNECT 26400/ARQ@#",
+"@#CONNECT 26400/COMP@#",
+"@#CONNECT 26400/LAP-M/COMPRESSION@#",
+"@#CONNECT 26400/LAP-M@#",
+"@#CONNECT 26400/LAPM/COMP@#",
+"@#CONNECT 26400/LAPM/V42BIS@#",
+"@#CONNECT 26400/LAPM@#",
+"@#CONNECT 26400/MNP COMPRESSED@#",
+"@#CONNECT 26400/MNP@#",
+"@#CONNECT 26400/NONE@#",
+"@#CONNECT 26400/NOR@#",
+"@#CONNECT 26400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 26400/REL-LAPM@#",
+"@#CONNECT 26400/REL-V.42@#",
+"@#CONNECT 26400/REL COMP@#",
+"@#CONNECT 26400/REL/COMP@#",
+"@#CONNECT 26400/REL@#",
+"@#CONNECT 26400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 26400/RELIABLE/LAPM@#",
+"@#CONNECT 26400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 26400/RELIABLE/MNP@#",
+"@#CONNECT 26400/V42@#",
+"@#CONNECT 26400/V42BIS@#",
+"@#CONNECT 26400@#",
+"@#CONNECT 26400T/V42BIS@#",
+"@#CONNECT 26600/ARQ/V.34/MNP4@#",
+"@#CONNECT 26600/ARQ/V.34/MNP5@#",
+"@#CONNECT 26600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 26600/ARQ/V.34/V42 @#",
+"@#CONNECT 26600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 26600/ARQ/V.34/V42b@#",
+"@#CONNECT 26600@#",
+"@#CONNECT 26800/MNP COMPRESSED@#",
+"@#CONNECT 28800 LAPM COMPRESSED@#",
+"@#CONNECT 28800 LAPM@#",
+"@#CONNECT 28800 REL/MNP5@#",
+"@#CONNECT 28800 REL@#",
+"@#CONNECT 28800 RELIABLE COMPRESSED@#",
+"@#CONNECT 28800 RELIABLE@#",
+"@#CONNECT 28800/ARQ/V.34/MNP4@#",
+"@#CONNECT 28800/ARQ/V.34/MNP5@#",
+"@#CONNECT 28800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 28800/ARQ/V.34/V42 @#",
+"@#CONNECT 28800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 28800/ARQ/V.34/V42b@#",
+"@#CONNECT 28800/ARQ@#",
+"@#CONNECT 28800/COMP@#",
+"@#CONNECT 28800/LAP-M/COMPRESSION@#",
+"@#CONNECT 28800/LAP-M@#",
+"@#CONNECT 28800/LAPM/COMP@#",
+"@#CONNECT 28800/LAPM/V42BIS@#",
+"@#CONNECT 28800/LAPM@#",
+"@#CONNECT 28800/MNP COMPRESSED@#",
+"@#CONNECT 28800/MNP@#",
+"@#CONNECT 28800/NONE@#",
+"@#CONNECT 28800/NOR@#",
+"@#CONNECT 28800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 28800/REL-LAPM@#",
+"@#CONNECT 28800/REL-V.42@#",
+"@#CONNECT 28800/REL COMP@#",
+"@#CONNECT 28800/REL/COMP@#",
+"@#CONNECT 28800/REL@#",
+"@#CONNECT 28800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 28800/RELIABLE/LAPM@#",
+"@#CONNECT 28800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 28800/RELIABLE/MNP@#",
+"@#CONNECT 28800/V42@#",
+"@#CONNECT 28800/V42BIS@#",
+"@#CONNECT 28800@#",
+"@#CONNECT 28800T/V42BIS@#",
+"@#CONNECT 29000/ARQ/V.34/MNP4@#",
+"@#CONNECT 29000/ARQ/V.34/MNP5@#",
+"@#CONNECT 29000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 29000/ARQ/V.34/V42 @#",
+"@#CONNECT 29000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 29000/ARQ/V.34/V42b@#",
+"@#CONNECT 29000@#",
+"@#CONNECT 300 ALT / MNP5@#",
+"@#CONNECT 300 ALT /MNP 5@#",
+"@#CONNECT 300 ALT@#",
+"@#CONNECT 300 EC/V42BIS@#",
+"@#CONNECT 300 EC@#",
+"@#CONNECT 300 LAPM / V.42bis@#",
+"@#CONNECT 300 LAPM /V.42bis@#",
+"@#CONNECT 300 LAPM@#",
+"@#CONNECT 300 REL/MNP5@#",
+"@#CONNECT 300 REL@#",
+"@#CONNECT 300/ARQ/MNP4@#",
+"@#CONNECT 300/ARQ/MNP5@#",
+"@#CONNECT 300/ARQ/V.42@#",
+"@#CONNECT 300/ARQ/V.42bis@#",
+"@#CONNECT 300/ARQ/V42 /SREJ@#",
+"@#CONNECT 300/ARQ/V42 @#",
+"@#CONNECT 300/ARQ/V42b@#",
+"@#CONNECT 300/ARQ@#",
+"@#CONNECT 300/COMP@#",
+"@#CONNECT 300/LAP-M/COMPRESSION@#",
+"@#CONNECT 300/LAP-M@#",
+"@#CONNECT 300/LAPM/COMP@#",
+"@#CONNECT 300/LAPM/V42BIS@#",
+"@#CONNECT 300/LAPM@#",
+"@#CONNECT 300/MNP COMPRESSED@#",
+"@#CONNECT 300/MNP@#",
+"@#CONNECT 300/NONE@#",
+"@#CONNECT 300/NOR@#",
+"@#CONNECT 300/REL-LAPM V.42 BIS@#",
+"@#CONNECT 300/REL-LAPM@#",
+"@#CONNECT 300/REL-MNP@#",
+"@#CONNECT 300/REL-V.42@#",
+"@#CONNECT 300/REL 1@# ",
+"@#CONNECT 300/REL 2@# ",
+"@#CONNECT 300/REL 3@# ",
+"@#CONNECT 300/REL 4@# ",
+"@#CONNECT 300/REL 5@# ",
+"@#CONNECT 300/REL COMP@#",
+"@#CONNECT 300/REL COMPRESSED@#",
+"@#CONNECT 300/REL/COMP@#",
+"@#CONNECT 300/REL@#",
+"@#CONNECT 300/V42@#",
+"@#CONNECT 300/V42BIS@#",
+"@#CONNECT 300@#",
+"@#CONNECT 300T/V42BIS@#",
+"@#CONNECT 31200/ARQ/V.34/MNP4@#",
+"@#CONNECT 31200/ARQ/V.34/MNP5@#",
+"@#CONNECT 31200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 31200/ARQ/V.34/V42 @#",
+"@#CONNECT 31200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 31200/ARQ/V.34/V42b@#",
+"@#CONNECT 31200@#",
+"@#CONNECT 31400/ARQ/V.34/MNP4@#",
+"@#CONNECT 31400/ARQ/V.34/MNP5@#",
+"@#CONNECT 31400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 31400/ARQ/V.34/V42 @#",
+"@#CONNECT 31400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 31400/ARQ/V.34/V42b@#",
+"@#CONNECT 31400@#",
+"@#CONNECT 33600/ARQ/V.34/MNP4@#",
+"@#CONNECT 33600/ARQ/V.34/MNP5@#",
+"@#CONNECT 33600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 33600/ARQ/V.34/V42 @#",
+"@#CONNECT 33600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 33600/ARQ/V.34/V42b@#",
+"@#CONNECT 33600@#",
+"@#CONNECT 33800/ARQ/V.34/MNP4@#",
+"@#CONNECT 33800/ARQ/V.34/MNP5@#",
+"@#CONNECT 33800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 33800/ARQ/V.34/V42 @#",
+"@#CONNECT 33800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 33800/ARQ/V.34/V42b@#",
+"@#CONNECT 33800@#",
+"@#CONNECT 38400 ALT / MNP5@#",
+"@#CONNECT 38400 ALT /MNP 5@#",
+"@#CONNECT 38400 ALT@#",
+"@#CONNECT 38400 EC/V42BIS@#",
+"@#CONNECT 38400 EC@#",
+"@#CONNECT 38400 LAPM / V.42bis@#",
+"@#CONNECT 38400 LAPM /V.42bis@#",
+"@#CONNECT 38400 LAPM@#",
+"@#CONNECT 38400 REL/MNP5@#",
+"@#CONNECT 38400 REL/V42@#",
+"@#CONNECT 38400 REL@#",
+"@#CONNECT 38400/ARQ/V42 /SREJ@#",
+"@#CONNECT 38400/ARQ/V42 @#",
+"@#CONNECT 38400/ARQ/V42b@#",
+"@#CONNECT 38400/ARQ@#",
+"@#CONNECT 38400/COMP@#",
+"@#CONNECT 38400/LAP-M/COMPRESSION@#",
+"@#CONNECT 38400/LAP-M@#",
+"@#CONNECT 38400/LAPM/COMP@#",
+"@#CONNECT 38400/LAPM@#",
+"@#CONNECT 38400/MNP COMPRESSED@#",
+"@#CONNECT 38400/MNP@#",
+"@#CONNECT 38400/NONE@#",
+"@#CONNECT 38400/NOR@#",
+"@#CONNECT 38400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 38400/REL-LAPM@#",
+"@#CONNECT 38400/REL-V.42@#",
+"@#CONNECT 38400/REL COMP@#",
+"@#CONNECT 38400/REL/COMP@#",
+"@#CONNECT 38400/REL@#",
+"@#CONNECT 38400/V.110@#",
+"@#CONNECT 38400/V42@#",
+"@#CONNECT 38400/V42BIS@#",
+"@#CONNECT 38400@#",
+"@#CONNECT 38400T/V42BIS@#",
+"@#CONNECT 4800 ALT / MNP5@#",
+"@#CONNECT 4800 ALT /MNP 5@#",
+"@#CONNECT 4800 ALT@#",
+"@#CONNECT 4800 EC/V42@#",
+"@#CONNECT 4800 EC/V42BIS@#",
+"@#CONNECT 4800 EC@#",
+"@#CONNECT 4800 LAPM / V.42bis@#",
+"@#CONNECT 4800 LAPM /V.42bis@#",
+"@#CONNECT 4800 LAPM COMPRESSED@#",
+"@#CONNECT 4800 LAPM@#",
+"@#CONNECT 4800 NORMAL@#",
+"@#CONNECT 4800 REL/MNP5@#",
+"@#CONNECT 4800 REL/V42@#",
+"@#CONNECT 4800 REL/V42BIS@#",
+"@#CONNECT 4800 REL@#",
+"@#CONNECT 4800 RELIABLE COMPRESSED@#",
+"@#CONNECT 4800 RELIABLE@#",
+"@#CONNECT 4800 V.42@#",
+"@#CONNECT 4800/ARQ/CELL /MNP4@#",
+"@#CONNECT 4800/ARQ/CELL /MNP5@#",
+"@#CONNECT 4800/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/CELL /V42 @#",
+"@#CONNECT 4800/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/CELL /V42b@#",
+"@#CONNECT 4800/ARQ/CELL/MNP4@#",
+"@#CONNECT 4800/ARQ/CELL/MNP5@#",
+"@#CONNECT 4800/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/CELL/V42 @#",
+"@#CONNECT 4800/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/CELL/V42b@#",
+"@#CONNECT 4800/ARQ/MNP4@#",
+"@#CONNECT 4800/ARQ/MNP5@#",
+"@#CONNECT 4800/ARQ/V.34/MNP4@#",
+"@#CONNECT 4800/ARQ/V.34/MNP5@#",
+"@#CONNECT 4800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V.34/V42 @#",
+"@#CONNECT 4800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V.34/V42b@#",
+"@#CONNECT 4800/ARQ/V.42@#",
+"@#CONNECT 4800/ARQ/V.42bis@#",
+"@#CONNECT 4800/ARQ/V32 /MNP4@#",
+"@#CONNECT 4800/ARQ/V32 /MNP5@#",
+"@#CONNECT 4800/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42 @#",
+"@#CONNECT 4800/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42b@#",
+"@#CONNECT 4800/ARQ/V32 /MNP4@#",
+"@#CONNECT 4800/ARQ/V32 /MNP5@#",
+"@#CONNECT 4800/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42 @#",
+"@#CONNECT 4800/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42b@#",
+"@#CONNECT 4800/ARQ/V32b /MNP4@#",
+"@#CONNECT 4800/ARQ/V32b /MNP5@#",
+"@#CONNECT 4800/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32b /V42 @#",
+"@#CONNECT 4800/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32b /V42b@#",
+"@#CONNECT 4800/ARQ/V32b/MNP4@#",
+"@#CONNECT 4800/ARQ/V32b/MNP5@#",
+"@#CONNECT 4800/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32b/V42 @#",
+"@#CONNECT 4800/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32b/V42b@#",
+"@#CONNECT 4800/ARQ/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V42 @#",
+"@#CONNECT 4800/ARQ/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V42b@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 @#",
+"@#CONNECT 4800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42b@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 @#",
+"@#CONNECT 4800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42b@#",
+"@#CONNECT 4800/ARQ@#",
+"@#CONNECT 4800/COMP@#",
+"@#CONNECT 4800/LAP-M/COMPRESSION@#",
+"@#CONNECT 4800/LAP-M@#",
+"@#CONNECT 4800/LAPM/COMP@#",
+"@#CONNECT 4800/LAPM/V42BIS@#",
+"@#CONNECT 4800/LAPM@#",
+"@#CONNECT 4800/MNP COMPRESSED@#",
+"@#CONNECT 4800/MNP@#",
+"@#CONNECT 4800/NONE@#",
+"@#CONNECT 4800/NOR@#",
+"@#CONNECT 4800/REL-LAPM-COMP@#",
+"@#CONNECT 4800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 4800/REL-LAPM@#",
+"@#CONNECT 4800/REL-MNP-COMP@#",
+"@#CONNECT 4800/REL-MNP@#",
+"@#CONNECT 4800/REL-V.42@#",
+"@#CONNECT 4800/REL 1@# ",
+"@#CONNECT 4800/REL 2@# ",
+"@#CONNECT 4800/REL 3@# ",
+"@#CONNECT 4800/REL 4@# ",
+"@#CONNECT 4800/REL 5@# ",
+"@#CONNECT 4800/REL COMP@#",
+"@#CONNECT 4800/REL COMPRESSED@#",
+"@#CONNECT 4800/REL/COMP@#",
+"@#CONNECT 4800/REL@#",
+"@#CONNECT 4800/RELC@#",
+"@#CONNECT 4800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 4800/RELIABLE/LAPM@#",
+"@#CONNECT 4800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 4800/RELIABLE/MNP@#",
+"@#CONNECT 4800/V42@#",
+"@#CONNECT 4800/V42B@#",
+"@#CONNECT 4800/V42BIS@#",
+"@#CONNECT 4800@#",
+"@#CONNECT 48000@#",
+"@#CONNECT 4800T/V42BIS@#",
+"@#CONNECT 5000/ARQ/V.34/MNP4@#",
+"@#CONNECT 5000/ARQ/V.34/MNP5@#",
+"@#CONNECT 5000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 5000/ARQ/V.34/V42 @#",
+"@#CONNECT 5000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 5000/ARQ/V.34/V42b@#",
+"@#CONNECT 5000@#",
+"@#CONNECT 56000/ARQ/SLP /V120/V42b@#",
+"@#CONNECT 56000/ARQ/SLP /V120@#",
+"@#CONNECT 56000/REL@#",
+"@#CONNECT 56000@#",
+"@#CONNECT 57600 ALT / MNP5@#",
+"@#CONNECT 57600 ALT /MNP 5@#",
+"@#CONNECT 57600 ALT@#",
+"@#CONNECT 57600 EC/V42BIS@#",
+"@#CONNECT 57600 EC@#",
+"@#CONNECT 57600 LAPM / V.42bis@#",
+"@#CONNECT 57600 LAPM /V.42bis@#",
+"@#CONNECT 57600 LAPM@#",
+"@#CONNECT 57600 REL/MNP5@#",
+"@#CONNECT 57600 REL@#",
+"@#CONNECT 57600/ARQ/V42 /SREJ@#",
+"@#CONNECT 57600/ARQ/V42 @#",
+"@#CONNECT 57600/ARQ/V42b@#",
+"@#CONNECT 57600/ARQ@#",
+"@#CONNECT 57600/COMP@#",
+"@#CONNECT 57600/LAP-M/COMPRESSION@#",
+"@#CONNECT 57600/LAP-M@#",
+"@#CONNECT 57600/LAPM/COMP@#",
+"@#CONNECT 57600/LAPM@#",
+"@#CONNECT 57600/MNP COMPRESSED@#",
+"@#CONNECT 57600/MNP@#",
+"@#CONNECT 57600/NONE@#",
+"@#CONNECT 57600/NOR@#",
+"@#CONNECT 57600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 57600/REL-LAPM@#",
+"@#CONNECT 57600/REL-V.42@#",
+"@#CONNECT 57600/REL COMP@#",
+"@#CONNECT 57600/REL/COMP@#",
+"@#CONNECT 57600/REL@#",
+"@#CONNECT 57600/V42@#",
+"@#CONNECT 57600/V42BIS@#",
+"@#CONNECT 57600@#",
+"@#CONNECT 57600@#@#@#*@#COM@#",
+"@#CONNECT 57600T/V42BIS@#",
+"@#CONNECT 600 ALT / MNP5@#",
+"@#CONNECT 600 ALT /MNP 5@#",
+"@#CONNECT 600 ALT@#",
+"@#CONNECT 600 EC/V42BIS@#",
+"@#CONNECT 600 EC@#",
+"@#CONNECT 600 LAPM / V.42bis@#",
+"@#CONNECT 600 LAPM /V.42bis@#",
+"@#CONNECT 600 LAPM@#",
+"@#CONNECT 600 REL/MNP5@#",
+"@#CONNECT 600 REL@#",
+"@#CONNECT 600/ARQ/MNP4@#",
+"@#CONNECT 600/ARQ/MNP5@#",
+"@#CONNECT 600/ARQ/V.42@#",
+"@#CONNECT 600/ARQ/V.42bis@#",
+"@#CONNECT 600/ARQ@#",
+"@#CONNECT 600/COMP@#",
+"@#CONNECT 600/LAP-M/COMPRESSION@#",
+"@#CONNECT 600/LAP-M@#",
+"@#CONNECT 600/LAPM/COMP@#",
+"@#CONNECT 600/LAPM@#",
+"@#CONNECT 600/MNP COMPRESSED@#",
+"@#CONNECT 600/MNP@#",
+"@#CONNECT 600/NONE@#",
+"@#CONNECT 600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 600/REL 1@# ",
+"@#CONNECT 600/REL 2@# ",
+"@#CONNECT 600/REL 3@# ",
+"@#CONNECT 600/REL 4@# ",
+"@#CONNECT 600/REL 5@# ",
+"@#CONNECT 600/REL COMPRESSED@#",
+"@#CONNECT 600/REL/COMP@#",
+"@#CONNECT 600/REL@#",
+"@#CONNECT 600/V42@#",
+"@#CONNECT 600/V42BIS@#",
+"@#CONNECT 600@#",
+"@#CONNECT 64000/ARQ/SLP /X.75/V42b@#",
+"@#CONNECT 64000/ARQ/SLP /X.75@#",
+"@#CONNECT 64000/MNP@#",
+"@#CONNECT 64000/REL@#",
+"@#CONNECT 64000/X.70 BTX@#",
+"@#CONNECT 64000/X.70NL@#",
+"@#CONNECT 64000/X.75@#",
+"@#CONNECT 64000@#",
+"@#CONNECT 7200 ALT / MNP5@#",
+"@#CONNECT 7200 ALT /MNP 5@#",
+"@#CONNECT 7200 ALT@#",
+"@#CONNECT 7200 EC/V42@#",
+"@#CONNECT 7200 EC/V42BIS@#",
+"@#CONNECT 7200 EC@#",
+"@#CONNECT 7200 LAPM / V.42bis@#",
+"@#CONNECT 7200 LAPM /V.42bis@#",
+"@#CONNECT 7200 LAPM COMPRESSED@#",
+"@#CONNECT 7200 LAPM@#",
+"@#CONNECT 7200 REL/MNP5@#",
+"@#CONNECT 7200 REL/V42@#",
+"@#CONNECT 7200 REL/V42BIS@#",
+"@#CONNECT 7200 REL@#",
+"@#CONNECT 7200 RELIABLE@#",
+"@#CONNECT 7200/ARQ/CELL /MNP4@#",
+"@#CONNECT 7200/ARQ/CELL /MNP5@#",
+"@#CONNECT 7200/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/CELL /V42 @#",
+"@#CONNECT 7200/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/CELL /V42b@#",
+"@#CONNECT 7200/ARQ/CELL/MNP4@#",
+"@#CONNECT 7200/ARQ/CELL/MNP5@#",
+"@#CONNECT 7200/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/CELL/V42 @#",
+"@#CONNECT 7200/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/CELL/V42b@#",
+"@#CONNECT 7200/ARQ/MNP4@#",
+"@#CONNECT 7200/ARQ/MNP5@#",
+"@#CONNECT 7200/ARQ/V.34/MNP4@#",
+"@#CONNECT 7200/ARQ/V.34/MNP5@#",
+"@#CONNECT 7200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V.34/V42 @#",
+"@#CONNECT 7200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V.34/V42b@#",
+"@#CONNECT 7200/ARQ/V.42@#",
+"@#CONNECT 7200/ARQ/V.42bis@#",
+"@#CONNECT 7200/ARQ/V32 /MNP4@#",
+"@#CONNECT 7200/ARQ/V32 /MNP5@#",
+"@#CONNECT 7200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42 @#",
+"@#CONNECT 7200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42b@#",
+"@#CONNECT 7200/ARQ/V32 /MNP4@#",
+"@#CONNECT 7200/ARQ/V32 /MNP5@#",
+"@#CONNECT 7200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42 @#",
+"@#CONNECT 7200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42b@#",
+"@#CONNECT 7200/ARQ/V32b /MNP4@#",
+"@#CONNECT 7200/ARQ/V32b /MNP5@#",
+"@#CONNECT 7200/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32b /V42 @#",
+"@#CONNECT 7200/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32b /V42b@#",
+"@#CONNECT 7200/ARQ/V32b/MNP4@#",
+"@#CONNECT 7200/ARQ/V32b/MNP5@#",
+"@#CONNECT 7200/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32b/V42 @#",
+"@#CONNECT 7200/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32b/V42b@#",
+"@#CONNECT 7200/ARQ/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V42 @#",
+"@#CONNECT 7200/ARQ/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V42b@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 @#",
+"@#CONNECT 7200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42b@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 @#",
+"@#CONNECT 7200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42b@#",
+"@#CONNECT 7200/ARQ@#",
+"@#CONNECT 7200/COMP@#",
+"@#CONNECT 7200/LAP-M/COMPRESSION@#",
+"@#CONNECT 7200/LAP-M@#",
+"@#CONNECT 7200/LAPM/COMP@#",
+"@#CONNECT 7200/LAPM/V42BIS@#",
+"@#CONNECT 7200/LAPM@#",
+"@#CONNECT 7200/MNP COMPRESSED@#",
+"@#CONNECT 7200/MNP@#",
+"@#CONNECT 7200/NONE@#",
+"@#CONNECT 7200/NOR@#",
+"@#CONNECT 7200/REL-LAPM-COMP@#",
+"@#CONNECT 7200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 7200/REL-LAPM@#",
+"@#CONNECT 7200/REL-MNP-COMP@#",
+"@#CONNECT 7200/REL-MNP@#",
+"@#CONNECT 7200/REL-V.42@#",
+"@#CONNECT 7200/REL 1@# ",
+"@#CONNECT 7200/REL 2@# ",
+"@#CONNECT 7200/REL 3@# ",
+"@#CONNECT 7200/REL 4@# ",
+"@#CONNECT 7200/REL 5@# ",
+"@#CONNECT 7200/REL COMP@#",
+"@#CONNECT 7200/REL/COMP@#",
+"@#CONNECT 7200/REL@#",
+"@#CONNECT 7200/RELC@#",
+"@#CONNECT 7200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 7200/RELIABLE/LAPM@#",
+"@#CONNECT 7200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 7200/RELIABLE/MNP@#",
+"@#CONNECT 7200/V42@#",
+"@#CONNECT 7200/V42B@#",
+"@#CONNECT 7200/V42BIS@#",
+"@#CONNECT 7200@#",
+"@#CONNECT 7200T/V42BIS@#",
+"@#CONNECT 7400/ARQ/V.34/MNP4@#",
+"@#CONNECT 7400/ARQ/V.34/MNP5@#",
+"@#CONNECT 7400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 7400/ARQ/V.34/V42 @#",
+"@#CONNECT 7400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 7400/ARQ/V.34/V42b@#",
+"@#CONNECT 7400@#",
+"@#CONNECT 75/1200",
+"@#CONNECT 75/1200/ARQ@#",
+"@#CONNECT 75/1200/LAP-M/COMPRESSION@#",
+"@#CONNECT 75/1200/LAP-M@#",
+"@#CONNECT 75/1200/LAPM/COMP@#",
+"@#CONNECT 75/1200/LAPM@#",
+"@#CONNECT 75/1200/MNP@#",
+"@#CONNECT 75/1200/NONE@#",
+"@#CONNECT 75/1200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 75/1200/REL/COMP@#",
+"@#CONNECT 75/1200/REL@#",
+"@#CONNECT 75/1200/REL#",
+"@#CONNECT 75/1200/V42@#",
+"@#CONNECT 75/1200/V42BIS@#",
+"@#CONNECT 75/1200@#",
+"@#CONNECT 75TX/1200RX REL/MNP5@#",
+"@#CONNECT 75TX/1200RX REL@#",
+"@#CONNECT 75TX/1200RX/ARQ@#",
+"@#CONNECT 75TX/1200RX/LAP-M/COMPRESSION@#",
+"@#CONNECT 75TX/1200RX/LAP-M@#",
+"@#CONNECT 75TX/1200RX/LAPM/COMP@#",
+"@#CONNECT 75TX/1200RX/LAPM@#",
+"@#CONNECT 75TX/1200RX/MNP@#",
+"@#CONNECT 75TX/1200RX/NONE@#",
+"@#CONNECT 75TX/1200RX/REL-LAPM V.42 BIS@#",
+"@#CONNECT 75TX/1200RX/REL/COMP@#",
+"@#CONNECT 75TX/1200RX/REL@#",
+"@#CONNECT 75TX/1200RX/V42@#",
+"@#CONNECT 75TX/1200RX/V42BIS@#",
+"@#CONNECT 75TX/1200RX@#",
+"@#CONNECT 76800/ARQ/V42 /SREJ@#",
+"@#CONNECT 76800/ARQ/V42 @#",
+"@#CONNECT 76800/ARQ/V42b@#",
+"@#CONNECT 76800@#",
+"@#CONNECT 9600 ALT / MNP5@#",
+"@#CONNECT 9600 ALT /MNP 5@#",
+"@#CONNECT 9600 ALT@#",
+"@#CONNECT 9600 EC/V42@#",
+"@#CONNECT 9600 EC/V42BIS@#",
+"@#CONNECT 9600 EC@#",
+"@#CONNECT 9600 LAPM / V.42bis@#",
+"@#CONNECT 9600 LAPM /V.42bis@#",
+"@#CONNECT 9600 LAPM COMPRESSED@#",
+"@#CONNECT 9600 LAPM@#",
+"@#CONNECT 9600 NORMAL@#",
+"@#CONNECT 9600 REL/MNP5@#",
+"@#CONNECT 9600 REL/V42@#",
+"@#CONNECT 9600 REL/V42BIS@#",
+"@#CONNECT 9600 REL@#",
+"@#CONNECT 9600 RELIABLE COMPRESSED@#",
+"@#CONNECT 9600 RELIABLE@#",
+"@#CONNECT 9600 V.42@#",
+"@#CONNECT 9600/ARQ/CELL /MNP4@#",
+"@#CONNECT 9600/ARQ/CELL /MNP5@#",
+"@#CONNECT 9600/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/CELL /V42 @#",
+"@#CONNECT 9600/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/CELL /V42b@#",
+"@#CONNECT 9600/ARQ/CELL/MNP4@#",
+"@#CONNECT 9600/ARQ/CELL/MNP5@#",
+"@#CONNECT 9600/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/CELL/V42 @#",
+"@#CONNECT 9600/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/CELL/V42b@#",
+"@#CONNECT 9600/ARQ/MNP4@#",
+"@#CONNECT 9600/ARQ/MNP5@#",
+"@#CONNECT 9600/ARQ/V.34/MNP4@#",
+"@#CONNECT 9600/ARQ/V.34/MNP5@#",
+"@#CONNECT 9600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V.34/V42 @#",
+"@#CONNECT 9600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V.34/V42b@#",
+"@#CONNECT 9600/ARQ/V.42@#",
+"@#CONNECT 9600/ARQ/V.42bis@#",
+"@#CONNECT 9600/ARQ/V32 /MNP4@#",
+"@#CONNECT 9600/ARQ/V32 /MNP5@#",
+"@#CONNECT 9600/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42 @#",
+"@#CONNECT 9600/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42b@#",
+"@#CONNECT 9600/ARQ/V32 /MNP4@#",
+"@#CONNECT 9600/ARQ/V32 /MNP5@#",
+"@#CONNECT 9600/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42 @#",
+"@#CONNECT 9600/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42b@#",
+"@#CONNECT 9600/ARQ/V32b /MNP4@#",
+"@#CONNECT 9600/ARQ/V32b /MNP5@#",
+"@#CONNECT 9600/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32b /V42 @#",
+"@#CONNECT 9600/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32b /V42b@#",
+"@#CONNECT 9600/ARQ/V32b/MNP4@#",
+"@#CONNECT 9600/ARQ/V32b/MNP5@#",
+"@#CONNECT 9600/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32b/V42 @#",
+"@#CONNECT 9600/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32b/V42b@#",
+"@#CONNECT 9600/ARQ/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V42 @#",
+"@#CONNECT 9600/ARQ/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V42b@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP4@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP5@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 @#",
+"@#CONNECT 9600/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42b@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP4@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP5@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 @#",
+"@#CONNECT 9600/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42b@#",
+"@#CONNECT 9600/ARQ@#",
+"@#CONNECT 9600/COMP@#",
+"@#CONNECT 9600/LAP-M/COMPRESSION@#",
+"@#CONNECT 9600/LAP-M@#",
+"@#CONNECT 9600/LAPM/COMP@#",
+"@#CONNECT 9600/LAPM/V42BIS@#",
+"@#CONNECT 9600/LAPM@#",
+"@#CONNECT 9600/MNP COMPRESSED@#",
+"@#CONNECT 9600/MNP@#",
+"@#CONNECT 9600/NONE@#",
+"@#CONNECT 9600/NOR@#",
+"@#CONNECT 9600/REL-LAPM-COMP@#",
+"@#CONNECT 9600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 9600/REL-LAPM@#",
+"@#CONNECT 9600/REL-MNP-COMP@#",
+"@#CONNECT 9600/REL-MNP@#",
+"@#CONNECT 9600/REL-V.42@#",
+"@#CONNECT 9600/REL 1@# ",
+"@#CONNECT 9600/REL 2@# ",
+"@#CONNECT 9600/REL 3@# ",
+"@#CONNECT 9600/REL 4@# ",
+"@#CONNECT 9600/REL 5@# ",
+"@#CONNECT 9600/REL COMP@#",
+"@#CONNECT 9600/REL COMPRESSED@#",
+"@#CONNECT 9600/REL/COMP@#",
+"@#CONNECT 9600/REL@#",
+"@#CONNECT 9600/RELC@#",
+"@#CONNECT 9600/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 9600/RELIABLE/LAPM@#",
+"@#CONNECT 9600/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 9600/RELIABLE/MNP@#",
+"@#CONNECT 9600/V.110@#",
+"@#CONNECT 9600/V42@#",
+"@#CONNECT 9600/V42B@#",
+"@#CONNECT 9600/V42BIS@#",
+"@#CONNECT 9600@#",
+"@#CONNECT 9600T RELIABLE@#",
+"@#CONNECT 9600T V.42@#",
+"@#CONNECT 9600T/V42BIS@#",
+"@#CONNECT 9800/ARQ/V.34/MNP4@#",
+"@#CONNECT 9800/ARQ/V.34/MNP5@#",
+"@#CONNECT 9800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 9800/ARQ/V.34/V42 @#",
+"@#CONNECT 9800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 9800/ARQ/V.34/V42b@#",
+"@#CONNECT 9800@#",
+"@#CONNECT EC@#",
+"@#CONNECT FAST@#",
+"@#CONNECT LAPM COMPRESSED@#",
+"@#CONNECT LAPM@#",
+"@#CONNECT REL/MNP5@#",
+"@#CONNECT REL@#",
+"@#CONNECT RELIABLE COMPRESSED@#",
+"@#CONNECT RELIABLE@#",
+"@#CONNECT V.21/REL@#",
+"@#CONNECT/ARQ@#",
+"@#CONNECT/LAP-M/COMPRESSION@#",
+"@#CONNECT/LAP-M@#",
+"@#CONNECT/LAPM/COMP@#",
+"@#CONNECT/LAPM@#",
+"@#CONNECT/MNP@#",
+"@#CONNECT/NONE@#",
+"@#CONNECT/REL/COMP@#",
+"@#CONNECT/REL@#",
+"@#CONNECT/V42@#",
+"@#CONNECT/V42BIS@#",
+"@#CONNECT@#",
+"@#DALAYED@#",
+"@#DATA@#",
+"@#DATE = ",
+"@#DELAYED",
+"@#Delayed@#",
+"@#DELAYED@#",
+"@#Delayed@#",
+"@#DELAYED@#",
+"@#DIALING@#",
+"@#DISCONNECT@#",
+"@#Don't use this command at this situation @#",
+"@#ERROR SERIAL SPEED SETUP@#",
+"@#ERROR@#",
+"@#FAX@#",
+"@#LIB DER 00@#",
+"@#LOCKED@#",
+"@#NO ANSWER@#",
+"@#NO CARRIER@#",
+"@#NO DIAL TONE@#",
+"@#NO DIALTONE@#",
+"@#NO USER RESPONDING@#",
+"@#NOTUSED@#",
+"@#NUMBER DELAYED:TIMER@#",
+"@#NUMBER LOCKED OUT@#",
+"@#OFF HOOK@#",
+"@#OK@#",
+"@#PROTOCOL: ALT-+FCERROR@#",
+"@#PROTOCOL: ALT-CELLULAR@#",
+"@#PROTOCOL: ALT-DATA@#",
+"@#PROTOCOL: ALT-FAX@#",
+"@#PROTOCOL: ALT - CELLULAR@#",
+"@#PROTOCOL: ALT CELLULAR@#",
+"@#PROTOCOL: ALT@#",
+"@#PROTOCOL: ERROR-CONTROL/LAP-B@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB/AFT@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB/HDX@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB@#",
+"@#PROTOCOL: LAP-M/AFT@#",
+"@#PROTOCOL: LAP-M/HDX@#",
+"@#PROTOCOL: LAP-M@#",
+"@#PROTOCOL: LAP_M@#",
+"@#PROTOCOL: LAPM/AFT@#",
+"@#PROTOCOL: LAPM/HDX@#",
+"@#PROTOCOL: LAPM@#",
+"@#PROTOCOL: MNP 3,4@#",
+"@#PROTOCOL: MNP ALT@#",
+"@#PROTOCOL: MNP REL 1@#",
+"@#PROTOCOL: MNP REL 2@#",
+"@#PROTOCOL: MNP REL 3@#",
+"@#PROTOCOL: MNP REL 4@#",
+"@#PROTOCOL: MNP REL 5@#",
+"@#PROTOCOL: MNP REL@#",
+"@#PROTOCOL: MNP@#",
+"@#PROTOCOL: MNP1@#",
+"@#PROTOCOL: MNP2@#",
+"@#PROTOCOL: MNP3@#",
+"@#PROTOCOL: MNP4@#",
+"@#PROTOCOL: NONE@#",
+"@#PROTOCOL: PAD@#",
+"@#PROTOCOL: V.42BIS@#",
+"@#PROTOCOL: V42@#",
+"@#PROTOCOL: V42BIS@#",
+"@#PROTOCOL: X.25/LAPB/AFT@#",
+"@#PROTOCOL: X.25/LAPB/HDX@#",
+"@#PROTOCOL: X.25/LAPB@#",
+"@#PROTOCOL:ALT-+FCERROR@#",
+"@#PROTOCOL:ALT-CELLULAR@#",
+"@#PROTOCOL:ALT-DATA@#",
+"@#PROTOCOL:ALT-FAX@#",
+"@#PROTOCOL:ALT@#",
+"@#PROTOCOL:LAP-M@#",
+"@#PROTOCOL:LAPM@#",
+"@#PROTOCOL:MNP@#",
+"@#PROTOCOL:MNP2@#",
+"@#PROTOCOL:MNP3@#",
+"@#PROTOCOL:MNP4@#",
+"@#PROTOCOL:NONE@#",
+"@#PROTOCOL:V.42BIS@#",
+"@#PROTOCOL:V42BIS@#",
+"@#RING@#",
+"@#RING1@#",
+"@#RING2@#",
+"@#RING3@#",
+"@#RINGING@#",
+"@#RRING@#",
+"@#TEST FAILED@#",
+"@#TEST PASSED@#",
+"@#VCON@#",
+"@#VOICE@#",
+"@#Wait 5 seconds,then dial@#",
+"@OK#",
+"<ff>@",
+"<ff>@@#OK@#",
+"<h00>CLIENT",
+"#",
+"0@",
+"0<CR>",
+"0@",
+"00@",
+"01@",
+"02@",
+"03@",
+"04@",
+"05@",
+"06@",
+"07@",
+"08@",
+"1<CR>",
+"1@",
+"10@",
+"10<CR>",
+"10@",
+"10@#",
+"10@66@",
+"10@67@",
+"10@69@",
+"100@",
+"101@",
+"102@",
+"103@",
+"104@",
+"105@",
+"10L@#",
+"10LC@#",
+"10R@#",
+"10RC@#",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11@#",
+"11@66@",
+"11@67@",
+"11@69@",
+"111@",
+"112@",
+"113@",
+"114@",
+"115@",
+"116@",
+"117@",
+"118@",
+"119@",
+"11L@#",
+"11LC@#",
+"11R@#",
+"11RC@#",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12@#",
+"12@66@",
+"12@67@",
+"12@69@",
+"120@",
+"121@",
+"122@",
+"123@",
+"124@",
+"125@",
+"126@",
+"127@",
+"128@",
+"129@",
+"12L@#",
+"12LC@#",
+"12R@#",
+"12RC@#",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@#",
+"13@66@",
+"13@67@",
+"13@69@",
+"13L@#",
+"13LC@#",
+"13R@#",
+"13RC@#",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@66@",
+"14@67@",
+"14@69@",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15@66@",
+"15@67@",
+"15@69@",
+"16@",
+"16<CR>",
+"16@",
+"16@66@",
+"16@67@",
+"16@69@",
+"17@",
+"18@",
+"18<CR>",
+"18@",
+"19@",
+"19@#",
+"19L@#",
+"19LC@#",
+"19R@#",
+"19RC@#",
+"1L@#",
+"1LC@#",
+"1R@#",
+"1RC@#",
+"2@",
+"2<CR>",
+"2@",
+"20@",
+"21@",
+"21@#",
+"21L@#",
+"21LC@#",
+"21R@#",
+"21RC@#",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24@#",
+"24L@#",
+"24LC@#",
+"24R@#",
+"24RC@#",
+"25@",
+"25<CR>",
+"25@",
+"25<CR>",
+"25@",
+"25<CR>",
+"26<CR>",
+"26@",
+"26<CR>",
+"26@",
+"26<CR>",
+"26@",
+"26@#",
+"26L@#",
+"26LC@#",
+"26R@#",
+"26RC<cR>#",
+"27@",
+"28@",
+"28<CR>",
+"28@",
+"28<CR>",
+"28@",
+"28<CR>",
+"28@",
+"28@#",
+"28L@#",
+"28LC@#",
+"28R@#",
+"28RC@#",
+"29@",
+"29<CR>",
+"29@",
+"3@",
+"3<CR>",
+"3@",
+"30@",
+"31@",
+"31<CR>",
+"31@",
+"32@",
+"33@",
+"34<CR>",
+"34@",
+"35@",
+"36@",
+"36<CR>",
+"36@",
+"37@",
+"37<CR>",
+"37@",
+"38<CR>",
+"38@",
+"39@",
+"4@",
+"4<CR>",
+"4@",
+"40@",
+"40<CR>",
+"40@",
+"40@70@01@",
+"40@70@66@01@",
+"40@70@67@01@",
+"40@70@69@01@",
+"40@77@01@",
+"40@77@66@01@",
+"40@77@67@01@",
+"40@77@69@01@",
+"40@80@01@",
+"40@80@66@01@",
+"40@80@67@01@",
+"40@80@69@01@",
+"40@81@01@",
+"40@81@66@01@",
+"40@81@67@01@",
+"40@81@69@01@",
+"41@",
+"42@",
+"43@",
+"44@",
+"44<CR>",
+"44@",
+"44@70@05@",
+"44@70@66@05@",
+"44@70@67@05@",
+"44@70@69@05@",
+"44@77@05@",
+"44@77@66@05@",
+"44@77@67@05@",
+"44@77@69@05@",
+"44@80@05@",
+"44@80@66@05@",
+"44@80@67@05@",
+"44@80@69@05@",
+"44@81@05@",
+"44@81@66@05@",
+"44@81@67@05@",
+"44@81@69@05@",
+"45@",
+"45<CR>",
+"45@",
+"45@70@05@",
+"45@70@66@05@",
+"45@70@67@05@",
+"45@70@69@05@",
+"45@77@05@",
+"45@77@66@05@",
+"45@77@67@05@",
+"45@77@69@05@",
+"45@80@05@",
+"45@80@66@05@",
+"45@80@67@05@",
+"45@80@69@05@",
+"45@81@05@",
+"45@81@66@05@",
+"45@81@67@05@",
+"45@81@69@05@",
+"46@",
+"46<CR>",
+"46@",
+"46@70@05@",
+"46@70@66@05@",
+"46@70@67@05@",
+"46@70@69@05@",
+"46@77@05@",
+"46@77@66@05@",
+"46@77@67@05@",
+"46@77@69@05@",
+"46@80@05@",
+"46@80@66@05@",
+"46@80@67@05@",
+"46@80@69@05@",
+"46@81@05@",
+"46@81@66@05@",
+"46@81@67@05@",
+"46@81@69@05@",
+"47@",
+"47<CR>",
+"47@",
+"47@70@10@",
+"47@70@66@10@",
+"47@70@67@10@",
+"47@70@69@10@",
+"47@77@10@",
+"47@77@66@10@",
+"47@77@67@10@",
+"47@77@69@10@",
+"47@80@10@",
+"47@80@66@10@",
+"47@80@67@10@",
+"47@80@69@10@",
+"47@81@10@",
+"47@81@66@10@",
+"47@81@67@10@",
+"47@81@69@10@",
+"48@",
+"48<CR>",
+"48@",
+"48@70@11@",
+"48@70@66@11@",
+"48@70@67@11@",
+"48@70@69@11@",
+"48@77@11@",
+"48@77@66@11@",
+"48@77@67@11@",
+"48@77@69@11@",
+"48@80@11@",
+"48@80@66@11@",
+"48@80@67@11@",
+"48@80@69@11@",
+"48@81@11@",
+"48@81@66@11@",
+"48@81@67@11@",
+"48@81@69@11@",
+"49@",
+"49<CR>",
+"49@",
+"49@70@13@",
+"49@70@66@13@",
+"49@70@67@13@",
+"49@70@69@13@",
+"49@77@13@",
+"49@77@66@13@",
+"49@77@67@13@",
+"49@77@69@13@",
+"49@80@13@",
+"49@80@66@13@",
+"49@80@67@13@",
+"49@80@69@13@",
+"49@81@13@",
+"49@81@66@13@",
+"49@81@67@13@",
+"49@81@69@13@",
+"5@",
+"5<CR>",
+"5@",
+"5@66@",
+"5@67@",
+"5@69@",
+"50@",
+"50<CR>",
+"50@",
+"50@70@12@",
+"50@70@66@12@",
+"50@70@67@12@",
+"50@70@69@12@",
+"50@77@12@",
+"50@77@66@12@",
+"50@77@67@12@",
+"50@77@69@12@",
+"50@80@12@",
+"50@80@66@12@",
+"50@80@67@12@",
+"50@80@69@12@",
+"50@81@12@",
+"50@81@66@12@",
+"50@81@67@12@",
+"50@81@69@12@",
+"51@",
+"51<CR>",
+"51@",
+"51@70@14@",
+"51@70@66@14@",
+"51@70@67@14@",
+"51@70@69@14@",
+"51@77@14@",
+"51@77@66@14@",
+"51@77@67@14@",
+"51@77@69@14@",
+"51@80@14@",
+"51@80@66@14@",
+"51@80@67@14@",
+"51@80@69@14@",
+"51@81@14@",
+"51@81@66@14@",
+"51@81@67@14@",
+"51@81@69@14@",
+"52@",
+"52<CR>",
+"52@",
+"52@70@15@",
+"52@70@66@15@",
+"52@70@67@15@",
+"52@70@69@15@",
+"52@77@15@",
+"52@77@66@15@",
+"52@77@67@15@",
+"52@77@69@15@",
+"52@80@15@",
+"52@80@66@15@",
+"52@80@67@15@",
+"52@80@69@15@",
+"52@81@15@",
+"52@81@66@15@",
+"52@81@67@15@",
+"52@81@69@15@",
+"53@",
+"53<CR>",
+"53@",
+"53@70@59@",
+"53@70@66@59@",
+"53@70@67@59@",
+"53@70@69@59@",
+"53@77@59@",
+"53@77@66@59@",
+"53@77@67@59@",
+"53@77@69@59@",
+"53@80@59@",
+"53@80@66@59@",
+"53@80@67@59@",
+"53@80@69@59@",
+"53@81@59@",
+"53@81@66@59@",
+"53@81@67@59@",
+"53@81@69@59@",
+"54@",
+"54<CR>",
+"54@70@16@",
+"54@70@66@16@",
+"54@70@67@16@",
+"54@70@69@16@",
+"54@77@16@",
+"54@77@66@16@",
+"54@77@67@16@",
+"54@77@69@16@",
+"54@80@16@",
+"54@80@66@16@",
+"54@80@67@16@",
+"54@80@69@16@",
+"54@81@16@",
+"54@81@66@16@",
+"54@81@67@16@",
+"54@81@69@16@",
+"55@",
+"55<CR>",
+"55@",
+"55@70@61@",
+"55@70@66@61@",
+"55@70@67@61@",
+"55@70@69@61@",
+"55@77@61@",
+"55@77@66@61@",
+"55@77@67@61@",
+"55@77@69@61@",
+"55@80@61@",
+"55@80@66@61@",
+"55@80@67@61@",
+"55@80@69@61@",
+"55@81@61@",
+"55@81@66@61@",
+"55@81@67@61@",
+"55@81@69@61@",
+"56@",
+"56@70@62@",
+"56@70@66@62@",
+"56@70@67@62@",
+"56@70@69@62@",
+"56@77@62@",
+"56@77@66@62@",
+"56@77@67@62@",
+"56@77@69@62@",
+"56@80@62@",
+"56@80@66@62@",
+"56@80@67@62@",
+"56@80@69@62@",
+"56@81@62@",
+"56@81@66@62@",
+"56@81@67@62@",
+"56@81@69@62@",
+"57@",
+"57@70@63@",
+"57@70@66@63@",
+"57@70@67@63@",
+"57@70@69@63@",
+"57@77@63@",
+"57@77@66@63@",
+"57@77@67@63@",
+"57@77@69@63@",
+"57@80@63@",
+"57@80@66@63@",
+"57@80@67@63@",
+"57@80@69@63@",
+"57@81@63@",
+"57@81@66@63@",
+"57@81@67@63@",
+"57@81@69@63@",
+"58@",
+"58@70@64@",
+"58@70@66@64@",
+"58@70@67@64@",
+"58@70@69@64@",
+"58@77@64@",
+"58@77@66@64@",
+"58@77@67@64@",
+"58@77@69@64@",
+"58@80@64@",
+"58@80@66@64@",
+"58@80@67@64@",
+"58@80@69@64@",
+"58@81@64@",
+"58@81@66@64@",
+"58@81@67@64@",
+"58@81@69@64@",
+"59@",
+"5L@#",
+"5LC@#",
+"5R@#",
+"5RC@#",
+"6@",
+"6<CR>",
+"6@",
+"60@",
+"60<CR>",
+"60@",
+"61@",
+"62@",
+"63@",
+"63@66@",
+"63@67@",
+"63@69@",
+"64@",
+"64@66@",
+"64@67@",
+"64@69@",
+"65@",
+"66@",
+"66<CR>",
+"66@",
+"67@",
+"67<CR>",
+"67@",
+"68@",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"7@",
+"7<CR>",
+"7@",
+"70@",
+"70<CR>",
+"70@",
+"71@",
+"72@",
+"73@",
+"74@",
+"75@",
+"76@",
+"77@",
+"77<CR>",
+"77@",
+"78@",
+"79@",
+"8@",
+"8<CR>",
+"8@",
+"80@",
+"80<CR>",
+"80@",
+"81@",
+"82@",
+"83@",
+"84@",
+"85@",
+"86@",
+"87@",
+"88@",
+"89@",
+"9@",
+"9<CR>",
+"9@",
+"9@#",
+"90@",
+"91@",
+"92@",
+"93@",
+"94@",
+"95@",
+"96@",
+"97@",
+"98@",
+"99@",
+"9L@#",
+"9LC@#",
+"9R@#",
+"9RC@#",
+"ATE0V0",
+"AUTOSTREAM: LEVEL 1",
+"AUTOSTREAM: LEVEL 2",
+"AUTOSTREAM: LEVEL 3",
+"BLACKLISTED",
+"BUSY",
+"CARRIER",
+"CARRIER 0300",
+"CARRIER 1200",
+"CARRIER 1200/75",
+"CARRIER 1200/75/VFC",
+"CARRIER 1200/VFC",
+"CARRIER 12000",
+"CARRIER 12000/VFC",
+"CARRIER 14400",
+"CARRIER 14400/VFC",
+"CARRIER 16800",
+"CARRIER 16800 V.34",
+"CARRIER 16800/VFC",
+"CARRIER 19200",
+"CARRIER 19200 V.34",
+"CARRIER 19200/VFC",
+"CARRIER 21600",
+"CARRIER 21600 V.34",
+"CARRIER 21600/VFC",
+"CARRIER 2400",
+"CARRIER 2400/VFC",
+"CARRIER 24000",
+"CARRIER 24000 V.34",
+"CARRIER 24000/VFC",
+"CARRIER 26400",
+"CARRIER 26400 V.34",
+"CARRIER 26400/VFC",
+"CARRIER 28800",
+"CARRIER 28800 V.34",
+"CARRIER 28800/VFC",
+"CARRIER 300",
+"CARRIER 300/VFC",
+"CARRIER 4800",
+"CARRIER 4800/VFC",
+"CARRIER 7200",
+"CARRIER 7200/VFC",
+"CARRIER 75/1200",
+"CARRIER 75/1200/VFC",
+"CARRIER 9600",
+"CARRIER 9600/VFC",
+"CLIENT",
+"CLIENTSERVER",
+"COMPRESSION: ADC",
+"COMPRESSION: CLASS 5",
+"COMPRESSION: CLASS5",
+"COMPRESSION: MNP5",
+"COMPRESSION: NONE",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V42BIS",
+"COMPRESSION:CLASS5",
+"COMPRESSION:MNP5",
+"COMPRESSION:NONE",
+"COMPRESSION:V.42bis",
+"CONNECT",
+"CONNECT 0300",
+"CONNECT 0300/ARQ",
+"CONNECT 0300/LAP-M",
+"CONNECT 0300/MNP",
+"CONNECT 0300/REL",
+"CONNECT 0300/REL-5",
+"CONNECT 0300/REL-LAPM",
+"CONNECT 0300/REL-LAPM-COMP",
+"CONNECT 0300/REL-MNP",
+"CONNECT 0300/REL-MNP-COMP",
+"CONNECT 0300/REL-V.42",
+"CONNECT 0300/V42b",
+"CONNECT 0300/V42BIS",
+"CONNECT 0600",
+"CONNECT 0600/ARQ",
+"CONNECT 0600/LAP-M",
+"CONNECT 0600/LAPM",
+"CONNECT 0600/MNP",
+"CONNECT 0600/NONE",
+"CONNECT 0600/REL",
+"CONNECT 0600/REL-5",
+"CONNECT 0600/REL-LAPM",
+"CONNECT 0600/REL-LAPM-COMP",
+"CONNECT 0600/REL-MNP",
+"CONNECT 0600/REL-MNP-COMP",
+"CONNECT 0600/REL-V.42",
+"CONNECT 0600/V42",
+"CONNECT 0600/V42b",
+"CONNECT 0600/V42BIS",
+"CONNECT 115,200",
+"CONNECT 115,200/ARQ",
+"CONNECT 115,200/LAP-M",
+"CONNECT 115,200/MNP",
+"CONNECT 115,200/NONE",
+"CONNECT 115,200/REL",
+"CONNECT 115,200/REL-5",
+"CONNECT 115,200/REL-V.42",
+"CONNECT 115,200/V42",
+"CONNECT 115,200/V42b",
+"CONNECT 115,200/V42BIS",
+"CONNECT 115200",
+"CONNECT 115200/ARQ",
+"CONNECT 115200/LAP-M",
+"CONNECT 115200/LAPM",
+"CONNECT 115200/MNP",
+"CONNECT 115200/NONE",
+"CONNECT 115200/REL",
+"CONNECT 115200/REL-5",
+"CONNECT 115200/REL-LAPM",
+"CONNECT 115200/REL-LAPM-COMP",
+"CONNECT 115200/REL-MNP",
+"CONNECT 115200/REL-MNP-COMP",
+"CONNECT 115200/REL-V.42",
+"CONNECT 115200/REL/VFC",
+"CONNECT 115200/V42",
+"CONNECT 115200/V42b",
+"CONNECT 115200/V42BIS",
+"CONNECT 115200/VFC",
+"CONNECT 1200",
+"CONNECT 1200/75",
+"CONNECT 1200/75/ARQ",
+"CONNECT 1200/75/LAP-M",
+"CONNECT 1200/75/LAPM",
+"CONNECT 1200/75/MNP",
+"CONNECT 1200/75/NONE",
+"CONNECT 1200/75/REL",
+"CONNECT 1200/75/REL-5",
+"CONNECT 1200/75/REL-LAPM",
+"CONNECT 1200/75/REL-LAPM-COMP",
+"CONNECT 1200/75/REL-MNP",
+"CONNECT 1200/75/REL-MNP-COMP",
+"CONNECT 1200/75/REL-V.42",
+"CONNECT 1200/75/V42",
+"CONNECT 1200/75/V42b",
+"CONNECT 1200/75/V42BIS",
+"CONNECT 1200/ARQ",
+"CONNECT 1200/ECL",
+"CONNECT 1200/ECLC",
+"CONNECT 1200/LAP-M",
+"CONNECT 1200/LAPM",
+"CONNECT 1200/MNP",
+"CONNECT 1200/NONE",
+"CONNECT 1200/REL",
+"CONNECT 1200/REL-5",
+"CONNECT 1200/REL-LAPM",
+"CONNECT 1200/REL-LAPM-COMP",
+"CONNECT 1200/REL-LAPM V.42 BIS",
+"CONNECT 1200/REL-MNP",
+"CONNECT 1200/REL-MNP-COMP",
+"CONNECT 1200/REL-MNP 5",
+"CONNECT 1200/REL-V.42",
+"CONNECT 1200/V42",
+"CONNECT 1200/V42b",
+"CONNECT 1200/V42BIS",
+"CONNECT 12000",
+"CONNECT 12000/ARQ",
+"CONNECT 12000/ECL",
+"CONNECT 12000/ECLC",
+"CONNECT 12000/LAP-M",
+"CONNECT 12000/LAPM",
+"CONNECT 12000/MNP",
+"CONNECT 12000/NONE",
+"CONNECT 12000/REL",
+"CONNECT 12000/REL-5",
+"CONNECT 12000/REL-LAPM",
+"CONNECT 12000/REL-LAPM-COMP",
+"CONNECT 12000/REL-LAPM V.42 BIS",
+"CONNECT 12000/REL-MNP",
+"CONNECT 12000/REL-MNP-COMP",
+"CONNECT 12000/REL-MNP 5",
+"CONNECT 12000/REL-V.42",
+"CONNECT 12000/V42",
+"CONNECT 12000/V42b",
+"CONNECT 12000/V42BIS",
+"CONNECT 1200TX/75RX",
+"CONNECT 1200TX/75RX/ARQ",
+"CONNECT 1200TX/75RX/LAP-M",
+"CONNECT 1200TX/75RX/LAPM",
+"CONNECT 1200TX/75RX/MNP",
+"CONNECT 1200TX/75RX/NONE",
+"CONNECT 1200TX/75RX/REL",
+"CONNECT 1200TX/75RX/REL-5",
+"CONNECT 1200TX/75RX/REL-LAPM",
+"CONNECT 1200TX/75RX/REL-LAPM-COMP",
+"CONNECT 1200TX/75RX/REL-MNP",
+"CONNECT 1200TX/75RX/REL-MNP-COMP",
+"CONNECT 1200TX/75RX/REL-V.42",
+"CONNECT 1200TX/75RX/V42",
+"CONNECT 1200TX/75RX/V42b",
+"CONNECT 1200TX/75RX/V42BIS",
+"CONNECT 14400",
+"CONNECT 14400/ARQ",
+"CONNECT 14400/ECL",
+"CONNECT 14400/ECLC",
+"CONNECT 14400/LAP-M",
+"CONNECT 14400/LAPM",
+"CONNECT 14400/MNP",
+"CONNECT 14400/NONE",
+"CONNECT 14400/REL",
+"CONNECT 14400/REL-5",
+"CONNECT 14400/REL-LAPM",
+"CONNECT 14400/REL-LAPM-COMP",
+"CONNECT 14400/REL-LAPM V.42 BIS",
+"CONNECT 14400/REL-MNP",
+"CONNECT 14400/REL-MNP-COMP",
+"CONNECT 14400/REL-MNP 5",
+"CONNECT 14400/REL-V.42",
+"CONNECT 14400/V42",
+"CONNECT 14400/V42b",
+"CONNECT 14400/V42BIS",
+"CONNECT 14400/VFC",
+"CONNECT 16800",
+"CONNECT 16800/ARQ",
+"CONNECT 16800/ECL",
+"CONNECT 16800/ECLC",
+"CONNECT 16800/LAP-M",
+"CONNECT 16800/LAPM",
+"CONNECT 16800/MNP",
+"CONNECT 16800/NONE",
+"CONNECT 16800/REL",
+"CONNECT 16800/REL-5",
+"CONNECT 16800/REL-LAPM",
+"CONNECT 16800/REL-LAPM-COMP",
+"CONNECT 16800/REL-MNP",
+"CONNECT 16800/REL-MNP-COMP",
+"CONNECT 16800/REL-V.42",
+"CONNECT 16800/V42",
+"CONNECT 16800/V42b",
+"CONNECT 16800/V42BIS",
+"CONNECT 16800/VFC",
+"CONNECT 19200",
+"CONNECT 19200/ARQ",
+"CONNECT 19200/ECL",
+"CONNECT 19200/ECLC",
+"CONNECT 19200/LAP-M",
+"CONNECT 19200/LAPM",
+"CONNECT 19200/MNP",
+"CONNECT 19200/NONE",
+"CONNECT 19200/REL",
+"CONNECT 19200/REL-5",
+"CONNECT 19200/REL-LAPM",
+"CONNECT 19200/REL-LAPM-COMP",
+"CONNECT 19200/REL-MNP",
+"CONNECT 19200/REL-MNP-COMP",
+"CONNECT 19200/REL-V.42",
+"CONNECT 19200/V42",
+"CONNECT 19200/V42b",
+"CONNECT 19200/V42BIS",
+"CONNECT 19200/VFC",
+"CONNECT 21600",
+"CONNECT 21600/ARQ",
+"CONNECT 21600/ECL",
+"CONNECT 21600/ECLC",
+"CONNECT 21600/LAP-M",
+"CONNECT 21600/LAPM",
+"CONNECT 21600/MNP",
+"CONNECT 21600/NONE",
+"CONNECT 21600/REL",
+"CONNECT 21600/REL-5",
+"CONNECT 21600/REL-LAPM-COMP",
+"CONNECT 21600/REL-MNP",
+"CONNECT 21600/REL-MNP-COMP",
+"CONNECT 21600/REL-REL-LAPM",
+"CONNECT 21600/REL-V.42",
+"CONNECT 21600/V42",
+"CONNECT 21600/V42b",
+"CONNECT 21600/V42BIS",
+"CONNECT 21600/VFC",
+"CONNECT 230400",
+"CONNECT 230400/ARQ",
+"CONNECT 230400/LAP-M",
+"CONNECT 230400/MNP",
+"CONNECT 230400/NONE",
+"CONNECT 230400/REL",
+"CONNECT 230400/V42",
+"CONNECT 230400/V42b",
+"CONNECT 230400/V42BIS",
+"CONNECT 2400",
+"CONNECT 2400/ARQ",
+"CONNECT 2400/ECL",
+"CONNECT 2400/ECLC",
+"CONNECT 2400/LAP-M",
+"CONNECT 2400/LAPM",
+"CONNECT 2400/MNP",
+"CONNECT 2400/NONE",
+"CONNECT 2400/REL",
+"CONNECT 2400/REL-5",
+"CONNECT 2400/REL-LAPM",
+"CONNECT 2400/REL-LAPM-COMP",
+"CONNECT 2400/REL-LAPM V.42 BIS",
+"CONNECT 2400/REL-MNP",
+"CONNECT 2400/REL-MNP-COMP",
+"CONNECT 2400/REL-MNP 5",
+"CONNECT 2400/REL-V.42",
+"CONNECT 2400/V42",
+"CONNECT 2400/V42b",
+"CONNECT 2400/V42BIS",
+"CONNECT 24000",
+"CONNECT 24000/ARQ",
+"CONNECT 24000/ECL",
+"CONNECT 24000/ECLC",
+"CONNECT 24000/LAP-M",
+"CONNECT 24000/LAPM",
+"CONNECT 24000/MNP",
+"CONNECT 24000/NONE",
+"CONNECT 24000/REL",
+"CONNECT 24000/REL-5",
+"CONNECT 24000/REL-LAPM",
+"CONNECT 24000/REL-LAPM-COMP",
+"CONNECT 24000/REL-MNP",
+"CONNECT 24000/REL-MNP-COMP",
+"CONNECT 24000/REL-V.42",
+"CONNECT 24000/V42",
+"CONNECT 24000/V42b",
+"CONNECT 24000/V42BIS",
+"CONNECT 24000/VFC",
+"CONNECT 26400",
+"CONNECT 26400/ARQ",
+"CONNECT 26400/ECL",
+"CONNECT 26400/ECLC",
+"CONNECT 26400/LAP-M",
+"CONNECT 26400/LAPM",
+"CONNECT 26400/MNP",
+"CONNECT 26400/NONE",
+"CONNECT 26400/REL",
+"CONNECT 26400/REL-5",
+"CONNECT 26400/REL-LAPM",
+"CONNECT 26400/REL-LAPM-COMP",
+"CONNECT 26400/REL-MNP",
+"CONNECT 26400/REL-MNP-COMP",
+"CONNECT 26400/REL-V.42",
+"CONNECT 26400/V42",
+"CONNECT 26400/V42b",
+"CONNECT 26400/V42BIS",
+"CONNECT 26400/VFC",
+"CONNECT 28800",
+"CONNECT 28800/ARQ",
+"CONNECT 28800/ARQ/VFC",
+"CONNECT 28800/ECL",
+"CONNECT 28800/ECLC",
+"CONNECT 28800/LAP-M",
+"CONNECT 28800/LAPM",
+"CONNECT 28800/MNP",
+"CONNECT 28800/NONE",
+"CONNECT 28800/REL",
+"CONNECT 28800/REL-5",
+"CONNECT 28800/REL-LAPM",
+"CONNECT 28800/REL-LAPM-COMP",
+"CONNECT 28800/REL-MNP",
+"CONNECT 28800/REL-MNP-COMP",
+"CONNECT 28800/REL-V.42",
+"CONNECT 28800/REL/VFC",
+"CONNECT 28800/V42",
+"CONNECT 28800/V42b",
+"CONNECT 28800/V42BIS",
+"CONNECT 28800/VFC",
+"CONNECT 300",
+"CONNECT 300/ARQ",
+"CONNECT 300/ECL",
+"CONNECT 300/ECLC",
+"CONNECT 300/LAP-M",
+"CONNECT 300/LAPM",
+"CONNECT 300/MNP",
+"CONNECT 300/NONE",
+"CONNECT 300/REL",
+"CONNECT 300/REL-5",
+"CONNECT 300/REL-LAPM",
+"CONNECT 300/REL-LAPM-COMP",
+"CONNECT 300/REL-LAPM V.42 BIS",
+"CONNECT 300/REL-MNP",
+"CONNECT 300/REL-MNP-COMP",
+"CONNECT 300/REL-MNP 5",
+"CONNECT 300/REL-V.42",
+"CONNECT 300/V42",
+"CONNECT 300/V42b",
+"CONNECT 300/V42BIS",
+"CONNECT 38400",
+"CONNECT 38400/ARQ",
+"CONNECT 38400/LAP-M",
+"CONNECT 38400/LAPM",
+"CONNECT 38400/MNP",
+"CONNECT 38400/NONE",
+"CONNECT 38400/REL",
+"CONNECT 38400/REL-5",
+"CONNECT 38400/REL-LAPM",
+"CONNECT 38400/REL-LAPM-COMP",
+"CONNECT 38400/REL-MNP",
+"CONNECT 38400/REL-MNP-COMP",
+"CONNECT 38400/REL-V.42",
+"CONNECT 38400/REL/VFC",
+"CONNECT 38400/V42",
+"CONNECT 38400/V42b",
+"CONNECT 38400/V42BIS",
+"CONNECT 38400/VFC",
+"CONNECT 4800",
+"CONNECT 4800/ARQ",
+"CONNECT 4800/ECL",
+"CONNECT 4800/ECLC",
+"CONNECT 4800/LAP-M",
+"CONNECT 4800/LAPM",
+"CONNECT 4800/MNP",
+"CONNECT 4800/NONE",
+"CONNECT 4800/REL",
+"CONNECT 4800/REL-5",
+"CONNECT 4800/REL-LAPM",
+"CONNECT 4800/REL-LAPM-COMP",
+"CONNECT 4800/REL-LAPM V.42 BIS",
+"CONNECT 4800/REL-MNP",
+"CONNECT 4800/REL-MNP-COMP",
+"CONNECT 4800/REL-MNP 5",
+"CONNECT 4800/REL-V.42",
+"CONNECT 4800/V42",
+"CONNECT 4800/V42b",
+"CONNECT 4800/V42BIS",
+"CONNECT 57600",
+"CONNECT 57600/ARQ",
+"CONNECT 57600/LAP-M",
+"CONNECT 57600/LAPM",
+"CONNECT 57600/MNP",
+"CONNECT 57600/NONE",
+"CONNECT 57600/REL",
+"CONNECT 57600/REL-5",
+"CONNECT 57600/REL-LAPM",
+"CONNECT 57600/REL-LAPM-COMP",
+"CONNECT 57600/REL-MNP",
+"CONNECT 57600/REL-MNP-COMP",
+"CONNECT 57600/REL-V.42",
+"CONNECT 57600/REL/VFC",
+"CONNECT 57600/V42",
+"CONNECT 57600/V42b",
+"CONNECT 57600/V42BIS",
+"CONNECT 57600/VFC",
+"CONNECT 600",
+"CONNECT 600/ARQ",
+"CONNECT 600/ECL",
+"CONNECT 600/ECLC",
+"CONNECT 600/LAP-M",
+"CONNECT 600/LAPM",
+"CONNECT 600/MNP",
+"CONNECT 600/NONE",
+"CONNECT 600/REL",
+"CONNECT 600/REL-5",
+"CONNECT 600/REL-LAPM",
+"CONNECT 600/REL-LAPM-COMP",
+"CONNECT 600/REL-LAPM V.42 BIS",
+"CONNECT 600/REL-MNP",
+"CONNECT 600/REL-MNP-COMP",
+"CONNECT 600/REL-MNP 5",
+"CONNECT 600/REL-V.42",
+"CONNECT 600/V42",
+"CONNECT 600/V42b",
+"CONNECT 600/V42BIS",
+"CONNECT 7200",
+"CONNECT 7200/ARQ",
+"CONNECT 7200/ECL",
+"CONNECT 7200/ECLC",
+"CONNECT 7200/LAP-M",
+"CONNECT 7200/LAPM",
+"CONNECT 7200/MNP",
+"CONNECT 7200/NONE",
+"CONNECT 7200/REL",
+"CONNECT 7200/REL-5",
+"CONNECT 7200/REL-LAPM",
+"CONNECT 7200/REL-LAPM-COMP",
+"CONNECT 7200/REL-LAPM V.42 BIS",
+"CONNECT 7200/REL-MNP",
+"CONNECT 7200/REL-MNP-COMP",
+"CONNECT 7200/REL-MNP 5",
+"CONNECT 7200/REL-V.42",
+"CONNECT 7200/V42",
+"CONNECT 7200/V42b",
+"CONNECT 7200/V42BIS",
+"CONNECT 75/1200",
+"CONNECT 75/1200/ARQ",
+"CONNECT 75/1200/LAP-M",
+"CONNECT 75/1200/MNP",
+"CONNECT 75/1200/NONE",
+"CONNECT 75/1200/REL",
+"CONNECT 75/1200/REL-5",
+"CONNECT 75/1200/REL-LAPM",
+"CONNECT 75/1200/REL-LAPM-COMP",
+"CONNECT 75/1200/REL-MNP",
+"CONNECT 75/1200/REL-MNP-COMP",
+"CONNECT 75/1200/REL-V.42",
+"CONNECT 75/1200/V42",
+"CONNECT 75/1200/V42b",
+"CONNECT 75/1200/V42BIS",
+"CONNECT 75TX/1200RX",
+"CONNECT 75TX/1200RX/ARQ",
+"CONNECT 75TX/1200RX/LAP-M",
+"CONNECT 75TX/1200RX/LAPM",
+"CONNECT 75TX/1200RX/MNP",
+"CONNECT 75TX/1200RX/NONE",
+"CONNECT 75TX/1200RX/REL",
+"CONNECT 75TX/1200RX/REL-5",
+"CONNECT 75TX/1200RX/REL-LAPM",
+"CONNECT 75TX/1200RX/REL-LAPM-COMP",
+"CONNECT 75TX/1200RX/REL-MNP",
+"CONNECT 75TX/1200RX/REL-MNP-COMP",
+"CONNECT 75TX/1200RX/REL-V.42",
+"CONNECT 75TX/1200RX/V42",
+"CONNECT 75TX/1200RX/V42b",
+"CONNECT 75TX/1200RX/V42BIS",
+"CONNECT 9600",
+"CONNECT 9600/ARQ",
+"CONNECT 9600/ECL",
+"CONNECT 9600/ECLC",
+"CONNECT 9600/LAP-M",
+"CONNECT 9600/LAPM",
+"CONNECT 9600/MNP",
+"CONNECT 9600/NONE",
+"CONNECT 9600/REL",
+"CONNECT 9600/REL-5",
+"CONNECT 9600/REL-LAPM",
+"CONNECT 9600/REL-LAPM-COMP",
+"CONNECT 9600/REL-LAPM V.42 BIS",
+"CONNECT 9600/REL-MNP",
+"CONNECT 9600/REL-MNP-COMP",
+"CONNECT 9600/REL-MNP 5",
+"CONNECT 9600/REL-V.42",
+"CONNECT 9600/V42",
+"CONNECT 9600/V42b",
+"CONNECT 9600/V42BIS",
+"CONNECT ECL",
+"CONNECT ECLC",
+"CONNECT/ARQ",
+"CONNECT/LAP-M",
+"CONNECT/LAPM",
+"CONNECT/MNP",
+"CONNECT/NONE",
+"CONNECT/REL",
+"CONNECT/V42",
+"CONNECT/V42b",
+"CONNECT/V42BIS",
+"DATA",
+"DELAYED",
+"DIALING",
+"ERROR",
+"FAX",
+"HOST DRIVER TIMEOUT",
+"mdmblatz.inf:HKR, Responses,",
+"mdmbsb.inf:HKR, Responses,",
+"mdmbsch.inf:HKR, Responses,",
+"mdmhaeus.inf:HKR, Responses,",
+"mdmico.inf:HKR, Responses,",
+"mdminsys.inf:HKR, Responses,",
+"mdmke.inf:HKR, Responses,",
+"mdmmart.inf:HKR, Responses,",
+"mdmneuhs.inf:HKR, Responses,",
+"mdmrfi.inf:HKR, Responses,",
+"mdmtelnk.inf:HKR, Responses,",
+"mdmtger.inf:HKR, Responses,",
+"mdmtkr.inf:HKR, Responses,",
+"mdmusrcr.inf:HKR,Responses,",
+"mdmusrg.inf:HKR,Responses,",
+"mdmusrsp.inf:HKR,Responses,",
+"mdmusrwp.inf:HKR,Responses,",
+"mdmwoer.inf:HKR, Responses,",
+"MESG = ",
+"NAME = ",
+"NMBR = ",
+"NO ANSWER",
+"NO CARRIER",
+"NO DIAL TONE",
+"NO DIALTONE",
+"NoResponse",
+"OK",
+"PROTOCOL: ALT",
+"PROTOCOL: ALT-CELLULAR",
+"PROTOCOL: ALT - CELLULAR",
+"PROTOCOL: ERROR-CONTROL/LAPB",
+"PROTOCOL: ERROR-CONTROL/LAPB/AFT",
+"PROTOCOL: ERROR-CONTROL/LAPB/HDX",
+"PROTOCOL: LAP-M",
+"PROTOCOL: LAP-M/AFT",
+"PROTOCOL: LAP-M/ETC",
+"PROTOCOL: LAP-M/HDX",
+"PROTOCOL: LAPM",
+"PROTOCOL: LAPM/AFT",
+"PROTOCOL: LAPM/HDX",
+"PROTOCOL: MNP",
+"PROTOCOL: MNP 2",
+"PROTOCOL: MNP 2, 4",
+"PROTOCOL: MNP 3",
+"PROTOCOL: MNP 3, 4",
+"PROTOCOL: MNP 4",
+"PROTOCOL: MNP10",
+"PROTOCOL: MNP2",
+"PROTOCOL: MNP3",
+"PROTOCOL: MNP4",
+"PROTOCOL: NONE",
+"PROTOCOL: X.25/LAPB",
+"PROTOCOL: X.25/LAPB/AFT",
+"PROTOCOL: X.25/LAPB/HDX",
+"PROTOCOL:MNP 2, 4",
+"PROTOCOL:MNP 3, 4",
+"PROTOCOL:NONE",
+"RING",
+"RINGING",
+"RRING",
+"TIME = ",
+"VOICE",
+NULL
+};
+
+
+const TCHAR *rgpszActualResp[] =
+{
+ "0@",
+ "2@",
+ "3@",
+ "4@",
+ "6@",
+ "7@",
+ "8@",
+ "@",
+ "@#BUSY@#",
+ "@#CONNECT 1200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 1200/ARQ/LAPM/MNP5@#",
+ "@#CONNECT 1200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 1200/ARQ/LAPM@#",
+ "@#CONNECT 1200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 1200/ARQ/MNP/V42BIS@#",
+ "@#CONNECT 1200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 1200/ARQ/V32/LAPM@#",
+ "@#CONNECT 1200/ARQ/V32/MNP@#",
+ "@#CONNECT 1200/ARQ/V34/LAPM@#",
+ "@#CONNECT 1200/ARQ/V34/MNP@#",
+ "@#CONNECT 1200/ARQ@#",
+ "@#CONNECT 1200/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 12000/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V32/MNP@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V34/MNP@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ@#",
+ "@#CONNECT 12000/HST/NONE@#",
+ "@#CONNECT 12000/V32/NONE@#",
+ "@#CONNECT 12000/V34/NONE@#",
+ "@#CONNECT 12000/VFC/NONE@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 14400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V32/MNP@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V34/MNP@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ@#",
+ "@#CONNECT 14400/HST/NONE@#",
+ "@#CONNECT 14400/V32/NONE@#",
+ "@#CONNECT 14400/V34/NONE@#",
+ "@#CONNECT 14400/VFC/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 16800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V32/MNP@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V34/MNP@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ@#",
+ "@#CONNECT 16800/HST/NONE@#",
+ "@#CONNECT 16800/V32/NONE@#",
+ "@#CONNECT 16800/V34/NONE@#",
+ "@#CONNECT 16800/VFC/NONE@#",
+ "@#CONNECT 19200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 19200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V32/MNP@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V34/MNP@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ@#",
+ "@#CONNECT 19200/V32/NONE@#",
+ "@#CONNECT 19200/V34/NONE@#",
+ "@#CONNECT 19200/VFC/NONE@#",
+ "@#CONNECT 21600/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 21600/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V32/MNP@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V34/MNP@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ@#",
+ "@#CONNECT 21600/V32/NONE@#",
+ "@#CONNECT 21600/V34/NONE@#",
+ "@#CONNECT 21600/VFC/NONE@#",
+ "@#CONNECT 2400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 2400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/LAPM@#",
+ "@#CONNECT 2400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 2400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V32/LAPM@#",
+ "@#CONNECT 2400/ARQ/V32/MNP@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V34/MNP@#",
+ "@#CONNECT 2400/ARQ@#",
+ "@#CONNECT 2400/NONE@#",
+ "@#CONNECT 2400/V34/NONE@#",
+ "@#CONNECT 24000/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 24000/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V32/LAPM@#",
+ "@#CONNECT 24000/ARQ/V32/MNP@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V34/MNP@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 24000/ARQ@#",
+ "@#CONNECT 24000/V34/NONE@#",
+ "@#CONNECT 24000/VFC/NONE@#",
+ "@#CONNECT 26400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 26400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V32/LAPM@#",
+ "@#CONNECT 26400/ARQ/V32/MNP@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V34/MNP@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 26400/ARQ@#",
+ "@#CONNECT 26400/V34/NONE@#",
+ "@#CONNECT 26400/VFC/NONE@#",
+ "@#CONNECT 28800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 28800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V32/LAPM@#",
+ "@#CONNECT 28800/ARQ/V32/MNP@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V34/MNP@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 28800/ARQ@#",
+ "@#CONNECT 28800/V34/NONE@#",
+ "@#CONNECT 28800/VFC/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 4800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/LAPM@#",
+ "@#CONNECT 4800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V32/MNP@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V34/MNP@#",
+ "@#CONNECT 4800/ARQ@#",
+ "@#CONNECT 4800/HST/NONE@#",
+ "@#CONNECT 4800/V32/NONE@#",
+ "@#CONNECT 4800/V34/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 7200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/LAPM@#",
+ "@#CONNECT 7200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V32/MNP@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V34/MNP@#",
+ "@#CONNECT 7200/ARQ@#",
+ "@#CONNECT 7200/HST/NONE@#",
+ "@#CONNECT 7200/V32/NONE@#",
+ "@#CONNECT 7200/V34/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 9600/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V32/MNP@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V34/MNP@#",
+ "@#CONNECT 9600/ARQ@#",
+ "@#CONNECT 9600/HST/NONE@#",
+ "@#CONNECT 9600/V32/NONE@#",
+ "@#CONNECT 9600/V34/NONE@#",
+ "@#CONNECT@#",
+ "@#ERROR@#",
+ "@#NO ANSWER@#",
+ "@#NO CARRIER@#",
+ "@#NO DIAL TONE@#",
+ "@#NO DIALTONE@#",
+ "@#OK@#",
+ "@#RING@#",
+ "@#RINGING@#",
+ "@#VOICE@#",
+ "#",
+ NULL
+};
diff --git a/private/unimodem/new/mic/sample.inf b/private/unimodem/new/mic/sample.inf
new file mode 100644
index 000000000..b07c29174
--- /dev/null
+++ b/private/unimodem/new/mic/sample.inf
@@ -0,0 +1,64 @@
+; OUT.INF
+;
+; Inf generated for a single modem.
+;
+; Created: Fri 05-24-1996 12:13:42
+; Original Inf: mdmgen.inf/[Rockwell]/%Rockwell1%
+; Manufacturer: "Rockwell"
+; Model: "14400 bps PCMCIA Data-Fax Modem"
+; Rank0ID: GEN_Apex1
+; Rank1ID: PCMCIA\RIPICAA-RC144ACL-845A
+;
+; Signature:
+; Rank0 Version M&M Flags AddReg CopyFile Ranks
+; 12342412 12222233 12334444 12234444 12244444 53265123 52366664 23466666
+
+[Version]
+LayoutFile = layout.inf
+Signature = "$CHICAGO$"
+Class = Modem
+ClassGUID = {4D36E96D-E325-11CE-BFC1-08002BE10318}
+Provider = %provider%
+
+
+[ControlFlags]
+ExcludeFromSelect = GEN_Apex1
+
+
+[Manufacturer]
+%manufacturer0% = Manufacturer0
+
+
+[Manufacturer0]
+%model0% = Model0.Install, GEN_Apex1, PCMCIA\RIPICAA-RC144ACL-845A
+
+
+[Model0.Install]
+AddReg = Model0.AddReg
+
+
+[Model0.AddReg]
+HKR,,FriendlyDriver,,Unimodem.vxd
+HKR,,DevLoader,,*VCOMM
+HKR,,ConfigDialog,,modemui.dll
+HKR,,PortSubClass,1,02
+HKR,,EnumPropPages,,"modemui.dll,EnumPropPages"
+HKR,,PortDriver,,Serial.vxd
+HKR,,Contention,,*vcd
+HKR,, DeviceType, 1, 03
+HKR, Settings, SpeakerMode_Setup,, "M3"
+HKR, Init, 1,, "AT<cr>"
+HKR, Init, 2,, "ATE0V1<cr>"
+HKR, Monitor, 1,, "ATS0=0<cr>"
+HKR, Monitor, 2,, "None"
+HKR, Answer, 1,, "ATA<cr>"
+HKR, Hangup, 1,, "ATH<cr>"
+HKR,, Reset,, "ATZ<cr>"
+HKR, Settings, Prefix,, "AT"
+HKR, Responses, "AUTOSTREAM: LEVEL 3", 1, 01, 00, 00,00,00,00, 00,00,00,00
+
+
+[Strings]
+provider = "Microsoft"
+manufacturer0 = "Rockwell"
+model0 = "14400 bps PCMCIA Data-Fax Modem"
diff --git a/private/unimodem/new/mic/sources b/private/unimodem/new/mic/sources
new file mode 100644
index 000000000..fb24df25b
--- /dev/null
+++ b/private/unimodem/new/mic/sources
@@ -0,0 +1,36 @@
+MAJORCOMP=net
+MINORCOMP=unimodem
+
+TARGETNAME=tsym
+TARGETPATH=obj
+TARGETTYPE=PROGRAM
+TARGETLIBS=\
+ $(BASEDIR)\public\sdk\lib\*\kernel32.lib \
+ $(BASEDIR)\public\sdk\lib\*\user32.lib
+
+
+INCLUDES=$(BASEDIR)\public\sdk\inc;.
+
+C_DEFINES=-DWINVER=0x0400
+
+USE_CRTDLL=1
+
+SOURCES= CHKSUM.CPP \
+ SYNC.CPP \
+ ILIST.CPP \
+ sym.cpp \
+ INI.CPP \
+ INF.CPP \
+ globals.CPP \
+ DEV.CPP \
+ tsym.CPP \
+ resp.cpp \
+ tdev.CPP \
+ mic.cpp \
+ main.cpp
+
+UMTYPE=console
+
+!IFNDEF 386_WARNING_LEVEL
+386_WARNING_LEVEL=/W3
+!ENDIF
diff --git a/private/unimodem/new/mic/sym.cpp b/private/unimodem/new/mic/sym.cpp
new file mode 100644
index 000000000..81d76e0c9
--- /dev/null
+++ b/private/unimodem/new/mic/sym.cpp
@@ -0,0 +1,316 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// SYM.C -- Implemtation for Classes:
+// CInfSymbolTable
+// CInfSymbol
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+#include "common.h"
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbol
+///////////////////////////////////////////////////////////////////////////
+
+
+CInfSymbol::CInfSymbol
+(
+ const TCHAR rgchName[],
+ UINT cchName,
+ DWORD dwChecksum,
+ const CInfSymbol * pNext
+)
+: m_rgchText(rgchName),
+ m_cchText(cchName),
+ m_dwChecksum(dwChecksum),
+ m_pNext(pNext),
+ m_pPropList(NULL)
+{
+}
+
+
+CInfSymbol::~CInfSymbol()
+{
+ // BUGBUG -- delete all the InfSymbols allocated!
+}
+
+
+// Return the text associated with this symbol as a null-terminated
+// string
+const TCHAR * CInfSymbol::GetText(void) const
+{
+ return (this) ? m_rgchText : TEXT("");
+}
+
+
+// Return the length of the text associated with this symbol
+UINT CInfSymbol::GetTextLength() const
+{
+ return (this) ? m_cchText : 0;
+}
+
+
+// Release (decrement ref-count) of this symbol
+void CInfSymbol::Release(void) const
+{
+}
+
+
+// Dump state
+void CInfSymbol::Dump(void) const
+{
+ printf("Symbol(0x%08lx) = [%s]\n", this, (this) ? m_rgchText : TEXT(""));
+}
+
+
+// --------------- SetProp ------------------
+// Not really const -- it modifies the property list
+BOOL
+CInfSymbol::SetProp(const CInfSymbol *pSymPropName, void *pvProp)
+const
+// TODO
+{
+#if 0
+ CInfSymProp * pPropRec = (CInfSymProp *) m_pPropList;
+ DWORD dwSig = pSymPropName->Checksum();
+ BOOL fRet=FALSE;
+
+ // Search for property
+ while(pPropRec)
+ {
+ const CInfSymbol *pSym = pPropRec->pSymPropName;
+ if (dwChecksum == pSym->Checksum())
+ {
+ if (!lstrcmp(pSymPropName->GetText(), pSym->GetText()))
+ {
+ // currently we don't allow you to set an already set prop.
+ ASSERT(FALSE);
+ goto end;
+ }
+ }
+ pPropRec = pPropRec->m_pNext;
+ }
+
+ // Insert property
+ pPropRec = new CInfSymProp
+ (
+ pSymPropName,
+ pvProp,
+ (CInfSymProp *) m_pPropList
+ );
+ m_pPropList = (void *) pPropRec;
+
+end:
+ return fRet;
+#endif // 0
+
+ return FALSE;
+}
+
+// --------------- GetProp ------------------
+// TODO
+BOOL
+CInfSymbol::GetProp(const CInfSymbol *pSymPropName, void **ppvProp)
+const
+{
+ return FALSE;
+}
+
+// --------------- DelProp ------------------
+// Not really const -- it modifies the property list
+// TODO
+BOOL
+CInfSymbol::DelProp(const CInfSymbol *pSymPropName)
+const
+{
+ return FALSE;
+}
+
+
+// --------------- GetOrCreatePropLoc --------------
+// Not really const -- it could modify the property list
+// TODO
+BOOL
+CInfSymbol::GetOrCreatePropLoc(
+ const CInfSymbol *pSymPropName,
+ void ***ppvProp,
+ BOOL *pfExists
+ )
+const
+{
+ static void *pv;
+ *pfExists=FALSE;
+ *ppvProp = &pv;
+
+ return TRUE;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbolTable
+///////////////////////////////////////////////////////////////////////////
+
+
+CInfSymbolTable::CInfSymbolTable(void)
+{
+ FillMemory((void*)m_rgpSym, sizeof(m_rgpSym), 0);
+ m_cSymbols=0;
+ m_pchFree = m_rgchTextStore;
+ m_pchLastFree = m_pchFree +
+ sizeof(m_rgchTextStore)/sizeof(*m_rgchTextStore)-1;
+}
+
+
+CInfSymbolTable::~CInfSymbolTable()
+{
+ mfn_EnterCrit();
+
+ // Free resources
+}
+
+
+// Look up and return the symbol with the specified text.
+// If symbol is not prestent, return NULL if (!fInsert), else
+// insert new symbol and return it.
+// This symbol MUST be released by calling its Release function
+// when it is no longer needed.
+// NULL is returned for the empty string ("")
+const CInfSymbol * CInfSymbolTable::Lookup(const TCHAR rgchName[], BOOL fInsert)
+{
+ const TCHAR *pch = rgchName;
+ const CInfSymbol *pSym = NULL;
+ const UINT cchName = lstrlen(rgchName);
+ const DWORD dwChecksum = ::Checksum
+ (
+ (BYTE *) rgchName,
+ cchName*sizeof(TCHAR)
+ );
+ const UINT u = dwChecksum % SYMTABSIZE; // we use checksum to compute hash.
+
+ if (!cchName) { goto end; }
+
+ mfn_EnterCrit();
+
+ // Look for it
+ for (pSym = m_rgpSym[u]; pSym; pSym = pSym->Next())
+ {
+ // may as well use the checksum as a quick check...
+ if (dwChecksum==pSym->Checksum())
+ {
+ if (!lstrcmp(rgchName, pSym->GetText())) goto end;
+
+ printf
+ (
+ "WARNING: CS(%s) == CS(%s) = 0x%08lx\n",
+ rgchName,
+ pSym->GetText(),
+ dwChecksum
+ );
+ }
+ }
+
+ // Didn't find it -- insert if necessary
+ ASSERT(pSym==NULL);
+ if (fInsert)
+ {
+ if ( (m_pchFree+cchName) < m_pchLastFree)
+ {
+ CopyMemory (
+ (void *) m_pchFree,
+ (const void *) rgchName,
+ (cchName+1)*sizeof(*rgchName) // incl. null term.
+ );
+ pSym = new CInfSymbol(m_pchFree, cchName, dwChecksum, m_rgpSym[u]);
+ if (pSym)
+ {
+ printf("Inserting. %s @ 0x%08lx..\n", m_pchFree, (DWORD) pSym);
+ m_pchFree += (cchName+1);
+ ASSERT(m_pchFree<=m_pchLastFree);
+ m_rgpSym[u] = pSym;
+ }
+ }
+ }
+
+ mfn_LeaveCrit();
+
+end:
+ return pSym;
+}
+
+
+// Dump state
+void CInfSymbolTable::Dump(void) const
+{
+ mfn_EnterCrit();
+
+ printf("[BEGIN SYMBOL TABLE DUMP]\n");
+ for (UINT u=0; u<SYMTABSIZE; u++)
+ {
+ const CInfSymbol *pSym = m_rgpSym[u];
+
+ if (pSym)
+ {
+ printf("---- Location 0x%08lx -----\n", u);
+ for (; pSym ; pSym = pSym->Next())
+ {
+ pSym->Dump();
+ }
+ }
+ }
+ printf("[End symbol table dump]\n");
+
+ mfn_LeaveCrit();
+
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbolList
+///////////////////////////////////////////////////////////////////////////
+
+
+// --------------------------- Find -----------------------------
+// Looks for the specified symbol, returns the list element with that symbol.
+// If ppListPrev is non-NULL, sets it to the previous list element
+// (if no previous element, sets it to NULL). If the symbol is not found,
+// *ppListPrev is not touched.
+//
+const CInfSymbolList *
+CInfSymbolList::Find
+(
+ const CInfSymbolList *pList,
+ const CInfSymbol *pSym,
+ const CInfSymbolList **ppListPrev
+)
+{
+ DWORD dwChecksum = pSym->Checksum();
+ const CInfSymbolList *pListPrev=NULL;
+
+ while(pList)
+ {
+ const CInfSymbol *pSym1 = pList->m_pSym;
+ if (dwChecksum == pSym1->Checksum())
+ {
+ if (!lstrcmp(pSym->GetText(), pSym1->GetText()))
+ {
+ // Found it ...
+ if (ppListPrev)
+ {
+ // Note, if we find the 1st element, *ppListPrev is set
+ // to NULL.
+ *ppListPrev = pListPrev;
+ }
+ goto end;
+ }
+ }
+ pListPrev = pList;
+ pList = pList->Next();
+ }
+
+end:
+
+ return pList;
+}
diff --git a/private/unimodem/new/mic/sym.h b/private/unimodem/new/mic/sym.h
new file mode 100644
index 000000000..054fcb569
--- /dev/null
+++ b/private/unimodem/new/mic/sym.h
@@ -0,0 +1,215 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// SYM.H -- Header for Classes:
+// CInfSymbolTable
+// CInfSymbol
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+#ifndef _SYM_H_
+#define _SYM_H_
+
+class CInfSymbolList;
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbol
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a symbol in the symbol table.
+// Note: Only CInfSymbolTable member functions can construct/destruct these
+// objects.
+//
+// Empty string maps to NULL symbol. So a NULL pointer is perfectly valid for
+// all member functions.
+// GetText(NULL) returns the empty string, and Checksum returns 0x0.
+// Strcmpi treats NULL pointer as the empty string.
+
+class CInfSymbol
+{
+
+public:
+
+ //-------------- GetText ------------------
+ // Return the text associated with this symbol as a null-terminated
+ // string
+ const TCHAR * GetText(void) const;
+
+ //-------------- GetTextLength ------------------
+ // Return the length of the text associated with this symbol,
+ // not counting terminating zero.
+ UINT GetTextLength() const;
+
+ //-------------- Strcmpi ------------------
+ // Case-insensitive equal
+ // -ve implies this is less-than pSym
+ int Strcmpi(const CInfSymbol *pSym) const
+ {
+ if (this && pSym)
+ {
+ return lstrcmpi(m_rgchText, pSym->m_rgchText);
+ }
+ else if (this && !pSym)
+ {
+ return 1;
+ }
+ else if (!this && pSym)
+ {
+ return -1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ //-------------- Release ------------------
+ // Release (decrement ref-count) of this symbol
+ void Release(void) const;
+
+ //-------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- Checksum ------------------
+ // Return checksum of contents
+ DWORD Checksum(void) const {return (this) ? m_dwChecksum : 0;}
+
+ // --------------- SetProp ------------------
+ BOOL SetProp(const CInfSymbol *pSymPropName, void *pvProp) const;
+
+ // --------------- GetProp ------------------
+ BOOL GetProp(const CInfSymbol *pSymPropName, void **ppvProp) const;
+
+ // --------------- GetOrCreatePropLoc --------------
+ BOOL
+ GetOrCreatePropLoc(
+ const CInfSymbol *pSymPropName,
+ void ***ppvProp,
+ BOOL *pfExists
+ )
+ const;
+
+ // --------------- DelProp ------------------
+ BOOL DelProp(const CInfSymbol *pSymPropName) const;
+
+private:
+
+ friend class CInfSymbolTable;
+
+ CInfSymbol
+ (
+ const TCHAR rgchName[],
+ UINT cchName,
+ DWORD dwChecksum,
+ const CInfSymbol *pNext
+ );
+
+ ~CInfSymbol();
+
+ const CInfSymbol *Next(void) const {return m_pNext;}
+
+ const TCHAR * m_rgchText;
+ const UINT m_cchText;
+ const DWORD m_dwChecksum;
+ const CInfSymbol * m_pNext;
+ CInfSymbolList * m_pPropList;
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbolTable
+///////////////////////////////////////////////////////////////////////////
+
+// A symbol table.
+
+static const UINT SYMTABSIZE = 1000;
+static const UINT TEXTSTORESIZE = 1000*1000;
+
+
+class CInfSymbolTable
+{
+
+public:
+
+ CInfSymbolTable(void);
+ ~CInfSymbolTable();
+
+ // TODO -- add "context" parameter to symbols -- symbols with different
+ // context will be stored separately even if their name is the same.
+ // Context is not interpreted by the symbol table, except to test for
+ // equality. When implementing this, add a context parameter to
+ // InfSymbols's constructor, and a member fn "GetContext()" to InfSymbol.
+
+ //-------------- Lookup ------------------
+ // Look up and return the symbol with the specified text
+ // This symbol must be released by calling its Release function
+ // when it is no longer needed.
+ const CInfSymbol * Lookup(const TCHAR rgchName[], BOOL fInsert);
+
+ //-------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+private:
+
+ const CInfSymbol * m_rgpSym[SYMTABSIZE];
+ TCHAR m_rgchTextStore[TEXTSTORESIZE];
+ TCHAR * m_pchFree;
+ TCHAR * m_pchLastFree;
+
+ CSync m_sync;
+ UINT m_cSymbols;
+
+ void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
+ void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
+
+};
+
+
+class CInfSymbolList : private CInfList
+{
+ CInfSymbolList
+ (
+ const CInfSymbol *pSym,
+ void *pvData,
+ const CInfSymbolList *pNext
+ )
+ : CInfList(pvData, pNext), m_pSym(pSym)
+ {
+ }
+
+ const CInfSymbolList *
+ Next (void)
+ const
+ {
+ return (const CInfSymbolList *) CInfList::Next();
+ }
+
+ const CInfSymbol * GetSym(void) {return m_pSym;}
+
+ ~CInfSymbolList () {}
+
+ // --------------------------- Find -----------------------------
+ // Looks for the specified symbol, returns the list element with that
+ // symbol. If ppListPrev is non-NULL, sets it to the previous list element
+ // (if no previous element, sets it to NULL). If the symbol is not found,
+ // *ppListPrev is not touched.
+ static
+ const CInfSymbolList *
+ Find
+ (
+ const CInfSymbolList *pList,
+ const CInfSymbol *pSym,
+ const CInfSymbolList **ppListPrev
+ );
+
+private:
+ const CInfSymbol *m_pSym;
+};
+
+#endif // _SYM_H_
diff --git a/private/unimodem/new/mic/sync.cpp b/private/unimodem/new/mic/sync.cpp
new file mode 100644
index 000000000..10f58f263
--- /dev/null
+++ b/private/unimodem/new/mic/sync.cpp
@@ -0,0 +1,35 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+#include "common.h"
+//
+// SYNC.CPP -- Implemtation for Classes:
+// CSync
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CSync
+///////////////////////////////////////////////////////////////////////////
+
+#if (TODO)
+
+//
+// Signals all the events specified in the event list and at the same
+// time distroys the list.
+//
+void CSync::mfn_SignalAndFree(SLIST *pEventList)
+{
+ while(m_pEventList)
+ {
+ SLIST pOld = m_pEventList;
+ SetEvent((HANDLE) m_pEventList->pv);
+ m_pEventList = m_pEventList->Next();
+ delete m_pOld;
+ }
+}
+#endif // TODO
diff --git a/private/unimodem/new/mic/sync.h b/private/unimodem/new/mic/sync.h
new file mode 100644
index 000000000..95f9bbe48
--- /dev/null
+++ b/private/unimodem/new/mic/sync.h
@@ -0,0 +1,148 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// SYNC.H -- Header for Classes:
+// CSync
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+#ifndef _SYNC_H_
+#define _SYNC_H_
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CSync
+///////////////////////////////////////////////////////////////////////////
+
+// Controls access to its parent object. Includes a critical section, and
+// (TODO) mechanism for waiting until all threads have finished using
+// the parent object.
+
+// Sample session (pObj is a ptr to a hypothetical parent, which implements
+// methods Load, Unload, OpenSession, CloseSession using the member CSymc
+// object):
+// pObj->Load("mdmusr.inf");
+// hSession = pObj->OpenSession();
+// ... do stuff ...
+// pObj->CloseSession(hSession);
+// hSync = pObj->Unload();
+// if (hSync) WaitForSingleObject(hSync, INFINITE);
+// CloseHandle(hSync);
+
+class CSync
+{
+
+public:
+
+ CSync(void) {InitializeCriticalSection(&m_crit);}
+
+ ~CSync()
+ {
+ EnterCriticalSection(&m_crit);
+ DeleteCriticalSection(&m_crit);
+ }
+
+ //-------------- EnterCrit ------------------
+ // Claim our critical section
+ void EnterCrit(void) const
+ {
+ EnterCriticalSection((CRITICAL_SECTION *)&m_crit);
+ }
+
+ //-------------- LeaveCrit ------------------
+ // Release our critical section
+ void LeaveCrit(void) const
+ {
+ LeaveCriticalSection((CRITICAL_SECTION *)&m_crit);
+ }
+
+#if (TODO)
+
+ BOOL BeginLoad(void)
+ {
+ }
+
+ void EndLoad(void)
+ {
+ EnterCrit();
+ ASSERT (m_eState == CSYNC_LOADING);
+ m_eState = CSYNC_LOADED;
+ LeaveCrit();
+ }
+
+ HANDLE BeginUnload(void)
+ {
+ HANDLE h=NULL;
+ EnterCrit();
+ if (m_eState == CSYNC_LOADED)
+ {
+ m_eState = CSYNC_UNLOADING;
+ }
+ else
+ {
+ fRet = FALSE;
+ }
+ LeaveCrit();
+
+ return fRet;
+ }
+
+ void EndUnload(void);
+
+ HSESSION BeginSession(void)
+ {
+ HSESSION hRet = 1;
+ EnterCrit();
+ if (m_eState==SYNC_LOADED)
+ {
+ m_uRefCount++;
+ }
+ else
+ {
+ hRet = 0;
+ }
+ LeaveCrit();
+
+ return hRet;
+ }
+
+ void EndSession(HSESSION hSession)
+ {
+ SLINST *pEventList=NULL;
+ EnterCrit();
+ ASSERT(hSession==1 && m_uRefCount);
+ m_uRefCount--;
+ if (m_eState==SYNC_UNLOADING && m_pEventList)
+ {
+ pEventList = m_pEventList;
+ m_pEventList=NULL;
+ }
+ LeaveCrit();
+
+ mfn_SignalAndFree(m_pEventList);
+ }
+
+ BOOL AddContext(HSESSION hS)
+ {
+ return FALSE;
+ }
+#endif // TODO
+
+private:
+
+ CRITICAL_SECTION m_crit;
+
+#if (TODO)
+ UINT m_uRefCount;
+ enum {CSYNC_UNLOADED, CSYNC_LOADING, CSYNC_UNLOADING, CSYNC_UNLOADED}
+ m_eState;
+ SLIST* pUnloadEventList;
+#endif // TODO
+
+};
+
+
+#endif // _SYNC_H_
diff --git a/private/unimodem/new/mic/tdev.cpp b/private/unimodem/new/mic/tdev.cpp
new file mode 100644
index 000000000..2e32384f1
--- /dev/null
+++ b/private/unimodem/new/mic/tdev.cpp
@@ -0,0 +1,84 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// TDEV.CPP -- Component tests for classes:
+// CIndDevice
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+#include "common.h"
+#include "ini.h"
+#include "inf.h"
+#include "dev.h"
+#include "test.h"
+
+#define SIMPLE 0
+#define COMPLEX 1
+#define ACTUAL 2
+
+//#define TEST_TYPE (SIMPLE)
+#define TEST_TYPE (COMPLEX)
+//#define TEST_TYPE (ACTUAL)
+
+
+#if (TEST_TYPE==SIMPLE)
+#elif (TEST_TYPE==COMPLEX)
+#elif (TEST_TYPE==ACTUAL)
+#endif
+
+int main_tdev(int argc, char * argv[])
+{
+ CInfFile *pInf= new CInfFile();
+ CInfDevice *pDev = new CInfDevice(NULL);
+
+ const CInfManufacturerEntry *pManuE = NULL;
+ const CInfManufacturerSection *pManuS = NULL;
+ const CInfModelEntry *pModelE = NULL;
+
+ //__try
+ {
+ //__try
+ {
+ if (pInf->Load("test.inf"))
+ {
+ pManuE = pInf->GetFirstManufacturerEntry();
+ }
+ if (pManuE)
+ {
+ pManuS = pManuE->GetManufacturerSection();
+ }
+ if (pManuS)
+ {
+ pModelE = pManuS->GetFirstModelEntry();
+ }
+ if (pModelE)
+ {
+ if (pDev->Load(pInf, pManuE, pModelE))
+ {
+ pDev->Dump();
+ pDev->WriteInf(TEXT("out.inf"));
+ }
+ }
+
+ }
+ //__finally
+ {
+ // printf("in finally\n");
+ if (pDev) {pDev->Unload(); delete pDev; pDev=NULL;}
+ if (pInf) {pInf->Unload(); delete pInf; pInf=NULL;}
+ }
+ }
+ //__except(printf("in filter\n"), EXCEPTION_EXECUTE_HANDLER)
+ if (0) {
+ printf("in except\n");
+ ASSERT(FALSE);
+ }
+
+
+ return 0;
+}
diff --git a/private/unimodem/new/mic/test.h b/private/unimodem/new/mic/test.h
new file mode 100644
index 000000000..d5064c9d0
--- /dev/null
+++ b/private/unimodem/new/mic/test.h
@@ -0,0 +1,2 @@
+int main_tsym(int argc, char * argv[]);
+int main_tdev(int argc, char * argv[]);
diff --git a/private/unimodem/new/mic/tsym.cpp b/private/unimodem/new/mic/tsym.cpp
new file mode 100644
index 000000000..ab6712aa5
--- /dev/null
+++ b/private/unimodem/new/mic/tsym.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// TSYM.CPP -- Component tests for classes:
+// CInfSymbolTable
+// CInfSymbol
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+#include "common.h"
+#include "test.h"
+
+
+#define SIMPLE 0
+#define COMPLEX 1
+#define ACTUAL 2
+
+//#define TEST_TYPE (SIMPLE)
+#define TEST_TYPE (COMPLEX)
+//#define TEST_TYPE (ACTUAL)
+
+extern const TCHAR *rgpszSimpleResp[];
+extern const TCHAR *rgpszComplexResp[];
+extern const TCHAR *rgpszActualResp[];
+
+
+#if (TEST_TYPE==SIMPLE)
+# define TEST_RESP_ARRAY rgpszSimpleResp
+#elif (TEST_TYPE==COMPLEX)
+# define TEST_RESP_ARRAY rgpszComplexResp
+#elif (TEST_TYPE==ACTUAL)
+# define TEST_RESP_ARRAY rgpszActualResp
+#endif
+
+static const TCHAR **rgpchStrings = TEST_RESP_ARRAY;
+
+int main_tsym(int argc, char * argv[])
+{
+ const TCHAR **pch = NULL;
+
+ for (pch = rgpchStrings; *pch; pch++)
+ {
+ const CInfSymbol *pSym = gSymtab.Lookup(*pch, TRUE);
+ if (pSym) {pSym->Dump(); pSym->Release(); pSym=0;}
+ }
+
+ printf("+++\n");
+
+ for (pch = rgpchStrings; *pch; pch++)
+ {
+ const CInfSymbol *pSym = gSymtab.Lookup(*pch, TRUE);
+ if (pSym) {pSym->Dump(); pSym->Release(); pSym=0;}
+ }
+
+ printf("+++\n");
+
+ gSymtab.Dump();
+
+ return 0;
+}
diff --git a/private/unimodem/new/readme.txt b/private/unimodem/new/readme.txt
new file mode 100644
index 000000000..6ac5b68ed
--- /dev/null
+++ b/private/unimodem/new/readme.txt
@@ -0,0 +1,11 @@
+[match] Fast response matching code
+ 3/24/96 JOSEPHJ Code which builds a tree given a list of possible modem
+ responses and uses this tree to determine how many characters
+ to read and to match the characters read against one of the
+ possible responses.
+
+[slot]
+ 3/24/96 JOSEPHJ Code that implements basic IPC for some external process
+ to notify unimodem of external events. It is implemented using
+ one mailslot and one semaphore, and allows arbitary framed data
+ to be sent to the unimode process.
diff --git a/private/unimodem/new/slot/client.c b/private/unimodem/new/slot/client.c
new file mode 100644
index 000000000..c77d385ee
--- /dev/null
+++ b/private/unimodem/new/slot/client.c
@@ -0,0 +1,47 @@
+//****************************************************************************
+//
+// Module: UNIMDM
+// File: SLOT.C
+//
+// Copyright (c) 1992-1996, Microsoft Corporation, all rights reserved
+//
+// Revision History
+//
+//
+// 3/25/96 JosephJ Created
+//
+//
+// Description: Implements the unimodem TSP notification mechanism:
+// The higher level API: UnimodemNotifyTSP()
+//
+//****************************************************************************
+#define UNICODE
+#include <windows.h>
+#include "slot.h"
+#include "..\..\inc\tspnotif.h"
+
+
+BOOL WINAPI UnimodemNotifyTSP(PNOTIFICATION_FRAME pnf)
+{
+ BOOL fRet=FALSE;
+ HNOTIFICATION hN=0;
+
+ if (pnf->dwSig!=dwNFRAME_SIG || pnf->dwSize<sizeof(*pnf) ||
+ pnf->dwSize>MAX_NOTIFICATION_FRAME_SIZE)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ goto end;
+ }
+
+ hN = notifCreate(FALSE, SLOTNAME_UNIMODEM_NOTIFY_TSP, 0, 0);
+
+ if (hN)
+ {
+ fRet = notifWriteMsg(hN, (LPBYTE) pnf, pnf->dwSize);
+ notifFree(hN); hN=0;
+ }
+
+end:
+
+ return fRet;
+}
diff --git a/private/unimodem/new/slot/main.c b/private/unimodem/new/slot/main.c
new file mode 100644
index 000000000..b60d85f5a
--- /dev/null
+++ b/private/unimodem/new/slot/main.c
@@ -0,0 +1,514 @@
+//****************************************************************************
+//
+// Module: UNIMDM
+// File: MAIN.C
+//
+// Copyright (c) 1992-1996, Microsoft Corporation, all rights reserved
+//
+// Revision History
+//
+//
+// 3/25/96 JosephJ Created
+//
+//
+// Description: Test the notification support.
+// Tests both the higher-level api (UnimodemNotifyTSP)
+// and the lower level notifXXX apis. The latter
+// are tested later on in the file, and the header file
+// "slot.h" is included there, not at the start of this
+// file, because the higher-level tests do not need to
+// include "slot.h"
+//
+//****************************************************************************
+#define UNICODE
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "..\..\inc\tspnotif.h"
+
+#define SLOTNAME SLOTNAME_UNIMODEM_NOTIFY_TSP
+
+#define TSPI_NOTIF_A 101
+#define TSPI_NOTIF_B 102
+#define TSPI_NOTIF_QUIT 999
+
+#define ASSERT(_c) \
+ ((_c) ? 0: DPRINTF2("Assertion failed in %s:%d\n", __FILE__, __LINE__))
+#define DPRINTF(_fmt) printf(_fmt)
+#define DPRINTF1(_fmt,_arg) printf(_fmt,_arg)
+#define DPRINTF2(_fmt,_arg,_arg2) printf(_fmt,_arg,_arg2)
+#define DPRINTF3(_fmt,_arg,_arg2,_arg3) printf(_fmt,_arg,_arg2,_arg3)
+
+BOOL InitGlobals(int argc, char *argv[]);
+void Server(void);
+void Client_LL(void); // LowLevel -- calls notif* apis
+void Client_HL(void); // HighLevel -- calls UnimodemNotifyTSP
+void ProcessFrame(PNOTIFICATION_FRAME pnf);
+BOOL ValidateFrame(PNOTIFICATION_FRAME pnf, DWORD dwTrueSize);
+BOOL ReadFrame_UI(PNOTIFICATION_FRAME pnf, DWORD dwcbMax);
+BOOL ReadFrame_Auto(PNOTIFICATION_FRAME pnf, DWORD dwcbMax);
+
+#define READFRAME(_pnf, _max) ReadFrame_Auto(_pnf, _max)
+//#define READFRAME(_pnf, _max) ReadFrame_UI(_pnf, _max)
+
+//#define CLIENT() Client_LL()
+#define CLIENT() Client_HL()
+
+
+BOOL InitFrame_CplReEnum(PNOTIFICATION_FRAME pnf, DWORD dwcbMax, DWORD dwCount);
+BOOL InitFrame_CplChangeDCC(PNOTIFICATION_FRAME, DWORD, DWORD);
+BOOL InitFrame_Simple(PNOTIFICATION_FRAME pnf, DWORD dwcbMax, DWORD dwCount);
+
+#define NOTIF_CPL_REENUM 1
+#define NOTIF_CPL_CHANGE_DCC 2
+#define INIT_TYPE NOTIF_CPL_CHANGE_DCC
+
+#if (INIT_TYPE==NOTIF_CPL_REENUM)
+ #define INIT_FRAME InitFrame_CplReEnum
+#elif (INIT_TYPE==NOTIF_CPL_CHANGE_DCC)
+ #define INIT_FRAME InitFrame_CplChangeDCC
+#else
+ #define INIT_FRAME InitFrame_Simple
+#endif
+
+struct
+{
+ BOOL fQuit;
+ BOOL fServer;
+
+} gMain;
+
+int __cdecl main(int argc, char *argv[])
+{
+ // init globals
+ if (!InitGlobals(argc, argv)) goto end;
+
+ if (gMain.fServer) Server();
+ else CLIENT();
+
+end:
+ return 0;
+}
+
+BOOL InitGlobals(int argc, char *argv[])
+{
+ BOOL fRet=FALSE;
+ char *pc;
+
+ if (argc!=2) goto end;
+
+ pc=argv[1];
+ if (*pc!='-' && *pc!='/') goto end;
+ *pc++;
+ switch(*pc++)
+ {
+ case 's':
+ gMain.fServer=TRUE;
+ break;
+ case 'c':
+ break;
+ default:
+ goto end;
+ }
+
+ DPRINTF1("Ha!%d\n", gMain.fServer);
+ fRet=TRUE;
+
+end:
+ return fRet;
+}
+
+
+void ProcessFrame(PNOTIFICATION_FRAME pnf)
+{
+ if (pnf->dwSig!=dwNFRAME_SIG)
+ {
+ ASSERT(FALSE);
+ return;
+ }
+
+ switch(pnf->dwType)
+ {
+ case TSPI_NOTIF_A:
+ DPRINTF("Got NOTIF_A\n");
+ break;
+ case TSPI_NOTIF_B:
+ DPRINTF("Got NOTIF_B\n");
+ break;
+ case TSPI_NOTIF_QUIT:
+ DPRINTF("Got NOTIF_QUIT, Quitting...\n");
+ gMain.fQuit=TRUE;
+ break;
+ default:
+ DPRINTF1("Got unknown notif type 0x%lu. Quitting\n", pnf->dwType);
+ gMain.fQuit=TRUE;
+ break;
+ }
+}
+
+
+void Client_HL(void)
+{
+ struct {
+ DWORD dw0;
+ DWORD dw1;
+ BYTE rgb[256];
+ } EmptyFr;
+ PNOTIFICATION_FRAME pnf = (PNOTIFICATION_FRAME) &EmptyFr;
+ DWORD dwcbMax=sizeof(EmptyFr);
+ DWORD dwcbServerMax=0;
+
+ // Get input from user, submit request
+ pnf->dwSig=pnf->dwSize=0;
+ while(READFRAME(pnf, dwcbMax))
+ {
+ ASSERT(pnf->dwSig==dwNFRAME_SIG);
+ if (!UnimodemNotifyTSP(pnf))
+ {
+ DPRINTF1("UnimodemNotifyTSP(-) failed. GetLastError=0x%lx. Exiting.\n",
+ (unsigned long) GetLastError());
+ // break;
+ }
+ pnf->dwSig=pnf->dwSize=0;
+ }
+
+ return;
+}
+
+BOOL ReadFrame_UI(PNOTIFICATION_FRAME pnf, DWORD dwcbMax)
+{
+ BOOL fRet=FALSE;
+ char rgchTmp[128];
+ DWORD dwType=0;
+ BOOL fInputError=FALSE;
+
+ if (dwcbMax<sizeof(*pnf))
+ {
+ DPRINTF1("ReadFrame: input frame too small (%lu)\n",
+ dwcbMax);
+ goto end;
+ }
+
+ fInputError=TRUE;
+
+ if (scanf("%s", rgchTmp)==1)
+ {
+ if (lstrlenA(rgchTmp)==1)
+ {
+ fInputError=FALSE;
+ switch(*rgchTmp)
+ {
+ case 'a':
+ DPRINTF("sending NOTIF_A\n");
+ dwType = TSPI_NOTIF_A;
+ break;
+ case 'b':
+ DPRINTF("sending NOTIF_B\n");
+ dwType = TSPI_NOTIF_B;
+ break;
+ case 'q':
+ DPRINTF("sending NOTIF_QUIT\n");
+ dwType = TSPI_NOTIF_QUIT;
+ break;
+ case 'x':
+ DPRINTF("Exiting\n");
+ break;
+ default:
+ fInputError=TRUE;
+ break;
+ }
+ }
+ }
+
+ if (dwType)
+ {
+ pnf->dwSig=dwNFRAME_SIG;
+ pnf->dwSize=sizeof(*pnf);
+ pnf->dwType=dwType;
+ fRet=TRUE;
+ }
+
+ if (fInputError)
+ {
+ DPRINTF("Bad/no input. Quitting...\n");
+ }
+
+end:
+ return fRet;
+}
+
+BOOL ReadFrame_Auto(PNOTIFICATION_FRAME pnf, DWORD dwcbMax)
+{
+ static dwCount=0;
+ DWORD dwSleepAmount;
+ BOOL fRet=FALSE;
+
+ if (!dwCount++)
+ {
+ srand((ULONG) GetTickCount());
+ }
+
+# define MAXSLEEP 10000
+ dwSleepAmount = ((DWORD) rand()) % MAXSLEEP;
+
+ Sleep(dwSleepAmount);
+
+ // Quit after 100 -- currently disabled.
+ //if (dwCount>100) goto end;
+
+ fRet = INIT_FRAME(pnf, dwcbMax, dwCount);
+
+// end:
+ return fRet;
+}
+
+BOOL ValidateFrame(PNOTIFICATION_FRAME pnf, DWORD dwTrueSize)
+{
+ return (pnf && pnf->dwSig==dwNFRAME_SIG && pnf->dwSize>=sizeof(*pnf) &&
+ pnf->dwSize==dwTrueSize &&
+ pnf->dwSize<=MAX_NOTIFICATION_FRAME_SIZE);
+}
+
+// ----------------------------- TEST INTERNAL STUFF --------------------
+#include "slot.h"
+void ProcessNotification(HNOTIFICATION hN);
+
+// Server Thread
+void Server(void)
+{
+ HNOTIFICATION hN=0;
+ DWORD dwLastErr=0;
+ HANDLE hObj=NULL;
+
+ // Create slot
+ hN = notifCreate(TRUE, SLOTNAME, MAX_NOTIFICATION_FRAME_SIZE, 100);
+ if (!hN)
+ {
+ DPRINTF3("notifServerCreate(\"%s\", %lu) failed. GetLastError=0x%lx.\n",
+ (LPCSTR) SLOTNAME,
+ (unsigned long) MAX_NOTIFICATION_FRAME_SIZE,
+ (unsigned long) GetLastError());
+ goto end;
+ }
+ if (!(hObj=notifGetObj(hN)))
+ {
+ DPRINTF("notifGetObj failed\n");
+ goto end;
+ }
+
+ // Wait and process messages
+ while(!gMain.fQuit)
+ {
+ UINT u=WaitForSingleObject(hObj, 5000);
+ if (u==WAIT_OBJECT_0)
+ {
+ ProcessNotification(hN);
+ //Sleep(1000);
+ }
+ }
+
+end:
+ if (hN)
+ {
+ notifFree(hN); hN=0;
+ }
+ ;
+}
+
+
+
+void ProcessNotification(HNOTIFICATION hN)
+{
+ BOOL fRet;
+ struct {
+ DWORD dw0;
+ DWORD dw1;
+ BYTE rgb[256];
+ } EmptyFr;
+ DWORD dwcbMax=sizeof(EmptyFr);
+ DWORD dwcbRead=0;
+
+ PNOTIFICATION_FRAME pnf = (PNOTIFICATION_FRAME) &EmptyFr;
+
+ pnf->dwSig=pnf->dwSize=0;
+
+ fRet=notifReadMsg(hN, (LPBYTE) pnf, dwcbMax, &dwcbRead);
+ if (!fRet)
+ {
+ DPRINTF1("notifReadFrame(...) failed. GetLastError=0x%lx.\n",
+ (unsigned long) GetLastError());
+ goto end;
+ }
+
+ // Verify validity of msg...
+ if (!ValidateFrame(pnf, dwcbRead))
+ {
+ DPRINTF("Invalid frame\n");
+ goto end;
+ }
+ ASSERT(pnf->dwSig==dwNFRAME_SIG);
+ ASSERT(pnf->dwSize<=dwcbMax);
+ ASSERT(pnf->dwSize<=MAX_NOTIFICATION_FRAME_SIZE);
+
+ ProcessFrame(pnf);
+
+end:
+ return;
+}
+
+void Client_LL(void)
+{
+ HNOTIFICATION hN=0;
+ DWORD dwLastErr=0;
+ struct {
+ DWORD dw0;
+ DWORD dw1;
+ BYTE rgb[256];
+ } EmptyFr;
+ PNOTIFICATION_FRAME pnf = (PNOTIFICATION_FRAME) &EmptyFr;
+ DWORD dwcbMax=sizeof(EmptyFr);
+ DWORD dwcbServerMax=0;
+
+ // Open slot
+ hN = notifCreate(FALSE, SLOTNAME, 0, 0);
+ if (!hN)
+ {
+ DPRINTF2("notifClientOpen(\"%s\", -) failed. GetLastError=0x%lx.\n",
+ (LPCSTR) SLOTNAME,
+ (unsigned long) GetLastError());
+ goto end;
+ }
+ dwcbServerMax=notifGetMaxSize(hN);
+
+ if (dwcbServerMax<dwcbMax)
+ {
+ DPRINTF2("Warning -- server max size = %lu; Our max=%lu\n",
+ dwcbServerMax,
+ dwcbMax);
+ }
+
+ // Get input from user, submit request
+ pnf->dwSig=pnf->dwSize=0;
+ while(READFRAME(pnf, dwcbMax))
+ {
+ ASSERT(pnf->dwSig==dwNFRAME_SIG);
+ if (!notifWriteMsg(hN, (LPBYTE)pnf, pnf->dwSize))
+ {
+ DPRINTF1("notifWriteFrame(-) failed. GetLastError=0x%lx. Exiting.\n",
+ (unsigned long) GetLastError());
+ break;
+ }
+ pnf->dwSig=pnf->dwSize=0;
+ }
+
+end:
+ if (hN)
+ {
+ notifFree(hN); hN=0;
+ }
+}
+
+BOOL InitFrame_Simple(PNOTIFICATION_FRAME pnf, DWORD dwcbMax, DWORD dwCount)
+{
+ BOOL fRet=FALSE;
+ DWORD dwType=0;
+ DWORD dwFlags=0;
+
+ if (dwcbMax<sizeof(*pnf))
+ {
+ DPRINTF1("ReadFrame: input frame too small (%lu)\n",
+ dwcbMax);
+ goto end;
+ }
+
+ if (dwCount&0x1)
+ {
+ DPRINTF("sending NOTIF_A\n");
+ dwType = TSPI_NOTIF_A;
+ }
+ else
+ {
+ DPRINTF("sending NOTIF_B\n");
+ dwType = TSPI_NOTIF_B;
+ }
+
+ pnf->dwSig=dwNFRAME_SIG;
+ pnf->dwSize=sizeof(*pnf);
+ pnf->dwType=dwType;
+ pnf->dwFlags=dwFlags;
+ fRet=TRUE;
+
+end:
+ return fRet;
+}
+
+BOOL InitFrame_CplReEnum(PNOTIFICATION_FRAME pnf, DWORD dwcbMax, DWORD dwCount)
+{
+ BOOL fRet=FALSE;
+ DWORD dwType=0;
+ DWORD dwFlags=0;
+
+ if (dwcbMax<sizeof(*pnf))
+ {
+ DPRINTF1("ReadFrame: input frame too small (%lu)\n",
+ dwcbMax);
+ goto end;
+ }
+
+ dwType = TSPNOTIF_TYPE_CPL;
+ dwFlags = fTSPNOTIF_FLAG_CPL_REENUM;
+
+ pnf->dwSig=dwNFRAME_SIG;
+ pnf->dwSize=sizeof(*pnf);
+ pnf->dwType=dwType;
+ pnf->dwFlags=dwFlags;
+ fRet=TRUE;
+
+end:
+ return fRet;
+}
+
+BOOL InitFrame_CplChangeDCC
+(
+ PNOTIFICATION_FRAME pnf,
+ DWORD dwcbMax,
+ DWORD dwCount
+)
+{
+ BOOL fRet=FALSE;
+ DWORD dwType=0;
+ DWORD dwFlags=0;
+ LPCTSTR rglpctszNames[3] =
+ {
+ TEXT("Zoom Fax Modem V.34X Model 470"),
+ TEXT("Zoom Fax Modem V.34X Model 470 #2"),
+ TEXT("blah")
+ };
+ LPCTSTR lpctszFriendlyName = rglpctszNames[dwCount%3];
+ UINT u = lstrlen(lpctszFriendlyName);
+
+ if (dwcbMax< (sizeof(*pnf)+(u+1)*sizeof(TCHAR)))
+ {
+ DPRINTF1("ReadFrame: input frame too small (%lu)\n",
+ dwcbMax);
+ goto end;
+ }
+
+ pnf->dwSig = dwNFRAME_SIG;
+ pnf->dwSize = dwcbMax;
+ pnf->dwType = TSPNOTIF_TYPE_CPL;
+ pnf->dwFlags = fTSPNOTIF_FLAG_CPL_DEFAULT_COMMCONFIG_CHANGE;
+
+ #ifdef UNICODE
+ pnf->dwFlags |= fTSPNOTIF_FLAG_UNICODE;
+ #endif // UNICODE
+
+ lstrcpy((TCHAR *)pnf->rgb, lpctszFriendlyName);
+
+ printf("Sending ChangeDCC[%s]\n", lpctszFriendlyName);
+
+ fRet=TRUE;
+
+end:
+ return fRet;
+}
diff --git a/private/unimodem/new/slot/makefile b/private/unimodem/new/slot/makefile
new file mode 100644
index 000000000..6ee4f43fa
--- /dev/null
+++ b/private/unimodem/new/slot/makefile
@@ -0,0 +1,6 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the components of NT OS/2
+#
+!INCLUDE $(NTMAKEENV)\makefile.def
diff --git a/private/unimodem/new/slot/sec.c b/private/unimodem/new/slot/sec.c
new file mode 100644
index 000000000..786e2b5ed
--- /dev/null
+++ b/private/unimodem/new/slot/sec.c
@@ -0,0 +1,169 @@
+//****************************************************************************
+//
+// Module: UNIMDM
+// File: SEC.C
+//
+// Copyright (c) 1992-1996, Microsoft Corporation, all rights reserved
+//
+// Revision History
+//
+//
+// 3/27/96 JosephJ Created
+//
+//
+// Description: Security-related helper functions
+//
+//****************************************************************************
+#define UNICODE
+#include <windows.h>
+#include <stdio.h>
+#include "sec.h"
+
+#define DPRINTF2(_format, _a1, _a2) printf(_format, _a1, _a2)
+
+#define ASSERT(_c) \
+ ((_c) ? 0: DPRINTF2("Assertion failed in %s:%d\n", __FILE__, __LINE__))
+
+//****************************************************************************
+// Description: This procedure will allocate and initialize a security
+// descriptor with the specificed attributes.
+//
+// Returns: pointer to an allocated and initialized security descriptor.
+// If NULL, GetLastError() will return the appropriate error code.
+//
+// History:
+// 3/27/96 JosephJ Created
+//****************************************************************************/
+//
+PSECURITY_DESCRIPTOR AllocateSecurityDescriptor (
+ PSID_IDENTIFIER_AUTHORITY pSIA,
+ DWORD dwRID,
+ DWORD dwRights,
+ PSID pSidOwner,
+ PSID pSidGroup
+ )
+{
+ PSID pObjSid = NULL;
+ PACL pDacl = NULL;
+ PSECURITY_DESCRIPTOR pSD = NULL;
+
+ pSD = LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH+256);
+
+ if (!pSD) goto end_fail;
+
+ // Set up the SID for the admins that will be allowed to have
+ // access. This SID will have 1 sub-authority
+ if (!AllocateAndInitializeSid(
+ pSIA,
+ 1,
+ dwRID, 0, 0, 0, 0, 0, 0, 0,
+ &pObjSid
+ ))
+ {
+ goto end_fail;
+ }
+
+ // Set up the DACL that will allow all processes with the above SID
+ // access specified in dwRights. It should be large enough to hold all ACEs.
+ //
+ {
+ DWORD cbDaclSize = sizeof(ACCESS_ALLOWED_ACE) +
+ GetLengthSid(pObjSid) +
+ sizeof(ACL);
+
+ pDacl = (PACL)LocalAlloc( LPTR, cbDaclSize );
+ if (!pDacl)
+ {
+ goto end_fail;
+ }
+
+ if ( !InitializeAcl( pDacl, cbDaclSize, ACL_REVISION2 ) )
+ {
+ goto end_fail;
+ }
+ }
+
+ // Add the ACE to the DACL
+ //
+ if ( !AddAccessAllowedAce( pDacl, ACL_REVISION2, dwRights, pObjSid))
+ {
+ goto end_fail;
+ }
+
+ // Create the security descriptor and put the DACL in it.
+ //
+ if ( !InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION ))
+ {
+ goto end_fail;
+ }
+
+ if ( !SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE ) )
+ {
+ goto end_fail;
+ }
+
+ // Set owner for the descriptor
+ //
+ if ( !SetSecurityDescriptorOwner( pSD, pSidOwner, FALSE) )
+ {
+ goto end_fail;
+ }
+
+ // Set group for the descriptor
+ //
+ if ( !SetSecurityDescriptorGroup( pSD, pSidGroup, FALSE) )
+ {
+ goto end_fail;
+ }
+
+ FreeSid(pObjSid);
+ return pSD;
+
+
+end_fail:
+ {
+ DWORD dwRetCode = GetLastError();
+
+ if (pDacl) { LocalFree(pDacl); pDacl=0;}
+
+ if (pObjSid) { FreeSid(pObjSid); pObjSid=0;}
+
+ if (pSD) { LocalFree(pSD); pSD=0;}
+
+ SetLastError(dwRetCode);
+ }
+ return NULL;
+}
+
+
+//****************************************************************************
+// Description: Frees a security descriptor previously allocated by
+// AllocateSecurityDescriptor.
+//
+// History:
+// 3/27/96 JosephJ Created
+//****************************************************************************/
+void FreeSecurityDescriptor(PSECURITY_DESCRIPTOR pSD)
+{
+ PSID pObjSid = NULL;
+ PACL pDacl = NULL;
+ BOOL fGotAcl=FALSE, fByDefault=FALSE;
+
+
+ // Free Dacl, if user had allocated it.
+ if (GetSecurityDescriptorDacl(pSD, &fGotAcl, &pDacl, &fByDefault ))
+ {
+ if (fGotAcl && !fByDefault && pDacl)
+ {
+ LocalFree(pDacl);
+ }
+ }
+ else
+ {
+ ASSERT(FALSE); // We should not be calling this function with such
+ // an pSD.
+ }
+
+ LocalFree(pSD);
+
+}
diff --git a/private/unimodem/new/slot/sec.h b/private/unimodem/new/slot/sec.h
new file mode 100644
index 000000000..9ec615f7e
--- /dev/null
+++ b/private/unimodem/new/slot/sec.h
@@ -0,0 +1,24 @@
+//****************************************************************************
+//
+// Module: UNIMDM
+// File: SEC.H
+//
+// Copyright (c) 1992-1996, Microsoft Corporation, all rights reserved
+//
+// Revision History
+//
+//
+// 3/27/96 JosephJ Created
+//
+//
+// Description: Security-related helper functions
+//
+//****************************************************************************
+PSECURITY_DESCRIPTOR AllocateSecurityDescriptor (
+ PSID_IDENTIFIER_AUTHORITY pSIA,
+ DWORD dwRID,
+ DWORD dwRights,
+ PSID pSidOwner,
+ PSID pSidGroup
+ );
+void FreeSecurityDescriptor(PSECURITY_DESCRIPTOR pSD);
diff --git a/private/unimodem/new/slot/slot.c b/private/unimodem/new/slot/slot.c
new file mode 100644
index 000000000..35236c439
--- /dev/null
+++ b/private/unimodem/new/slot/slot.c
@@ -0,0 +1,486 @@
+//****************************************************************************
+//
+// Module: UNIMDM
+// File: SLOT.C
+//
+// Copyright (c) 1992-1996, Microsoft Corporation, all rights reserved
+//
+// Revision History
+//
+//
+// 3/25/96 JosephJ Created
+//
+//
+// Description: Implements the unimodem TSP notification mechanism:
+// The lower level (notifXXXX) APIs
+//
+//****************************************************************************
+
+#define UNICODE
+#include <windows.h>
+#include <stdio.h>
+#include "slot.h"
+#include "sec.h"
+
+#define T(_str) TEXT(_str)
+
+#define ASSERT(_c) \
+ ((_c) ? 0: DPRINTF2("Assertion failed in %s:%d\n", __FILE__, __LINE__))
+#define DPRINTF(_fmt) printf(_fmt)
+#define DPRINTF1(_fmt,_arg) printf(_fmt,_arg)
+#define DPRINTF2(_fmt,_arg,_arg2) printf(_fmt,_arg,_arg2)
+#define DPRINTF3(_fmt,_arg,_arg2,_arg3) printf(_fmt,_arg,_arg2,_arg3)
+
+#define fNOTIF_STATE_DEINIT 0
+#define fNOTIF_STATE_INIT_SERVER 1
+#define fNOTIF_STATE_INIT_CLIENT 2
+
+#define IS_SERVER(_pns) ((_pns)->dwState==fNOTIF_STATE_INIT_SERVER)
+#define IS_CLIENT(_pns) ((_pns)->dwState==fNOTIF_STATE_INIT_CLIENT)
+
+
+// The following help define the fully-qualified mailslot and semaphore names.
+#define dwNOTIFSTATE_SIG (0x53CB31A0L)
+#define FULLNAME_TEMPLATE T("--.-mailslot-%08lx-%s")
+
+// Keeps the state of a notification (either client or server).
+// It is cast to a DWORD to form the handle returned by notifCreate()
+typedef struct
+{
+ DWORD dwSig; // should be dwNOTIFSTATE_SIG when inited
+ HANDLE hSem;
+ HANDLE hSlot;
+ DWORD dwState;
+ DWORD dwcbMax;
+
+} NOTIFICATION_STATE, *PNOTIFICATION_STATE;
+
+DWORD inotif_server_create(PNOTIFICATION_STATE pns, LPTSTR lptsz,
+ DWORD dwMaxSize,
+ DWORD dwMaxPending);
+DWORD inotif_client_open(PNOTIFICATION_STATE pns, LPTSTR lptsz);
+PNOTIFICATION_STATE inotif_getstate(HNOTIFICATION hn);
+
+
+//****************************************************************************
+// Function: Creates a notification object -- either as server or client.
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+HNOTIFICATION notifCreate(
+ BOOL fServer, // TRUE ==> Server
+ LPCTSTR lptszName, // Name to associate with this object
+ DWORD dwMaxSize, // Max size of frames written/read
+ // (Ignored if (!fServer))
+ DWORD dwMaxPending // Max number of notification frames allowed
+ // to be pending. (Ignored if (!fServer))
+)
+{
+ PNOTIFICATION_STATE pns=NULL;
+ HNOTIFICATION hn=0;
+ TCHAR rgtchTmp[MAX_NOTIFICATION_NAME_SIZE+23];
+ UINT u = lstrlen(lptszName);
+ DWORD dwErr=0;
+
+ // Format of semaphore name is --.-mailslot-sig-name
+ // Example: "--.-mailslot-8cb45651-unimodem"
+ // To create the equivalent mailslot, we run through and change
+ // all '-' to '\'s (if the name containts '-', they will get converted --
+ // big deal.)
+ if ((u+23)>(sizeof(rgtchTmp)/sizeof(TCHAR))) // 13(prefix)+ 9(sig-) +1(null)
+ {
+ dwErr = ERROR_INVALID_PARAMETER;
+ goto end;
+ }
+
+ pns=LocalAlloc(LPTR, sizeof(*pns));
+ if (!pns) goto end;
+
+ wsprintf(rgtchTmp,FULLNAME_TEMPLATE,
+ (unsigned long) dwNOTIFSTATE_SIG,
+ lptszName);
+
+ DPRINTF1("Semaphore name = [%s]\n", rgtchTmp);
+
+ if (fServer) dwErr = inotif_server_create(pns, rgtchTmp,
+ dwMaxSize, dwMaxPending);
+ else dwErr = inotif_client_open(pns, rgtchTmp);
+
+ if (dwErr) goto end;
+ pns->dwSig=dwNOTIFSTATE_SIG;
+ hn = (HNOTIFICATION)pns;
+
+end:
+ if (!hn)
+ {
+ if (!dwErr) dwErr=GetLastError();
+ if (pns) LocalFree(pns);
+ SetLastError(dwErr);
+ }
+ return hn;
+}
+
+//****************************************************************************
+// Function: Free a notification object
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+void notifFree(HNOTIFICATION hn)
+{
+ PNOTIFICATION_STATE pns = inotif_getstate(hn);
+ if (hn)
+ {
+ pns->dwSig=0;
+ CloseHandle(pns->hSem); pns->hSem=0;
+ CloseHandle(pns->hSlot); pns->hSlot=0;
+ LocalFree(pns);
+ }
+}
+
+//****************************************************************************
+// Function: Retrieve the synchronization object handle accociated with
+// the notiication object. NOTE: This handle is valid until
+// the notification object is alive. It must NOT be deleted
+// externally. Must be a server object.
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+HANDLE notifGetObj(HNOTIFICATION hn)
+{
+ PNOTIFICATION_STATE pns = inotif_getstate(hn);
+ if (pns && IS_SERVER(pns))
+ {
+ return pns->hSem;
+ }
+ else if (pns)
+ {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return NULL;
+ }
+ else
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return NULL;
+ }
+}
+
+//****************************************************************************
+// Function: Retrieves the max allowable size of the frame (server only)
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+DWORD notifGetMaxSize(HNOTIFICATION hn)
+{
+ PNOTIFICATION_STATE pns = inotif_getstate(hn);
+ if (pns && IS_SERVER(pns))
+ {
+ return pns->dwcbMax;
+ }
+ else
+ {
+ if (pns)
+ {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ }
+ else
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ }
+ return 0;
+ }
+}
+
+
+//****************************************************************************
+// Function: (Server only) Reads a notification msg, if any. Does not block.
+// A return value of FALSE and a GetLastError value of ERROR_NO_DATA
+// indicates that no frame was available..
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+BOOL notifReadMsg(HNOTIFICATION hn,
+ LPBYTE lpb,
+ DWORD dwcbMax,
+ LPDWORD lpdwRead)
+{
+ PNOTIFICATION_STATE pns = inotif_getstate(hn);
+ BOOL fRet=FALSE;
+ *lpdwRead=0;
+
+ if (pns)
+ {
+ DWORD dwRead=0;
+
+ if(!IS_SERVER(pns))
+ {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ goto end;
+ }
+
+ fRet = ReadFile(pns->hSlot, lpb, dwcbMax, lpdwRead, NULL);
+
+ if (!fRet)
+ {
+ DPRINTF("ReadFile failed!\n");
+ goto end;
+ }
+
+ DPRINTF("Success!\n");
+ fRet=TRUE;
+ }
+ else
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ }
+
+end:
+ return fRet;
+}
+
+
+//****************************************************************************
+// Function: Returns the size of the next frame in the queue. Returns TRUE
+// even if there is no data in the queue -- in this case, *lpdwcb
+// is set to 0. Returns FALSE if there is some other error.
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+BOOL notifGetNextMsgSize(HNOTIFICATION hn, LPDWORD lpdwcb)
+{
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return FALSE;
+}
+
+
+//****************************************************************************
+// Function: (Client side). Write a notification msg.
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+BOOL notifWriteMsg(HNOTIFICATION hn, LPBYTE lpb, DWORD dwcb)
+{
+ PNOTIFICATION_STATE pns = inotif_getstate(hn);
+ BOOL fRet=FALSE;
+
+ if (pns)
+ {
+ DWORD dwWritten=0;
+
+ if(!IS_CLIENT(pns))
+ {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ goto end;
+ }
+
+ fRet = WriteFile(pns->hSlot, lpb, dwcb, &dwWritten, NULL);
+ if (fRet)
+ {
+ fRet=ReleaseSemaphore(pns->hSem,1,NULL);
+ if (!fRet)
+ {
+ DPRINTF("ReleaseSemaphore failed!\n");
+ goto end;
+ }
+ }
+ if (!fRet || dwWritten!=dwcb)
+ {
+ DWORD dwErr = GetLastError();
+ DPRINTF3("WriteFile failed. fRet=%lu; dwWritten=%lu; Err=%lu\n",
+ fRet, dwcb, dwErr);
+ SetLastError(dwErr);
+ goto end;
+ }
+ DPRINTF("notifWriteFrame: success!\n");
+ fRet=TRUE;
+ }
+ else
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ }
+
+end:
+ return fRet;
+}
+
+
+//****************************************************************************
+// Function: (internal) create the notif object -- server side.
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+DWORD inotif_server_create(PNOTIFICATION_STATE pns, LPTSTR lptsz, DWORD dwMaxSize,
+ DWORD dwMaxPending)
+{
+ DWORD dwErr=ERROR_INVALID_PARAMETER;
+ TCHAR c, *pc = lptsz;
+ SID_IDENTIFIER_AUTHORITY siaWorld = SECURITY_WORLD_SID_AUTHORITY;
+ SECURITY_ATTRIBUTES sa, *psa=NULL;
+
+ PSECURITY_DESCRIPTOR pSD = AllocateSecurityDescriptor (
+ &siaWorld,
+ SECURITY_WORLD_RID,
+ STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL
+ | SEMAPHORE_ALL_ACCESS
+ | SEMAPHORE_MODIFY_STATE
+ | GENERIC_READ
+ | GENERIC_WRITE
+ ,
+ NULL,
+ NULL
+ );
+
+ if (!pSD)
+ {
+ DPRINTF1("WARNING:AllocateSecurityDescriptor(-) returns error 0x%lx\n",
+ GetLastError());
+ }
+ else
+ {
+ DPRINTF("AllocateSecurityDescriptor(-) returns SUCCESS\n");
+ sa.nLength = sizeof(sa);
+ sa.bInheritHandle=FALSE;
+ sa.lpSecurityDescriptor = pSD;
+ psa = &sa;
+
+ }
+
+
+ // Create mailslot name -- make sure there are no '\'s
+ while(c=*pc++) {if (c=='\\') pc[-1]='-';}
+ DPRINTF1("Semaphore name = [%s]\n", lptsz);
+
+ // Create Semaphore
+ {
+ pns->hSem=CreateSemaphore(psa, 0, dwMaxPending, lptsz);
+ if (pns->hSem && (dwErr=(GetLastError()==ERROR_ALREADY_EXISTS)))
+ {
+ DPRINTF1("Semaphore %s already exists!\n", lptsz);
+ CloseHandle(pns->hSem);
+ pns->hSem=NULL;
+ }
+ if (!pns->hSem) goto end_fail;
+ }
+
+ // Create mailslot name
+ pc = lptsz;
+ while(c=*pc++) {if (c=='-') pc[-1]='\\';}
+
+ DPRINTF1("Mailslot name = [%s]\n", lptsz);
+
+ // CreateMailSlot -- specify size, zero-delay
+ pns->hSlot=CreateMailslot(lptsz, dwMaxSize, 0, psa);
+ if (!pns->hSlot)
+ {
+ dwErr = GetLastError();
+ CloseHandle(pns->hSem); pns->hSem=0;
+ goto end_fail;
+ }
+
+ DPRINTF("Mailslot created!\n");
+
+ // set state and maxsize
+ pns->dwState=fNOTIF_STATE_INIT_SERVER;
+ pns->dwcbMax=dwMaxSize;
+ dwErr=0;
+ goto end;
+
+end_fail:
+ if (!dwErr) dwErr=GetLastError();
+ if (!dwErr) dwErr=ERROR_INVALID_PARAMETER;
+
+end:
+ if (pSD) {FreeSecurityDescriptor(pSD);}
+ return dwErr;
+}
+
+
+//****************************************************************************
+// Function: (internal) create the notif object -- client side.
+// The server must be already up and running, or we will
+// fail.
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+DWORD inotif_client_open(PNOTIFICATION_STATE pns, LPTSTR lptsz)
+{
+ DWORD dwErr=ERROR_INVALID_PARAMETER;
+ TCHAR c, *pc = lptsz;
+
+ // Create mailslot name -- convert '-' to '\';
+ while(c=*pc++) {if (c=='-') pc[-1]='\\';}
+ DPRINTF1("Mailslot name = [%s]\n", lptsz);
+
+ // Open mailslot ...
+ pns->hSlot=CreateFile(
+ lptsz,
+ GENERIC_WRITE,
+ FILE_SHARE_READ|FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL
+ );
+
+ if (!pns->hSlot)
+ {
+ DPRINTF("Couldn't open mailslot for writing\n");
+ goto end_fail;
+ }
+
+ // Create Semaphore name -- convert '\' to '-';
+ pc=lptsz;
+ while(c=*pc++) {if (c=='\\') pc[-1]='-';}
+ DPRINTF1("Sempahore name = [%s]\n", lptsz);
+
+ pns->hSem=OpenSemaphore(SEMAPHORE_MODIFY_STATE, FALSE, lptsz);
+ //pns->hSem=OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, lptsz);
+ if (!pns->hSem) {
+ DPRINTF("Could not open semaphore\n");
+ dwErr=GetLastError();
+ CloseHandle(pns->hSlot); pns->hSlot=0;
+ goto end_fail;
+ }
+
+ // set state and maxsize
+ pns->dwState=fNOTIF_STATE_INIT_CLIENT;
+ pns->dwcbMax=0; // Apparently you can't get the max size of the mailslot.
+ dwErr=0;
+ goto end;
+
+end_fail:
+ if (!dwErr) dwErr=GetLastError();
+ if (!dwErr) dwErr=ERROR_INVALID_PARAMETER;
+
+end:
+ return dwErr;
+}
+
+//****************************************************************************
+// Function: (internal) validates and converts a handle to a ptr to state.
+//
+// History:
+// 3/25/96 JosephJ Created
+//****************************************************************************/
+PNOTIFICATION_STATE inotif_getstate(HNOTIFICATION hn)
+{
+ if (hn)
+ {
+ PNOTIFICATION_STATE pns= (PNOTIFICATION_STATE) hn;
+ if (pns->dwSig!=dwNOTIFSTATE_SIG)
+ {
+ DPRINTF1("Bad hotification handle 0x%lu\n", hn);
+ ASSERT(FALSE);
+ return NULL;
+ }
+ return pns;
+ }
+ return NULL;
+}
diff --git a/private/unimodem/new/slot/slot.h b/private/unimodem/new/slot/slot.h
new file mode 100644
index 000000000..a8ea4fbe9
--- /dev/null
+++ b/private/unimodem/new/slot/slot.h
@@ -0,0 +1,32 @@
+//****************************************************************************
+//
+// Module: UNIMDM
+// File: SLOT.H
+//
+// Copyright (c) 1992-1996, Microsoft Corporation, all rights reserved
+//
+// Revision History
+//
+//
+// 3/25/96 JosephJ Created
+//
+//
+// Description: Interface to the unimodem TSP notification mechanism:
+// The lower level (notifXXXX) APIs
+//
+//****************************************************************************
+
+#define MAX_NOTIFICATION_NAME_SIZE 256
+
+
+typedef DWORD HNOTIFICATION;
+
+HNOTIFICATION notifCreate(BOOL fServer, LPCTSTR lptszName, DWORD dwMaxSize,
+ DWORD dwMaxPending);
+void notifFree(HNOTIFICATION hn);
+
+HANDLE notifGetObj(HNOTIFICATION hn);
+DWORD notifGetMaxSize(HNOTIFICATION hn);
+BOOL notifReadMsg(HNOTIFICATION hn, LPBYTE lpb, DWORD dwcb, LPDWORD lpdwRead);
+BOOL notifGetNextMsgSize(HNOTIFICATION hn, LPDWORD lpdwcb);
+BOOL notifWriteMsg(HNOTIFICATION hn, LPBYTE lpb, DWORD dwcb);
diff --git a/private/unimodem/new/slot/sources b/private/unimodem/new/slot/sources
new file mode 100644
index 000000000..fb7d59080
--- /dev/null
+++ b/private/unimodem/new/slot/sources
@@ -0,0 +1,27 @@
+MAJORCOMP=net
+MINORCOMP=unimodem
+
+TARGETNAME=tslot
+TARGETPATH=obj
+TARGETTYPE=PROGRAM
+TARGETLIBS=\
+ $(BASEDIR)\public\sdk\lib\*\kernel32.lib \
+ $(BASEDIR)\public\sdk\lib\*\user32.lib
+
+
+INCLUDES=$(BASEDIR)\public\sdk\inc;.
+
+C_DEFINES=-DWINVER=0x0400
+
+USE_CRTDLL=1
+
+SOURCES=slot.c \
+ client.c \
+ sec.c \
+ main.c
+
+UMTYPE=console
+
+!IFNDEF 386_WARNING_LEVEL
+386_WARNING_LEVEL=/W3
+!ENDIF